При вызове сценария 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
Там нет DOS подсказки - DOS мертв уже более десяти лет. В 2K8R2 - CMD & PowerShell есть 2 возможных среза командной строки. Что вы используете? – alroc
@alroc - Когда я запускаю его на сервере, прямо из Powershell, я открываю командную строку и запускаю команду 'powershell -executionpolicy bypass d: \ powershell \ Interface.ps1 test.xlsx' – ProfessionalAmateur