22. september 2005 - 15:44Der er
21 kommentarer og 1 løsning
Connection problemer ?
Hejsa,
Jeg har lavet min forbindelse til databasen igennem en klasse. Min function ser således ud :
Private Conn As SqlConnection Public Function SqlConnect() Dim Sql As String = "Data Source=xxx;Initial Catalog=yyy;User Id=xxx;Password=yyy;" Conn = New SqlConnection(Sql) Conn.Open() SqlConnect = Conn End Function
Samt en lukke function :
Public Sub SqlClose() Conn.Close() End Sub
Når så jeg f.eks. vil lave en en function i mit datalag der smidder data i et dataset gør jeg følgende :
Public Function LoadText() Dim objDb As DbClass = New DbClass Dim objConn As SqlConnection = objDb.SqlConnect Dim objComm As New SqlDataAdapter("Select * From tbl_text", objConn) Dim objDS As New DataSet objComm.Fill(objDS, "tbl_text") objDb.SqlClose() Return objDS End Function
Eller ved en indsættelse :
Public Function TextAdd(ByVal Language As String, _ ByVal Headline As String, _ ByVal LinkName As String, _ ByVal Description As String) Dim objDb As DbClass = New DbClass Dim objComm = New SqlCommand objComm.Parameters.Add("@Language", SqlDbType.NVarChar) objComm.Parameters.Add("@Headline", SqlDbType.NVarChar) objComm.Parameters.Add("@LinkName", SqlDbType.NVarChar) objComm.Parameters.Add("@Description", SqlDbType.Text) objComm.Parameters.Add("@GroupBy", SqlDbType.Char) objComm.Parameters("@Language").Value = Language objComm.Parameters("@Headline").Value = Headline objComm.Parameters("@LinkName").Value = LinkName objComm.Parameters("@Description").Value = Description objComm.Parameters("@GroupBy").Value = Left(LinkName, 1) objComm.Connection = objDb.SqlConnect Try objComm.CommandText = "Insert Into tbl_text (getLanguage, Headline, Linkname, Description, GroupBy) Values (@Language, @Headline, @LinkName, @Description, @GroupBy)" objComm.ExecuteNonQuery() Catch ex As Exception Return ex.Message Finally objDb.SqlClose() End Try Return "True" End Function
Men efter hånden som der klikkes rundt på de forskellige links på siden og flere og flere functioner bliver brugt ja så dannes der blot en ny forbindelse og på et tidspunkt rammer vi de famøse 100 der kan være i poolen og så køre siden jo som bekendt ikke.
Hvordan skal jeg forholde mig til dette og hvordan kan jeg undgå problemet ?
Denne side indeholder artikler med forskellige perspektiver på Identity & Access Management i private og offentlige organisationer. Artiklerne behandler aktuelle IAM-emner og leveres af producenter, rådgivere og implementeringspartnere.
Public Function LoadText() Dim objDb As DbClass = New DbClass Dim objConn As SqlConnection = objDb.SqlConnect Dim objComm As New SqlDataAdapter("Select * From tbl_text", objConn) Dim objDS As New DataSet objComm.Fill(objDS, "tbl_text") objDS.Dispose() objDb.SqlClose() Return objDS End Function
Men det giver heller ikke nogen forskel den hiver bare en ny connetcion op af lommen
Jeg fandt frem til at jeg havde fået lavet min objDb.SqlClose() efter en return og det duer jo ikke da min connection så ikke bliver lukket og derfor skabte det problemer.
Grunden til at jeg spørger med hensyn til om det er den rigtige måde jeg griber tingene an på er fordi jeg snakkede med snepnet her fra eksperten om det og han syntes ikke det var den mest optimale måde jeg gjorde tingene på. Han forslog noget i denne stil :
KundeListe liste = new KundeListe(); using(SqlConnection con = new SqlConnection(...)) { SqlDataReader reader = con.ExecuteReader(); while(reader.Read()) { liste.Add(new Kunde(reader)); } con.Close(); } return liste;
Men da jeg ikke helt fatter C# kan jeg ikke lige se hvad forskellen skulle være på dette og så den måde jeg gør det på, men måske du kan oversætte ?
Med hensyn til mit dataset og den .Dispose så kunne jeg heller ikke se det smarte i det da jeg bruger mit dataset i en cache. Men det var da et forsøg værd ;o)
hvis jeg skulle lave det så ville min kode nok ligne snepnets meget, bortset fra at min Kunde constructor ville have flere simple datatyper som argument fremfor en DataReader
Dim liste As KundeListe = New KundeListe ' Using Dim con As SqlConnection = New SqlConnection("...") Try Dim reader As SqlDataReader = con.ExecuteReader While reader.Read liste.Add(New Kunde(reader)) End While con.Close Finally CType(con, IDisposable).Dispose() End Try Return liste
Nej jeg har benyttet mig af en anden som ikke helt kunne få den oversat ordenligt, men den kommer ind under fortrukne til senere brug, tak for tippet ;o)
Ok, det kan jeg så ikke lige se det smarte i, men hver sin smag. Du får point og tak for diverse info ;o)
Så er jeg blevet den smule klogere igen, igen :o))
/Websam
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.