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

时间:2017-03-16 05:56:24

标签: c# oracle sqlplus odp.net

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

不幸的是,尽管我的应用程序适用于简单的SQL语句(SELECTS),但它似乎不适用于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中执行时没有错误

    SELECT ID FROM data.SOME_TABLE WHERE ROWNUM < 100 

错误:

    ORA-00900: invalid SQL statement at Oracle.ManagedDataAccess.Client.OracleCommand.ExecuteNonQuery()

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

2 个答案:

答案 0 :(得分:1)

答案是否定的。

ODP.NET和其他Oracle编程接口(OCI,OCCI,JDBC等)旨在执行SQL,PL / SQL以及对存储过程和函数的调用。它们不是为处理SQL * Plus语法而设计的(除了&#34; @&#34;符号之外,BTW还包含许多其他非SQL,非PL / SQL命令 - 例如&#34;显示错误& #34;。)

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

答案 1 :(得分:0)

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

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

代码:

    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);
    }

感谢Rich's post from 8 years ago for the workaround