.net - "पहले से ही एक खुला DataReader है..." DB कनेक्शन का पुन: उपयोग या निपटान?



vb.net connection-pooling (1)

कृपया मदद करें .... जब मैं मैसकॉल तालिका से डेटा का चयन करता हूं तो यह दिखा रहा है कि "पहले से ही इस कनेक्शन से जुड़ा एक खुला डेटारीडर है जो पहले बंद होना चाहिए। vb.net"

Private Sub cmbJobCategoryVisa_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmbJobCategoryVisa.SelectedIndexChanged
    ''"
    Dim MyCommand As New MySqlCommand("SELECT jobcategorycode FROM jobcategory WHERE jobcategory='" & Me.cmbJobCategoryVisa.SelectedItem & "'", MyConnection)
    Dim MyReader As MySqlDataReader = MyCommand.ExecuteReader
    While MyReader.Read
        If MyReader.HasRows = True Then
            Me.txtJobCategoryCodeVisa.Text = MyReader("jobcategorycode")
        End If
    End While
    MyReader.Close()
    MyCommand.Dispose()
End Sub

नीचे दिए गए कोड के निष्पादन के समय '' '', imaged त्रुटि दिखा रहा है

    Private Sub txtEmpNo_Validating(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles txtEmpNo.Validating
    Dim MyCommand5 As New MySqlCommand("SELECT * FROM employeesmaster WHERE empno='" & Me.txtEmpNo.Text & "'", MyConnection)
    Dim MyDataReader5 As MySqlDataReader = MyCommand5.ExecuteReader
    If MyDataReader5.HasRows = True Then
        While MyDataReader5.Read
            Me.txtEmpName.Text = MyDataReader5("name")
            Me.cmbNationality.Text = MyDataReader5("nationality")
            Me.cmbJobCategoryVisa.Text = MyDataReader5("jobcategoryvisa")
            If Not IsDBNull(MyDataReader5("image")) Then
                Dim ImageData As Byte() = DirectCast(MyDataReader5("image"), Byte())
                Dim MemoryStream As New IO.MemoryStream(ImageData)
                Me.pbxEmpImage.Image = Image.FromStream(MemoryStream)
            Else
                Me.pbxEmpImage.Image = Nothing
            End If
        End While
    Else
    End If
    MyDataReader5.Close()
    MyCommand5.Dispose()
End Sub

यह स्पष्ट है कि आप एक एकल, वैश्विक कनेक्शन का उपयोग कर रहे हैं, और जाहिर तौर पर इसे खुला छोड़ रहे हैं। जैसा कि उल्लेख किया गया है, आपको अपने कनेक्शन का पुन: उपयोग या भंडारण नहीं करना चाहिए। बनाने के लिए कनेक्शन सस्ते हैं और आवश्यकतानुसार उन्हें बनाने के लिए .NET को अनुकूलित किया जाता है।

आपके कोड में कई चीजें हैं, जिन्हें बंद और निपटाया नहीं जा रहा है। जो होना चाहिए। निपटाने से न केवल आपके ऐप को संसाधनों को लीक करने से रोकता है, बल्कि इस तरह की त्रुटि नहीं हो सकती है कि प्रत्येक कार्य के लिए नए बनाए गए डीबी ऑब्जेक्ट का उपयोग किया जाए।

सम्बन्ध
चूंकि इन्हें बनाने में जाइरेशन शामिल है, आप एक नया कनेक्शन बनाने के लिए एक फ़ंक्शन लिख सकते हैं (और शायद खुला) हर जगह कनेक्शन स्ट्रिंग को चिपकाने से बचें। यहाँ ओलेबीडी का उपयोग करके एक सामान्य उदाहरण दिया गया है:

Public Function GetConnection(Optional usr As String = "admin",
                       Optional pw As String = "") As OleDbConnection
    Dim conStr As String
    conStr = String.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};User Id={1};Password={2};",
                      dbFile, usr, pw)

    Return New OleDbConnection(constr)
End Function

ब्लॉक Using
इसका उपयोग एक ब्लॉक में करें ताकि इसका निपटान हो:

Using con As OleDb.OleDbConnection = GetConnection()
    Using cmd As New OleDbCommand(sql.Value, con)

        con.Open()
        Using rdr As OleDbDataReader = cmd.ExecuteReader()
           ' do stuff

        End Using      ' close and dispose of reader
    End Using          ' close and dispose of command
End Using              ' close, dispose of the Connection objects

प्रत्येक Using बयान एक नई लक्ष्य वस्तु बनाता है, और इसे ब्लॉक के अंत में निपटान करता है।

सामान्य तौर पर, जिस किसी के पास Dispose पद्धति है, उसे निस्तारण करने के लिए एक Using ब्लॉक में इस्तेमाल किया जा सकता है और उसका उपयोग करना चाहिए। इसमें आपके कोड में उपयोग की जाने वाली MemoryStream और Image शामिल होगी।

एक से अधिक ऑब्जेक्ट को निर्दिष्ट करने और इंडेंटेशन को कम करने के लिए ब्लॉकों Using "स्टैक्ड" किया जा सकता है (पहली पंक्ति के अंत के बाद अल्पविराम पर ध्यान दें):

Using con As OleDb.OleDbConnection = GetConnection(),
    cmd As New OleDbCommand(sql.Value, con)
    con.Open()
    ...
End Using       ' close and dispose of Connection and Command

अधिक जानकारी के लिए देखें:

can u pls convert this code to Mysql connection... my connection string is...

बुनियादी MySQL कनेक्शन के लिए:

' module level declaration 
Private MySQLDBase as String = "officeone"

Function GetConnection(Optional usr As String = "root",
                       Optional pw As String = "123456") As MySqlConnection
    Dim conStr As String
    conStr = String.Format("Server=localhost;Port=3306;Database={0};Uid={1}; Pwd={2};", 
         MySQLDBase, usr, pw)

    Return New MySqlConnection(constr)
End Function

व्यक्तिगत रूप से MySql के लिए, मैं विधि में एक वर्ग और एक ConnectStringBuilder का उपयोग करता हूं। मेरे द्वारा उपयोग किए जाने वाले कई, कई शांत विकल्प हैं, लेकिन जो प्रोजेक्ट से प्रोजेक्ट में भिन्न है जैसे DB और डिफ़ॉल्ट ऐप लॉगिन। उपरोक्त सभी चूक का उपयोग करता है।





connection-pooling