Avatar billede websam Nybegynder
22. september 2005 - 15:44 Der 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 ?

/Websam
Avatar billede arne_v Ekspert
22. september 2005 - 16:18 #1
skud i tågen: for du kaldt Dispose på dit DataSet når du er færdig med det ?
Avatar billede websam Nybegynder
22. september 2005 - 16:30 #2
Hvornår skal det komme ? Jeg bruger mit dataset i en cache.
Avatar billede websam Nybegynder
22. september 2005 - 16:50 #3
Men hvad har det lige med min connection til min database at gøre
Avatar billede arne_v Ekspert
22. september 2005 - 17:37 #4
jeg spekulerer på om DataSet/DataAdapter evt. kalder Open efter at du har kalde Close
Avatar billede websam Nybegynder
22. september 2005 - 18:06 #5
Jeg har prøvet at lave 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")
    objDS.Dispose()
    objDb.SqlClose()
    Return objDS
End Function

Men det giver heller ikke nogen forskel den hiver bare en ny connetcion op af lommen

/Websam
Avatar billede websam Nybegynder
22. september 2005 - 18:13 #6
En helt anden ting er om det er den rigtige måde jeg har grebet tingene an hvad angår forbindelse til databasen ?

/Websam
Avatar billede websam Nybegynder
22. september 2005 - 18:17 #7
Jeg fatter bare ikke helt det med connection pool ! I alm. asp har det aldrig været et problem hvad er forskellen ?

/Websam
Avatar billede arne_v Ekspert
23. september 2005 - 23:21 #8
det er næppe godt at kalde Dispose og så bruge objektet bagefter
Avatar billede arne_v Ekspert
23. september 2005 - 23:22 #9
tja - ting som ligner dit er lavet mange gange

du kan evt. kigge på Microsoft DAAB
Avatar billede arne_v Ekspert
23. september 2005 - 23:23 #10
connection pool betyder bare at du åbner og lukker database connections uden
at bekymre dig om overhead fordi .NET administrerer en pool for dig
Avatar billede websam Nybegynder
23. september 2005 - 23:31 #11
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 ?

/Websam
Avatar billede websam Nybegynder
23. september 2005 - 23:38 #12
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)

/Websam
Avatar billede websam Nybegynder
23. september 2005 - 23:41 #13
Og bare for at sikre mig at jeg leder efter det rigtige så er DAAB noget i stil med det de skriver om i denne artikel :

http://aspnet.4guysfromrolla.com/articles/081005-1.aspx

/Websam
Avatar billede arne_v Ekspert
23. september 2005 - 23:42 #14
jeg synes ikke at jeg så det problem i den postede kode ??

----

Du kan lave database lag på utroligt mange forskellige måder

DataReader
DataSet
O/R mapper

og de kan skrues meget forskelligt sammen

for DAAB se f.eks.

http://msdn.microsoft.com/msdnmag/issues/05/07/DataPoints/
http://msdn.microsoft.com/msdnmag/issues/05/08/DataPoints/
http://msdn.microsoft.com/msdnmag/issues/05/10/DataPoints/

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
Avatar billede arne_v Ekspert
23. september 2005 - 23:46 #15
ja det er den DAAB

jeg kan iøvrigt absolut ikke lide DAAB

men du kan næppe blive kritiseret for at bruge noget som Microsoft selv har releaset
Avatar billede websam Nybegynder
23. september 2005 - 23:49 #16
>>jeg synes ikke at jeg så det problem i den postede kode ??<<

Nej jeg ved godt at der ikke var nogen fejl i den kode jeg skrev ovenfor det beklager jeg ;o)

Har du mulighed for at oversætte den kode jeg viste ovenfor til vb.net så jeg forstår noget mere af den ?

/Websam
Avatar billede arne_v Ekspert
23. september 2005 - 23:51 #17
Avatar billede arne_v Ekspert
23. september 2005 - 23:52 #18
output:

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
Avatar billede websam Nybegynder
23. september 2005 - 23:57 #19
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)

---------------------------------------------------

Og det vil så sige at jeg skulle knalde min database forbindelse ind i denne hver gang :

New SqlConnection("...")

???
Avatar billede arne_v Ekspert
24. september 2005 - 00:00 #20
ja

eller kombinere den med din egen måde at få connection på

pointen er netop at man kan variere og kombinere i det uendelige
Avatar billede arne_v Ekspert
24. september 2005 - 00:00 #21
og et svar
Avatar billede websam Nybegynder
24. september 2005 - 00:06 #22
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
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