Как запустить файл Powershell с зависимостью ODP в фоне консольного приложения C #? - PullRequest
0 голосов
/ 25 января 2019

У меня есть один файл сценария PowerShell, который содержит сборку ODP для подключения к базе данных Oracle. Я хочу запустить его в фоновом режиме консольного приложения C #, а затем отобразить результат в консоли C #. Это скрипт PowerShell: -

Add-Type -path "C:\path\Oracle.DataAccess.dll"
$constr = "User Id=userxxx;Password=xxxx;Data Source=xxxx"
$conn= New-Object Oracle.DataAccess.Client.OracleConnection($constr)
$conn.Open()
$sql="SELECT A,B,C,D FROM XXXXX"
$command = New-Object Oracle.DataAccess.Client.OracleCommand( $sql,$conn)
$reader=$command.ExecuteReader()
$columnNames=$reader.GetSchemaTable() | Select-Object -ExpandProperty ColumnName
$resultSet=@()
while ($reader.Read()) {
    $result=New-Object object
        $result | Add-Member -NotePropertyName $columnNames[0] -NotePropertyValue $reader.GetDateTime(0)
        $result | Add-Member -NotePropertyName $columnNames[1] -NotePropertyValue $reader.GetDateTime(1)
        $result | Add-Member -NotePropertyName $columnNames[2] -NotePropertyValue $reader.GetDateTime(2)
        $result | Add-Member -NotePropertyName $columnNames[3] -NotePropertyValue $reader.GetDateTime(3)
    $resultSet += $result
}
$conn.Close()
$resultSet | Format-Table -AutoSize 
Read-Host -Prompt “Press Enter to exit”

Я попробовал этот код, используя C #, чтобы использовать скрипт PowerShell: -

RunspaceConfiguration runspaceConfiguration = RunspaceConfiguration.Create();
Runspace runspace = RunspaceFactory.CreateRunspace(runspaceConfiguration);
runspace.Open();
RunspaceInvoke scriptInvoker = new RunspaceInvoke(runspace);
Pipeline pipeline = runspace.CreatePipeline();
Command myCommand = new Command(@"C:\path\connectDB.ps1");
pipeline.Commands.Add(myCommand);
pipeline.Commands.Add("Out-String");
Collection<PSObject> results = pipeline.Invoke();
runspace.Close();
StringBuilder stringBuilder = new StringBuilder();
foreach (PSObject obj in results)
{
    stringBuilder.AppendLine(obj.ToString());
}

Console.WriteLine(stringBuilder.ToString());
Console.ReadLine(); 

Но я получил это исключение: An unhandled exception of type 'System.Management.Automation.CmdletInvocationException' occurred in System.Management.Automation.dll

А это сообщение: Additional information: Could not load file or assembly 'file:///C:\path\Oracle.DataAccess.dll' or one of its dependencies. An attempt was made to load a program with an program with an incorrect format.

Как просмотреть данные, имя файла PowerShell, имя пользователя и базу данных, использованные для этого, на экране консоли C #?

1 Ответ

0 голосов
/ 25 января 2019

Нет причин использовать Powershell вообще. Сценарий Powershell использует объекты ADO.NET , которые проще для использования в C #. В документации OracleDataReader есть пример, показывающий, как выполнить запрос и прочитать результаты.

public void ReadData(string connectionString)
{
   string queryString = "SELECT A,B,C,D FROM XXXXX";
   using (var connection = new OracleConnection(connectionString))
   {
       var command = new OracleCommand(queryString, connection);
       connection.Open();
       using(OracleDataReader reader = command.ExecuteReader())
       {
           while (reader.Read())
           {
               Console.WriteLine("{0}, {1}, {2}, {3}",
                                 reader.GetDateTime(0),
                                 reader.GetDateTime(1),
                                 reader.GetDateTime(2),
                                 reader.GetDateTime(3));
           }
       }
  }
}

Вопрос не объясняет, как будут использоваться результаты. Скорее всего, они не будут распечатаны.

Один из вариантов - использовать их в самом цикле. Другой вариант - загрузить их в DataTable, вызвав DataTable.Load () , например,

using(OracleDataReader reader = command.ExecuteReader())
{
    var table=new DataTable();
    table.Load(reader);
    return table;
}

DataTable будет содержать столбцы и типы, возвращаемые читателем.

ADO.NET был частью .NET с самого начала, поэтому он очень хорошо описан в документации, курсах, статьях и учебных пособиях.

В настоящее время гораздо чаще загружать результаты непосредственно в строго типизированные объекты, используя ORM, такие как Entity Framework, или микро-ORM, такие как Dapper . Предполагая, что у нас есть этот класс:

class MyResultClass
{
    public DateTime A {get;set;}
    public DateTime B {get;set;}
    public DateTime C {get;set;}
    public DateTime D {get;set;}
}

Dapper позволяет нам загружать список результатов с помощью простого:

string queryString = "SELECT A,B,C,D FROM XXXXX";
using (var connection = new OracleConnection(connectionString))
{
    var results=connection.Query<MyResultClass>(queryString);
    return results;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...