21. november 2007 - 09:13Der er
6 kommentarer og 1 løsning
Korrekt omgang med sql database?
Hej, jeg er rimelig ny inde for C#, har dog arbejdet med mySQL og PHP siden 2001. Jeg er lige blevet færdig med mit første program, som tjekker om det data som er blevet indtastede i Navision er korrekt. Jeg stødte dog ind i nogle problemer men at hente fra data fra sql databasen. Da jeg f.eks. skulle lave opslag i 4 forskellige tabeller på resultat jeg har. f.eks. db: vare vare_id pris_gruppe vare_ejer
hvis jeg køre denne igennem så skulle jeg lave 2 på slag per resultat fra databasen vare, så jeg kan hente prisen ud fra pris_grupper og navnet på ejeren.
Dette plejer ikke være noget problem for mig i PHP, men har problemer med at C# begynder at hænge og til sidst miste forbindelsen til databasen. Hvordan ville i gøre dette?
Der ud over vil jeg høre jeg om hvordan jeg kan lave mere end 1 sql forspørelse pr connection så jeg ikke hele tiden skal lukke og åbne en forbindelse? Sådan her gør jeg atm.
SqlConnection prisConnection = new SqlConnection(this.cfg.getConnString()); try { prisConnection.Open(); } catch { // If the connection failed MessageBox.Show("Kunne ikke oprette forbindelse til Navision serveren"); } try { string sql = "My sql string here”; SqlDataReader myReader = null; SqlCommand myCommand = new SqlCommand(sql, prisConnection); myReader = myCommand.ExecuteReader(); while (myReader.Read()) { //Do something with the data. }
string sql = "My sql string here”; SqlDataReader myReader = null; SqlCommand myCommand = new SqlCommand(sql, prisConnection); myReader = myCommand.ExecuteReader(); while (myReader.Read()) { //Do something with the data. }
Mere efter den første while slutte men der får jeg en fejl med at der allerede er en sql i gang på den connection. Jeg har også prøvet at tilføje myReader.close(), det hjælper dog ikke.
Ville være dejligt hvis i kunne hjælpe mig med disse 2 problemer. Der ud over tager jeg gerne imod alle råd og links omkring ”god omgang” med sql i C#
Håber mit problem var godt nok forklaret, hvis ikke bare skriv så skal jeg nok omformulerer :D
Der ud over, ville jeg også høre om der er en "database explorer" ligesom phpMyAdmin til MS sql server 2005, kan godt lide at have en god oversigt over mine tabeller men jeg arbejder med dem :D
Argh det er jo godt at jeg kan huske det hele i den første post :D Jeg savner nemlig også en lille oversigt over forms, altså ikke lige C# men hvilke form der er gode at bruge hvor, hvor de ikke er og hvad de kan af spicelle ting :D
Der ud over kender i en god guide til at arbejde med SQL i Visual C# programmet, har spammet google.com ned, uden at kunne finde noget som var en overskulig guide :(
Til SQL Server 2005 er der Management Studio - det er vist det nærmeste, du kommer en database explorer.
Hvis du ikke har en SQL Server 2005 lokalt, kan du installere Management Studio Express, som er en gratis (lidt mindre) version af Management Studio. Kan hentes hos MS.
Du kan ikke have mere en en reader aktiv på en åben connection - med mindre, du har slået MARS til på connection. Dette understøttes kun på SQL 2005.
Generelt ville jeg lave koden således:
using (SqlConnection cnn = new SqlConnection(<connectionstring>)) { using (SqlCommand cmd = new SqlCommand(<commandtext>, cnn)) { using (SqlDataReader dr = cmd.ExecuteReader(CommandBehaviour.CloseConnection)) { while (dr.Read()) { // Do something } dr.Close(); } } }
Hvis du ved, at du kun får et resultatsæt tilbage, kan du yderligere tilføje "| CommandBehaviour.SingleResult" på parameteren til ExecuteReader.
Ok, ville dette så hjælpe på mit problem med programmet begynde at hænge fordi der bliver lavet formange sql connections? (Det jeg gætter på at der er gået galt)
Venter lige lidt med at acceptere dit svar, så andre også kan komme med lidt input :D men du skal nok få point :D
Nu ved jeg jo ikke lige helt præcist hvilken fejl du får ang. for mange connections, men du skal huske på en ting.
Hvis du f.eks. har en klasse og der er i denne at du har metoden til at oprette din SQL forbindelse, og så f.eks. kalder den metoder fra en form, så er det MEGET vigtigt at du tilføjer en "CommandBehavior.CloseConnection" til din ExeCuteReader, som <-bennytordrup-> også skriver.
Ellers bliver din connection nemlig ikke lukket. Dvs. når du når omkring 250 - 300 connections (kan ikke lige huske det nøjagtige antal), så vil din applikation hænge, og du vil støde på en exception omkring for mange samtidige åbne forbindelser.
/Lasse
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.