Avatar billede doomstone-dk- Nybegynder
21. november 2007 - 09:13 Der 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.
                }

            }
            catch (Exception exp)
            {
                MessageBox.Show(exp.ToString());
            }
            prisConnection.Close();



Jeg har prøvet at indsætte et


                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

Med Venlig Hilsen
Kasper Rune Søgaard
Avatar billede doomstone-dk- Nybegynder
21. november 2007 - 09:18 #1
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
Avatar billede doomstone-dk- Nybegynder
21. november 2007 - 09:27 #2
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 :(
Avatar billede bennytordrup Nybegynder
21. november 2007 - 09:53 #3
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.
Avatar billede bennytordrup Nybegynder
21. november 2007 - 09:53 #4
eneste tidspunkt, hvor du IKKE skal bruge denne model, er, hvis du returnerer en DataReader fra funktionen for at bruge readeren et andet sted.
Avatar billede doomstone-dk- Nybegynder
21. november 2007 - 09:59 #5
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
Avatar billede bennytordrup Nybegynder
21. november 2007 - 10:48 #6
Inden "while (dr.Read())" skal du lige have en cnn.Open()

At pakke objekterne ind i "using" betyder, at de er garanteret Dispose - hvilket igen gør, at du ikke bør rende ind i mangel på connections.
Avatar billede lasserasch Juniormester
21. november 2007 - 11:08 #7
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
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester