سؤال

<ع> استخدام برنامج نصي VBA في Excel، وأنا أحاول أن إدراج صف جديد في جدول ثم نعود قيمة هوية هذا الصف. إذا قمت بتشغيل:

INSERT INTO DataSheet(databaseUserID, currentTimestamp)
VALUES (1, CURRENT_TIMESTAMP);
SELECT SCOPE_IDENTITY()

وفي إدارة Studio، يتم إدراج صف واحد وانه يعطيني قيمة الهوية عاد كما هو متوقع. ومع ذلك، عند تشغيل نفس الاستعلام المحدد من خلال مجموعة سجلات ADODB في VBA، أواجه مشكلة. يتم إدخال بالفعل الصف، ولكن لا أستطيع الوصول إلى قيمة الهوية. يسرد السجلات 0 الحقول وفعلا أغلقت أيضا. لقد حاولت مع وبدون الفاصلة المنقوطة، وحاولت أيضا تشغيل الاستعلام معاملة واحدة كذلك. نفس الصفقة، لا الزهر. أي فكرة عما يحدث؟

إليك يا VBA:

Dim rs As ADODB.Recordset
Dim cn As Connection
Dim SQLStr As String
Dim serverName As String
Dim databaseName As String

serverName = "MSSQLServer"
databaseName = "QA"
cxnStr = "Driver={SQL Server};Server=" & serverName & ";Database=" & databaseName & ";"

SQLStr = "INSERT INTO DataSheet(databaseUserID, currentTimestamp)
VALUES (1, CURRENT_TIMESTAMP); SELECT SCOPE_IDENTITY()"
Set cn = New ADODB.Connection
cn.Open cxnStr
Set rs = New ADODB.Recordset
rs.Open SQLStr, cn, adOpenKeyset, adLockOptimistic
MsgBox (rs.Fields(0).Value)

وفشل مربع الرسالة لعرضه لأن rs.Fields(0).Value يعود NULL. وأضاف لي ساعة إلى التمرير، وكما قلت، ويظهر 0 الحقول بعد الاستعلام ويبدو أيضا أن تكون مغلقة (الحالة = 0).

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

المحلول

عند تشغيل مجموعة من الأوامر باستخدام ADODB، وأعتقد أنه يدير كل واحد على حدة. لفرض الأمر التالي لتشغيل، لديك لاستخدام ما يلي:

Set rs = rs.NextRecordset()

وتغيير نهاية روتينك لما يلي ينبغي أن تفعل خدعة:

Set rs = New ADODB.Recordset
rs.Open SQLStr, cn, adOpenKeyset, adLockOptimistic
Set rs = rs.NextRecordset
MsgBox (rs.Fields(0).Value)

نصائح أخرى

وأنت تنفيذ بيانين ذلك سوف تحصل على نتيجتين الظهر. كائن مجموعة السجلات يمكن عقد واحد فقط نتيجة في وقت واحد -. للحصول على نتيجة أخرى تحتاج إلى استخدام الأسلوب NextRecordset

Set rs = rs.NextRecordset

في rs.Open بك جرب هذا

وrs.Open SQLStr, cn, adCmdText

وانظر ماذا يحدث عند إزالة القيم adOpenKeySet وadLockOptimistic تترك لهم في إعداداتها الافتراضية.

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