سؤال

لديّ برنامج نصي يقوم بتشغيل إجراء مخزن في قاعدة بيانات 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 مثل هذا ، لكنها فقط لاختبار ، بعد كل شيء ...

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