C# 是否可以使用ODP.NET(Oracle.ManagedDataAccess)执行SQLPLUS脚本?

C# 是否可以使用ODP.NET(Oracle.ManagedDataAccess)执行SQLPLUS脚本?,c#,oracle,sqlplus,odp.net,C#,Oracle,Sqlplus,Odp.net,我有一个控制台应用程序,它使用Oracle.ManagedDataAccess连接到数据库,然后尝试执行本地硬盘上的一系列SQL*PLUS脚本 不幸的是,虽然我的应用程序适用于简单的SQL语句,但它似乎不适用于SQL*PLUS 守则: var script = File.ReadAllText("C:\\Automation\\script.sql"); using (var objConn = new OracleConnection(_connectionString))

我有一个控制台应用程序,它使用Oracle.ManagedDataAccess连接到数据库,然后尝试执行本地硬盘上的一系列SQL*PLUS脚本

不幸的是,虽然我的应用程序适用于简单的SQL语句,但它似乎不适用于SQL*PLUS

守则:

    var script = File.ReadAllText("C:\\Automation\\script.sql");

    using (var objConn = new OracleConnection(_connectionString))
    {
        OracleCommand objCmd = new OracleCommand();
        objCmd.Connection = objConn;
        objCmd.CommandText = script;
        objCmd.CommandType = CommandType.Text;

        try
        {
            objConn.Open();
            objCmd.ExecuteNonQuery();
        }
        catch(Exception ex)
        {
            Console.WriteLine("Exception: {0}", ex.ToString());
        }
        finally
        {
            objConn.Close();
        }
    }
Script.sql-在sql Developer中执行时不会出错

    DEFINE CODE_PATH = C:\Automation
    @"&&CODE_PATH\Test.sql"
Test.sql-在没有sql*PLUS的sql Developer\my app中无错误地执行


我错过了什么?这可能吗?

我仍然不确定是否可以通过ODP.NET执行slqplus,我怀疑不可能

作为一种解决方法,我将直接调用sqlplus.exe

代码:

多亏了

答案是否定的

ODP.NET和其他Oracle编程接口OCI、OCCI、JDBC等设计用于执行SQL、PL/SQL以及对存储过程和函数的调用。它们不是为处理SQL*Plus语法而设计的,顺便说一句,除了@符号之外,SQL*Plus语法还包含许多其他非SQL、非PL/SQL命令,例如show errors


SQL*Plus脚本设计为仅由SQL*Plus执行,但近年来SQL Developer、Oracle Developer Tools for Visual Studio和其他一些Oracle工具为其添加了解析器。但是,这些解析器不是通过公共API公开的。

您可能需要引用客户端的其他库。看看它应该能工作,我试过它能工作的代码。尝试在代码中使用相同的sql语句,而不是使用脚本文件,如果脚本文件正常工作,它也应该与该脚本文件一起工作。@imsome1鼓励您使用它。因此,如果我删除脚本元素并传递一个字符串:DEFINE CODE_PATH=C:\\Automation\r\n@&&CODE_PATH\\TEST.sql\n我仍然会收到错误OK,请使用Console.WriteLinescript打印脚本值;并检查输出是否打印到控制台。即使我通过了:@C:\\Automation\\test.sql,我仍然会得到错误
    SELECT ID FROM data.SOME_TABLE WHERE ROWNUM < 100 
    ORA-00900: invalid SQL statement at Oracle.ManagedDataAccess.Client.OracleCommand.ExecuteNonQuery()
    static void execString(string userName, string password, string scriptFileName, string dataSource)
    {
        ProcessStartInfo processInfo = new ProcessStartInfo();
        processInfo.FileName = "sqlplus.exe";
        processInfo.Arguments = String.Format("{0}/{1}@{2} @{3}", userName, password, dataSource, scriptFileName);

        Process process = Process.Start(processInfo);
    }