2

При вызове сценария Powershell из функции C мое соединение с базой данных не открывается. Однако, когда я вхожу на сервер как пользователь, который запускает программу C и запускает ее из приглашения DOS, все работает так, как ожидалось.Сценарий Powershell, вызванный с C, не открывает соединение OleDb

Почему программа C не сможет открыть соединение с базой данных, используя C.

Сервер Windows 64 R2 64-бит.

Вот сценарий Powershell Im running. Он создает журнал отладки, чтобы проверить, какие части работают.

$DEBUGStream = [System.IO.StreamWriter] "D:\powershell\DEBUG.txt" 
$DEBUGStream.WriteLine("START DEBUG") 

$ExcelFile = "D:\InterfaceData\excel\" + $args[0] 
$Sheetname = "Sheet2$" 
$OleDbConn = New-Object “System.Data.OleDb.OleDbConnection” 
$OleDbCmd = New-Object “System.Data.OleDb.OleDbCommand” 
$OleDbAdapter = New-Object “System.Data.OleDb.OleDbDataAdapter” 
$DataTable = New-Object “System.Data.DataTable” 

$OleDbConn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=`"$ExcelFile`";Extended Properties=`"Excel 12.0 Xml;HDR=YES`";" 
$OleDbConn.Open() 

$DEBUGStream.WriteLine("Connection: $OleDbConn.State") 
    $DEBUGStream.WriteLine("Environment: $env:Processor_Architecture") 

$OleDbCmd.Connection = $OleDbConn 
$OleDbCmd.commandtext = “Select * from [$Sheetname]” 
$OleDbAdapter.SelectCommand = $OleDbCmd 

$RowsReturned = $OleDbAdapter.Fill($DataTable) 
$DEBUGStream.WriteLine("Data Table fill: Rows: $RowsReturned") 
$intRow = 1 
ForEach ($DataRec in $DataTable) { 
    $DEBUGStream.WriteLine("DATA TABLE ROW $intRow") 
    $intRow++ 
} 

$DEBUGStream.WriteLine("Loop finished") 

$OleDbConn.Close() 

$DEBUGStream.WriteLine("All Closed") 
$DEBUGStream.close() 

Вот результат при запуске вручную из DOS Prompt

C:\Users\me>powershell -executionpolicy bypass d:\powershell\Interface.ps1 test.xlsx 
START DEBUG 
Connection: Open 
    Environment: AMD64 
Data Table fill: Rows: 4 
DATA TABLE ROW 1 
DATA TABLE ROW 2 
DATA TABLE ROW 3 
DATA TABLE ROW 4 
Loop finished 
All Closed 

Вот выход, когда он вызывается из программы C. Я называю это командой system.

START DEBUG 
Connection: Closed 
    Environment: x86 
Data Table fill: Rows: 
Loop finished 
All Closed 

EDIT

При запуске 64-разрядной версии Powershell и запустить скрипт из командной строки я получаю новую ошибку. Я установил 64-битную версию Microsoft Access Database Engine 2010 (14.0.4763.1000):

C:\Windows\SysWOW64\WindowsPowerShell\v1.0\powershell.exe -executionpolicy bypass d:\wcc_powershell\WRIRMPTruckInterface.ps1 test.xlsx 

C:\Users\me>C:\Windows\SysWOW64\WindowsPowerShell\v1.0\powershell.exe -executionpolicy bypass d:\powershell\Interface.ps1 
Exception calling "Open" with "0" argument(s): "The 'Microsoft.ACE.OLEDB.12.0' provider is not registered on the local machine." 
At D:\powershell\Interface.ps1:19 char:16 
+ $OleDbConn.Open <<<<() 
    + CategoryInfo   : NotSpecified: (:) [], MethodInvocationException 
    + FullyQualifiedErrorId : DotNetMethodException 
+1

Там нет DOS подсказки - DOS мертв уже более десяти лет. В 2K8R2 - CMD & PowerShell есть 2 возможных среза командной строки. Что вы используете? – alroc

+1

@alroc - Когда я запускаю его на сервере, прямо из Powershell, я открываю командную строку и запускаю команду 'powershell -executionpolicy bypass d: \ powershell \ Interface.ps1 test.xlsx' – ProfessionalAmateur

ответ

2

При выполнении его из программы «C», вы можете ясно видеть, что запускает в разрядном процессе 32 (x86). Поскольку у вас не установлены 32-разрядные драйверы OleDb, это проблема. Вам нужно скомпилировать программу «C» как 64-битный PE, а затем запустить PowerShell как 64-битный процесс. С другой стороны, выполнить PowerShell Явно по следующему пути:

c:\windows\sysnative\windowspowershell\v1.0\powershell.exe

Это заставит программу 32 бит «C», чтобы запустить PowerShell в качестве дочернего процесса 64 бита.

Вот родственный блог мой: http://www.nivot.org/blog/post/2012/12/18/Ensuring-a-PowerShell-script-will-always-run-in-a-64-bit-shell

+2

Точно верно! Я нашел [эту запись в блоге] (http://cornasdf.blogspot.com/2009/09/force-powershell-script-to-run-in-x86.html) о принуждении powershell обнаружить, работает ли ее 32-разрядная файловая система на 64-битной архитектуре. Таким образом, скрипт автоматически запустится в правильном процессе. – ProfessionalAmateur

+2

Я обновил ответ со ссылкой на недавнее сообщение в блоге по этому вопросу. – x0n

Смежные вопросы