mboost-dp1
C# - databasekommunikation for dummies
- Forside
- ⟨
- Forum
- ⟨
- Programmering
Yo.
Nu er jeg træt af at lede rundt på utallige mystiske sider, med nogenlunde dn samme forklaring - som jeg ikke kan få til at virke, så nu prøver jeg jer.
Det er helt enkelt, jeg skal finde ud af at snakke med en database, i C# - men jeg skal altså have bukket det i neon.
Jeg *tror* jeg har syntaksen og kommandoerne på plads, men da den fejler, når jeg forsøger oprette forbindelse til databasen, har jeg svært ved at vide det.
So here goes:
1. Hvordan opretter jeg en DB-ressource i App_Data
2. Hvordan opretter jeg forbindelse til databasen efterfølgende i min kode?
Just keep it simple, stupid - jeg skal bare have den første select igennem, så har jeg styr på det... :-)
Systemsetup er:
Visual Studie 2008
SQL server der nu følger med (2005) - installeret lokalt
SQL Server Management Studio Express 2005.
På forhånd tak...
Nu er jeg træt af at lede rundt på utallige mystiske sider, med nogenlunde dn samme forklaring - som jeg ikke kan få til at virke, så nu prøver jeg jer.
Det er helt enkelt, jeg skal finde ud af at snakke med en database, i C# - men jeg skal altså have bukket det i neon.
Jeg *tror* jeg har syntaksen og kommandoerne på plads, men da den fejler, når jeg forsøger oprette forbindelse til databasen, har jeg svært ved at vide det.
So here goes:
1. Hvordan opretter jeg en DB-ressource i App_Data
2. Hvordan opretter jeg forbindelse til databasen efterfølgende i min kode?
Just keep it simple, stupid - jeg skal bare have den første select igennem, så har jeg styr på det... :-)
Systemsetup er:
Visual Studie 2008
SQL server der nu følger med (2005) - installeret lokalt
SQL Server Management Studio Express 2005.
På forhånd tak...
For en generel ADO.NET intro se:
http://www.csharp-station.com/Tutorials/AdoDotNet/...
http://www.csharp-station.com/Tutorials/AdoDotNet/...
Rent praktisk:
- drop alt med database explorer i VS
- auto mount af MDF filer
- app_data
- data sources
etc.
og skriv kode.
Hvis du ikke har installeret SQLServer Management Studio Express, så gør det.
Så opretter du din database der.
I C# bruger du SqlConnection + SqlCommand + SqlDataReader.
Glem SqlDataAdapter, DataSet i første omgang.
Kode snippet (console app):
Server navn er pcnavn\servicenavn.
I anden omgang glemmer du også alt om DataSet og kigger i.s.f. på parameters.
- drop alt med database explorer i VS
- auto mount af MDF filer
- app_data
- data sources
etc.
og skriv kode.
Hvis du ikke har installeret SQLServer Management Studio Express, så gør det.
Så opretter du din database der.
I C# bruger du SqlConnection + SqlCommand + SqlDataReader.
Glem SqlDataAdapter, DataSet i første omgang.
Kode snippet (console app):
SqlConnection con = new SqlConnection(@"server=ARNEPC3\SQLEXPRESS;Integrated Security=SSPI;database=Test");
con.Open();
SqlCommand cmd = new SqlCommand("SELECT * FROM t1", con);
SqlDataReader rdr = cmd.ExecuteReader();
while(rdr.Read())
{
Console.WriteLine((int)rdr[0] + " " + (string)rdr[1]);
}
rdr.Close();
con.Close();
Server navn er pcnavn\servicenavn.
I anden omgang glemmer du også alt om DataSet og kigger i.s.f. på parameters.
#3 arne_v:
Husk at bruge usage, så den selv sørger for at rydde op. Alternativt skal du bruge try-finally, så du er sikker på, at din forbindelse lukkes, hvis der sker fejl.
Det er måske ikke altid nødvendigt, fordi databaser kan håndtere mange forbindelser, men derfor er det stadig god praksis at gøre, ligesom man ved anvendelse af pooling opnår bedst ydelse, når der rent faktisk er tilgængelige forbindelser...
Husk at bruge usage, så den selv sørger for at rydde op. Alternativt skal du bruge try-finally, så du er sikker på, at din forbindelse lukkes, hvis der sker fejl.
Det er måske ikke altid nødvendigt, fordi databaser kan håndtere mange forbindelser, men derfor er det stadig god praksis at gøre, ligesom man ved anvendelse af pooling opnår bedst ydelse, når der rent faktisk er tilgængelige forbindelser...
I øvrigt bør man også vidt muligt referere til de generelle objekter, så man lettere kan udskifte databasen.
Forslag til bedre implementering (newz.dk formaterer ikke kilden så flot, derfor det eksterne link).
Forslag til bedre implementering (newz.dk formaterer ikke kilden så flot, derfor det eksterne link).
I øvrigt bør man også vidt muligt referere til de generelle objekter, så man lettere kan udskifte databasen.
Ikke enig, da du alligevel ville være nødsaget til at skrive din SQL om.
Hvis du bare vil i nærheden af noget i den retning, så skal du bruge ORM fra starten, f.eks. nHibernate.
Derudover så er using() jo *kun* brugbar hvis du ikke har et globalt objekt som bruges i flere metoder eller lign.
Jeg forstår ikke denne hype der tilskynder til at bruge using() hele tiden, det er langtfra nødvendigt.
I sidste ende så ender man med at bruge ORM alligevel, det er også meget nemmere :p
7 skrev:#5
Keywordet var KISS ikke realistisk exception handling.
#6
Med "generelle objekter" mener du interfaces.
Ja - det er en fremragende ide. Men igen ikke KISS.
Hvis man vil bruge IDb'erne så bør man være konsekvent og
bruge DbProviderFactory til at create connection med.
Der er ingen grund til, at man lærer folk at lave det "forkert". Mit eksempel er ikke nævneværdigt mere kompliceret end dit.
Og ja, du har ret, Man bør anvende DbProviderFactory.
Det er altså en helt basal ting, man skal have indlært som vane helt fra starten, fordi mange ellers aldrig vil nå til at gøre det pr. automatik.
8 skrev:Ikke enig, da du alligevel ville være nødsaget til at skrive din SQL om.
Hvis du bare vil i nærheden af noget i den retning, så skal du bruge ORM fra starten, f.eks. nHibernate.
Derfor er mit forslag vel stadig bedre end slet intet. Hvis vi bare snakker at hente lidt data fra tabeller, så er der ikke den store forskel på SQL'en, men det er klart, at man ikke skal udvide meget fra "SELECT * FROM ..." for at komme i vanskeligheder.
8 skrev:Derudover så er using() jo *kun* brugbar hvis du ikke har et globalt objekt som bruges i flere metoder eller lign.
Jeg forstår ikke denne hype der tilskynder til at bruge using() hele tiden, det er langtfra nødvendigt.
Mener du et generelt databaseobjekt? Det bør du så vidt muligt heller aldrig bruge. Det kan godt være, at det ikke giver mening med andet, hvis du bruger Access som database, men med Microsoft SQL Server bør du helt klart bruge pooling i stedet.
Det kan godt være, at det ikke er nødvendigt at bruge using, men det er en klart pænere måde at gøre end at lukke det manuelt (hvilket nogle dog anbefaler, at man gør samtidig; det er lidt afhængigt af hvem, man spørger), så jeg synes ikke, man kan argumentere imod det, hvis det er muligt at anvende. Det handler igen om vaner, når man er ny.
8 skrev:I sidste ende så ender man med at bruge ORM alligevel, det er også meget nemmere :p
Sådan er virkeligheden nu ikke altid, og det skal man også tage højde for.
8 skrev:Sådan er virkeligheden nu ikke altid, og det skal man også tage højde for.
Næh, men når vi nu alligevel skal snakke 'rigtige' måder at gøre det på, så er jo man bør gøre.
Design og Programmering er 2 forskellige fag når man er ny, synes godt at folk kan lære det grundlæggende før de lærer reglerne.
11 skrev:Design og Programmering er 2 forskellige fag når man er ny, synes godt at folk kan lære det grundlæggende før de lærer reglerne.
Det har du ret i. Det er bare lidt ærgerligt, at der er mange, der slet ikke får teorien med, men sådan er det nok typisk, når det bare er en fritidsbeskæftigelse og ikke en brændende passion.
#Svaret vs pæn programmering
Jeg havde brug for en point'nShoot-løsning, hvilket var præcis hvad jeg fik - det betyder jeg kan gå igang med de mest grundlæggende på mit projekt.
Den pæne brug, kommer som det næste - når jeg har noget der begynder at se rimeligt ud.
Det er en helt bevidst fremgangsmåde, der er den indlæring der virker bedst for mig. Grunden er nok, at jeg begynder at forstå hvordan jeg får noget op at stå - og derefter har jeg lettere ved at forstå hvorfor nogle fremgangsmåder er bedre og smartere end andre.
Den basale C#-teori mener jeg, at jeg har nogenlunde på plads - så det er først nu, hvor jeg har kastet mig over et ASP.NET-projekt, hvor logikken er i C# at jeg har haft en behov for en datakilde. Så må jeg se på hvordan man benytter sig af et interface til det her.
Mht exception hanlding, var det ikke med i scopet - men jeg er glad for den lille pointe, med at ligge en close af DB-conn i finally - det er skam ganske relevant.
Jeg havde brug for en point'nShoot-løsning, hvilket var præcis hvad jeg fik - det betyder jeg kan gå igang med de mest grundlæggende på mit projekt.
Den pæne brug, kommer som det næste - når jeg har noget der begynder at se rimeligt ud.
Det er en helt bevidst fremgangsmåde, der er den indlæring der virker bedst for mig. Grunden er nok, at jeg begynder at forstå hvordan jeg får noget op at stå - og derefter har jeg lettere ved at forstå hvorfor nogle fremgangsmåder er bedre og smartere end andre.
Den basale C#-teori mener jeg, at jeg har nogenlunde på plads - så det er først nu, hvor jeg har kastet mig over et ASP.NET-projekt, hvor logikken er i C# at jeg har haft en behov for en datakilde. Så må jeg se på hvordan man benytter sig af et interface til det her.
Mht exception hanlding, var det ikke med i scopet - men jeg er glad for den lille pointe, med at ligge en close af DB-conn i finally - det er skam ganske relevant.
#9
Nej.
Using er ikke "den rigtige måde".
Using er bare en kortere syntax for en finally blok der kalder Dispose.
Det er en standard løsning i situationer hvor:
1) open og close skal ske i samme metode
2) eneste form for fejl håndtering der er brug for den metode er at få lukket connection
Men det er ikke en brugbar løsning i alle situationer.
Desværre er den blevet "solgt" som en løsning i alle situationer.
Jeg har aldrig brudt mig om using - det er en lille smule fejlhåndtering uden at være komplet fejlhåndtering.
Nej.
Using er ikke "den rigtige måde".
Using er bare en kortere syntax for en finally blok der kalder Dispose.
Det er en standard løsning i situationer hvor:
1) open og close skal ske i samme metode
2) eneste form for fejl håndtering der er brug for den metode er at få lukket connection
Men det er ikke en brugbar løsning i alle situationer.
Desværre er den blevet "solgt" som en løsning i alle situationer.
Jeg har aldrig brudt mig om using - det er en lille smule fejlhåndtering uden at være komplet fejlhåndtering.
Gå til top
Opret dig som bruger i dag
Det er gratis, og du binder dig ikke til noget.
Når du er oprettet som bruger, får du adgang til en lang række af sidens andre muligheder, såsom at udforme siden efter eget ønske og deltage i diskussionerne.