قم بتحويل السلسلة إلى فريد من نوعها في vbscript
-
19-08-2019 - |
سؤال
لديّ برنامج نصي يقوم بتشغيل إجراء مخزن في قاعدة بيانات SQL Server الخاصة بي ، فإن المشكلة هي أن الإجراء المخزن يأخذ معلمة فريدة من نوعها. لديّ وظيفة تمسك بمعرف جلسة من قاعدة البيانات (وهي NVARCHAR) ، لذلك فإن VBSCRIPT يجعلها سلسلة وأحتاج إلى تحويلها لتمريرها إلى الإجراء المخزن.
Function GetOpenSession
Set conn = CreateObject("ADODB.Connection")
Set rs = CreateObject("ADODB.Recordset")
conn.Open "Provider=SQLOLEDB.1;Integrated Security=SSPI;Data Source=" & Source
rs.CursorLocation = 3
rs.Open "SELECT top 1 OpenSession FROM OpenSessions with (nolock)" , conn, 3, 3
If rs.RecordCount = 0 Then
MsgBox "No Connection"
Else
GetOpenSession = rs.Fields(0).Value
End If
End Function
أحصل على "قيمة حرف غير صالحة لمواصفات الممثلين" عندما أحاول تنفيذ الإجراء المخزن.
set cnParam = cmd.CreateParameter("@ActiveSession",72,1,,GetOpenSession)
cmd.Parameters.Append cnParam
لا يمكنني تغيير أي شيء في قاعدة البيانات ، لذلك أحتاج إلى طريقة للتغلب على هذا في البرنامج النصي.
المحلول
اعتمادًا على نوع البيانات الخاص بـ Select OpenSession ، قد تتمكن من إلقاءه/تحويله في الاستعلام وقد يحتفظ VBScript بنوع البيانات باعتباره GUID:
SELECT top 1 CONVERT(uniqueidentifier, OpenSession)
FROM OpenSessions with (nolock)
عندما تستخدم GetOpenSession
أو rs.Fields(0).Value
, ، نأمل أن تبقيها VBScript كخدمة GUID.
يبدو أن الاحتمال الآخر هو واجهة برمجة تطبيقات Win32 باستخدام CoCreateGuid
و StringFromGUID2
. تم العثور على مثال هنا, ، لكنه يتطلب وظائف Win32 خارجية ونوع لـ GUID.
نصائح أخرى
أعتقد أن vbscript تتوقع أن يتم إنهاء Guids. هو معرف جلستك من نفس التنسيق مثل {d6ca6263-e8e1-41c1-aea6-040ea89bf030}
عادةً ما أقوم بتغيير نوع المعلمة من الإجراء المخزن إلى Varchar (38).
يقوم SQL Server بعمل أفضل لإكراه السلسلة على GUID عند الحاجة.
ما هي قيمة getOpensession بعد تعيينها؟ أي نوع بيانات؟ يبدو أنه غير متوافق مع النوع 72 (GUID) ، الذي تقوله في مكالمة CreateParameter.
يمكنك أن تنسى استخدام أوامر ADO تمامًا وتنفيذ الإجراء المخزن فقط باستخدام SQL Plain.
Set rs = CreateObject("ADODB.Recordset")
rs.Open "EXEC usp_MySP '" & GetOpenSession & "'", cnn
من الواضح أنه من الفظيع بناء أوامر SQL مثل هذا ، لكنها فقط لاختبار ، بعد كل شيء ...