استخدام "SELECT SCOPE_IDENTITY ()" في ADODB السجلات
-
05-07-2019 - |
سؤال
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 تترك لهم في إعداداتها الافتراضية.