كيفية إرجاع سجلات من وظيفة
سؤال
وأنا بناء طبقة الوصول إلى البيانات في 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 = لا شيء