سؤال

أنا أعمل على تطبيق Excel الذي يستفسر عن قاعدة بيانات SQL. يمكن أن تستغرق الاستعلامات وقتًا طويلاً للركض (20-40 دقيقة). إذا فاتني شيء ما ، فقد يستغرق الأمر وقتًا طويلاً للخطأ أو الوصول إلى نقطة استراحة. يمكنني حفظ النتائج إلى ورقة غرامة ، عندما أعمل مع مجموعات السجلات التي يمكن أن تنفجر الأشياء.

هل هناك طريقة لتحميل البيانات في ADODB.RecordSet عندما أقوم بتصحيح الأخطاء لتخطي الاستعلام عن قاعدة البيانات (بعد المرة الأولى)؟

هل سأستخدم شيئًا كهذا؟

ورقة عمل Query Excel في MS-Access VBA (باستخدام مجموعة سجل ADODB)

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

المحلول

اضطررت إلى تثبيت MDAC للحصول على msado15.dll وبمجرد أن حصلت عليه أضفت إشارة إليها من (على Win7 64bit):

C: Program Files (x86) Common Files System ado msado15.dll

ثم قمت بإنشاء وظيفة لإرجاع كائن ADODB.RecordSet عن طريق تمرير اسم ورقة موجود في المصنف النشط حاليًا. إليك الرمز لأي شخص آخر إذا احتجوا إليه ، بما في ذلك Sub Test () لمعرفة ما إذا كان يعمل:

Public Function RecordSetFromSheet(sheetName As String)

Dim rst As New ADODB.Recordset
Dim cnx As New ADODB.Connection
Dim cmd As New ADODB.Command

    'setup the connection
    '[HDR=Yes] means the Field names are in the first row
    With cnx
        .Provider = "Microsoft.Jet.OLEDB.4.0"
        .ConnectionString = "Data Source='" & ThisWorkbook.FullName & "'; " & "Extended Properties='Excel 8.0;HDR=Yes;IMEX=1'"
        .Open
    End With

    'setup the command
    Set cmd.ActiveConnection = cnx
    cmd.CommandType = adCmdText
    cmd.CommandText = "SELECT * FROM [" & sheetName & "$]"
    rst.CursorLocation = adUseClient
    rst.CursorType = adOpenDynamic
    rst.LockType = adLockOptimistic

    'open the connection
    rst.Open cmd

    'disconnect the recordset
    Set rst.ActiveConnection = Nothing

    'cleanup
    If CBool(cmd.State And adStateOpen) = True Then
        Set cmd = Nothing
    End If

    If CBool(cnx.State And adStateOpen) = True Then cnx.Close
    Set cnx = Nothing

    '"return" the recordset object
    Set RecordSetFromSheet = rst

End Function

Public Sub Test()

Dim rstData As ADODB.Recordset
Set rstData = RecordSetFromSheet("Sheet1")

Sheets("Sheet2").Range("A1").CopyFromRecordset rstData

End Sub

بيانات SEET1: Field1 Field2 Field3 Red A 1 Blue B 2 Green C 3

ما يجب نسخه إلى الورقة 2: أحمر A 1 BLUE B 2 Green C 3

هذا يوفر لي قدراً هائلاً من الوقت من الاستعلام ضد SQL في كل مرة أرغب في إجراء تغيير واختباره ...

-روبرت

نصائح أخرى

الأسهل سيكون للاستخدام rs.Save "filename" و rs.Open "filename" لتسلسل السجلات من جانب العميل إلى الملفات.

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