Как сделать подключение оракула DB с использованием 32-битного ODBC через VBScript - PullRequest
0 голосов
/ 09 мая 2018

ОС: Windows7 DB: Oracle 11 Enterprise Release 11.2.0.4.0 DSN: DSN, созданный в ODBC в SYSWOW64

У меня есть файл VBS, который подключается к Oracle DB и выполняет запрос и возвращает результат на основена котором я делаю какие-то действия.

Call db_connect(curSession, "DSN=INTDB;UID=RAKHSH;PWD=fdfg4qprd;")

strQuery="select count(*) from atmn.vc_run;"
call db_execute_query(curSession, strQuery)

intCount = db_get_rows_count_SQL(curSession, strQuery)

Public Function db_connect( byRef curSession ,DSN)
Set curSession = createobject("ADODB.Connection")
curSession.connectionstring = DSN
curSession.open

if Err.Number = 0 then
    db_connect=1
else
    db_connect=0
end If
End Function

Я сталкиваюсь с 2 проблемами:

  1. Когда я дважды щелкаю этот файл VBS, он показывает ошибку несоответствия архитектуры,Я нашел следующий поток, и когда я открываю CMD из syswow64 и выполняю скрипт, он работает нормально, но когда я дважды щелкаю, он показывает ошибку Как мне запустить VBScript в 32-битном режиме на 64-битной машине?

  2. Мне также нужно запустить это из задания jenkin с помощью CSCRIPT, оно показывает то же сообщение в консоли jenkin

Я гуглилразличные решения с последних 2 дней, но не смогли найти ни одного.

1 Ответ

0 голосов
/ 09 мая 2018

Поместите этот дополнительный вызов в начало вашего скрипта:

RunAs32()

и включите этот саб в

Sub RunAs32
    Set objShell = CreateObject("Wscript.Shell")
    If objShell.ExpandEnvironmentStrings("%PROCESSOR_ARCHITECTURE%") = "AMD64" Then 
        objShell.Run "c:\Windows\SysWow64\cscript.exe """ & WScript.ScriptFullName & """",1,False
        WScript.Quit
    End If 
End Sub 

Если механизм cscript работает как 64-битный, тогда переменная среды PROCESSOR_ARCHITECTURE будет равна AMD64, в противном случае она будет x86. Если это AMD64, вы можете перезапустить скрипт в другом процессе с 32-битной версией cscript, а затем выйти из исходного скрипта.

Имейте в виду, что если вы, как правило, дважды щелкаете по скрипту для его запуска, откроется w script.exe. Вы можете проверить вызывающий движок с помощью этой строки:

pcengine = LCase(Mid(WScript.FullName, InstrRev(WScript.FullName,"\")+1))

Для более полного ответа на проверку wscript против cscript (и откуда взялась вышеуказанная строка), проверьте этот пост

По сути, вы делаете аналогичный вызов checkengine в верхней части вашего скрипта, затем включаете следующую подпрограмму:

Sub checkengine
  pcengine = LCase(Mid(WScript.FullName, InstrRev(WScript.FullName,"\")+1))
' BEGIN CALLOUT A
  If Not pcengine="cscript.exe" Then
    Set WshShell = CreateObject("WScript.Shell")
    WshShell.Run "CSCRIPT.EXE """ & WScript.ScriptFullName & """"
    WScript.Quit
  End If
' END CALLOUT A
End Sub
...