SQL Stored Procedures och C# Frågor

Permalänk
Medlem

SQL Stored Procedures och C# Frågor

Sitter och gör ett program i C# som ska använda sig av en SQL Databas. I mitt program vill jag kunna visa innehållet som finns i de olika tabellerna, som finns i databasen. Så i princip pratar vi om en helt vanlig Select sats:

Select * from table1

Men om man nu skulle vilja göra den här koden lite mer flexibel så att man kan byta ut table1 mot table2, table3, etc. Eller kanske byta ut "*" mot col1, col2, col3, etc. Hur skulle det kunna tänkas se ut i en Stored Procedure om det ens är möjligt? Eller blir man tvungen att "bygga" sin select sats i programmet för att sedan skicka den till databasen?

Sen har jag två andra frågor, ni får ursäkta om dem är luddigt skrivna men ni kanske kan se vad jag vill göra.

1. Om man har ett program i C# och en SQL Databas som ska använda sig av många bilder (+500), tex Album Covers. Hur skulle man kunna gå tillväga för att hålla koll på alla bilderna om tex 1 bild ska vara kopplat till ett album. Blir det någon historia med med Enums och sen spara värdet i databasen tillsammans med Albumet eller gör man på något annat sätt?

2. Hur brukar man gå tillväga om man ska spara mycket text när man gör ett program i C#. Med mycket text menar jag något i storlek med mitt inlägg.

Permalänk
Medlem
Skrivet av DOC.:

Sitter och gör ett program i C# som ska använda sig av en SQL Databas. I mitt program vill jag kunna visa innehållet som finns i de olika tabellerna, som finns i databasen. Så i princip pratar vi om en helt vanlig Select sats:

Select * from table1

Men om man nu skulle vilja göra den här koden lite mer flexibel så att man kan byta ut table1 mot table2, table3, etc. Eller kanske byta ut "*" mot col1, col2, col3, etc. Hur skulle det kunna tänkas se ut i en Stored Procedure om det ens är möjligt? Eller blir man tvungen att "bygga" sin select sats i programmet för att sedan skicka den till databasen?

Sen har jag två andra frågor, ni får ursäkta om dem är luddigt skrivna men ni kanske kan se vad jag vill göra.

1. Om man har ett program i C# och en SQL Databas som ska använda sig av många bilder (+500), tex Album Covers. Hur skulle man kunna gå tillväga för att hålla koll på alla bilderna om tex 1 bild ska vara kopplat till ett album. Blir det någon historia med med Enums och sen spara värdet i databasen tillsammans med Albumet eller gör man på något annat sätt?

2. Hur brukar man gå tillväga om man ska spara mycket text när man gör ett program i C#. Med mycket text menar jag något i storlek med mitt inlägg.

Det låter som att du behöver en OR-mappare, http://en.wikipedia.org/wiki/Object-relational_mapping.
Du får det "automatiskt" med Entity Framework, http://msdn.microsoft.com/en-us/library/cc716779.aspx.

Det finns mängder med alternativ till detta. Det mest populära har ju varit relationsdatabaser men det finns exempelvis db4o som är en databas som lagrar objekt, http://www.db4o.com/s/csharpdb.aspx. Gratis om din programvara är släppt med GPL (senast jag kollade).

Det går att göra en själv om man vill ha full koll på vad som görs och då tillåter förändringar hur som helst. Det tar ganska lång tid om man inte har gjort det tidigare för att det är så mycket man måste ta hänsyn till. Som sagt, det kan vara ett helt projekt för sig och har man inte tiden så är det lika bra att använda etablerade frameworks för detta.

1. Jag hade löst det med ett Image-objekt och ett Album-objekt och en referens på album-objektet till image-objektet (relationsdatabas) som då blir ett ett-till-ett-relation, med stöd för ett-till-många (dock ej många-till-många). På detta sätt hade jag även lagrat artist, skivbolag etc. där vissa kan kräva många-till-många-relationer.

2. Det är inte C# som sparar data/text, det är databasen. I en relationsdatabas så är det kolumnen på en tabell som bestämmer hur mycket du får lagra. text/ntext för MSSQL är mellan 1-2 miljoner tecken. Det är högst relevant att dela upp din data så mycket du kan. Jag hoppas att du inte skriver en hel text blandat med artist, album, låtnamn, recensioner etc. i samma textfält utan delar upp det i olika delar.

EDIT:
Jag hade inte använt en stored procedure för något så enkelt som att lagra och hämta data.

Visa signatur

ηλί, ηλί, λαμά σαβαχθανί!?

Permalänk
Medlem
Skrivet av Leedow:

text/ntext för MSSQL är mellan 1-2 miljoner tecken.

som en liten parentes kan nämnas att datatyperna text och ntext är "deprecated" och kan ersättas med varchar(max) samt nvarchar(max).
(en liten "bonus" med det är att man kan använda LIKE för att söka i innehållet...)

Visa signatur

as far as we can tell, the massacre went well...

Permalänk
Medlem

Tack för svaren, ska titta närmre på era förslag. När det gäller Entity Framework så vet jag att det finns och jag hade i normalt sätt använt det, men i det här fallet så hade en Stored procedure varit mer intressant om det ens skulle vara möjligt att använda en?

Leedow, ditt svar på fråga 1 måste jag säga gjorde mig lite förvirrad. Pratar vi fortfarande SQL och C# eller syftade du på något annat? Eller menar du att man skapar en ny tabell "Image-Objekt" som i sin tur har kolumner för typ namn,sökväg till filen?

När det gäller fråga 2, om man skulle spara en massa brödtext på de sättet hur blir det då med formateringen, hur skulle man gå tillväga för att lösa det när det väl är dags att läsa in det igen till programmet? Blir det att gå igenom det steg för steg och göra radbrytningar etc, eller finns det något annat man kan använda sig av?

Kan även tillägga att de två frågorna inte var kopplade till SQL frågan utan de var mer generella frågor kring hur man brukar göra.

Permalänk
Medlem

Javisst är det möjligt att använda en stored procedure, förutsatt att din databas har stöd för dom förståss.
Antingen anropar du den direkt med standard ado.net, eller så kan du använda ngn liten hjälpklass för att hjälpa dig, som tex dapper.net. På ett sätt blir det enklare och göra det på det här sättet istället för entity framework. det blir inte så mycket magi, blir enklare o se och förstå vad som händer helt enklet..

Ett annat alternativ är att fixa det med linq, då sliper du ha SQLen som textsträngar i koden iaf.. En smaksak helt enkelt.

Visa signatur

AK47s for everyone! - Angry mob
Since NaN /= NaN, I think, we should decipher 'NaN' as 'Not a NaN' - Miguel Mitrofanov
(Varför är människan så benägen att tro på Gud?) Antagligen har det lönat sig och evolutionen har drivit fram sådana hjärnor. - Anon

Permalänk
Medlem
Skrivet av jovnas:

som en liten parentes kan nämnas att datatyperna text och ntext är "deprecated" och kan ersättas med varchar(max) samt nvarchar(max).
(en liten "bonus" med det är att man kan använda LIKE för att söka i innehållet...)

Bra parentes! Det är viktigt att hålla koll på vad som är deprecated. Jag hade ingen aning om detta.

http://msdn.microsoft.com/en-us/library/ms187993.aspx
"ntext, text, and image data types will be removed in a future version of Microsoft SQL Server."

Skrivet av DOC.:

Tack för svaren, ska titta närmre på era förslag. När det gäller Entity Framework så vet jag att det finns och jag hade i normalt sätt använt det, men i det här fallet så hade en Stored procedure varit mer intressant om det ens skulle vara möjligt att använda en?

Leedow, ditt svar på fråga 1 måste jag säga gjorde mig lite förvirrad. Pratar vi fortfarande SQL och C# eller syftade du på något annat? Eller menar du att man skapar en ny tabell "Image-Objekt" som i sin tur har kolumner för typ namn,sökväg till filen?

När det gäller fråga 2, om man skulle spara en massa brödtext på de sättet hur blir det då med formateringen, hur skulle man gå tillväga för att lösa det när det väl är dags att läsa in det igen till programmet? Blir det att gå igenom det steg för steg och göra radbrytningar etc, eller finns det något annat man kan använda sig av?

Kan även tillägga att de två frågorna inte var kopplade till SQL frågan utan de var mer generella frågor kring hur man brukar göra.

1. Vi pratar både C# och SQL. Databasmässigt så finns det en referens till ett Image-objekt på Album. Likaså i C# fast i minnet när du väl har laddat in det från databasen. På något sätt måste klasserna mappas till tabeller. Det gör en OR-mappare åt dig nästan, det krävs lite inställningar för att få så att klasser går till rätt tabell. All data i databasen och relationerna för objekten förändras inte för att du laddar in objekten i C#, allt ska bestå annars kan du inte garantera att ett objekt är intakt och då fallerar allt.

2. Ja, du förstår redan nu problemet. Om du verkligen måste spara allt i en kolumn, vilket jag verkligen inte rekommenderar, så skulle jag nog använda mig av XML för att få till en bra struktur. Det är ganska mycket overhead i XML så redan där skulle jag vara missnöjd med lösningen. Dessutom kan du inte filtrera ut album på artist,år,skivbolag så enkelt om all data bara finns i en stor kolumn. Det bästa är, om du använder en relationsdatabas, att strukturera upp hur all data skall lagras, i flertalet tabeller och kolumner.

Visa signatur

ηλί, ηλί, λαμά σαβαχθανί!?

Permalänk
Medlem

Tackar för svaret