سؤال

وأنا بناء طبقة الوصول إلى البيانات في Excel VBA وتواجه مشكلة في إرجاع السجلات. وظيفة التنفيذ () في صفي بالتأكيد استرجاع صف من قاعدة البيانات، ولكن لا يبدو أن يعود أي شيء.

ويرد الدالة التالية في فئة تسمى DataAccessLayer. تحتوي الطبقة ظائف الاتصال وقطع ومقبض فتح وإغلاق الاتصال.


Public Function Execute(ByVal sqlQuery As String) As ADODB.recordset
    Dim rs As ADODB.recordset
    Set rs = New ADODB.recordset
    Dim recordsAffected As Long

    ' Make sure we're connected to the database.
    If Connect Then
        Set command = New ADODB.command

        With command
            .ActiveConnection = connection
            .CommandText = sqlQuery
            .CommandType = adCmdText
        End With

        'Set rs = command.Execute(recordsAffected)
        'Set Execute = command.Execute(recordsAffected)
        rs.Open command.Execute(recordsAffected)
        rs.ActiveConnection = Nothing
        Set Execute = rs
        Set command = Nothing
        Call Disconnect
    End If
End Function

وهنا وظيفة عمومية أنني أستخدم في الخلية A1 من جدول البيانات الخاص بي لاختبار.


Public Function Scott_Test()
    Dim Database As New DataAccessLayer
    'Dim rs As ADODB.recordset
    'Set rs = CreateObject("ADODB.Recordset")
    Set rs = New ADODB.recordset

    Set rs = Database.Execute("SELECT item_desc_1 FROM imitmidx_sql WHERE item_no = '11001'")
    'rs.Open Database.Execute("SELECT item_desc_1 FROM imitmidx_sql WHERE item_no = '11001'")
    'rs.Open

    ' This never displays.
    MsgBox rs.EOF

    If Not rs.EOF Then
        ' This is displaying #VALUE! in cell A1.
        Scott_Test = rs!item_desc_1
        rs.Close
    End If

    rs.ActiveConnection = Nothing
    Set rs = Nothing
End Function

وماذا أفعل الخطأ؟

هل كانت مفيدة؟

المحلول

وكانت المشكلة مع وضع ActiveConnection = لا شيء. تعمل التعليمة البرمجية التالية:

Public Function Execute(ByVal sqlQuery As String) As ADODB.recordset
    Dim rs As ADODB.recordset
    Set rs = New ADODB.recordset
    Dim recordsAffected As Long

    ' Make sure we are connected to the database.
    If Connect Then
        Set command = New ADODB.command

        With command
            .ActiveConnection = connection
            .CommandText = sqlQuery
            .CommandType = adCmdText
        End With

        rs.Open command.Execute(recordsAffected)

        Set Execute = rs
        Set command = Nothing
        Call Disconnect
    End If
End Function

نصائح أخرى

Set Execute = recordset

ويخلق مؤشر إلى السجلات، الذي أغلق على الخروج من وظيفة.
وهذا هو السبب في أنه لا يمكن أن تحتوي على أي شيء.

وأنا أيضا relectant على أسماء المتغيرات الخاصة بك والتي هي مطابقة لpossibe كلمات محجوزة (السجلات). أنا عموما استخدام التمرير أو rsIn أو rsWhateverYouWant ...

وكما ذكر باتريك، والسجلات مؤشر. والمتصل "Scott_Test" يجب استدعاء recordset.Close بدلا من ذلك.

وهذه الطريقة لا يمكن أن ندعو recordset.Close تنفيذ، ولكن أعتقد أنه على ما يرام لمغادرة recordset.ActiveConnection = لا شيء

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top