【问题标题】:Is it possible to execute a SQLPLUS script using ODP.NET (Oracle.ManagedDataAccess)?是否可以使用 ODP.NET (Oracle.ManagedDataAccess) 执行 SQLPLUS 脚本?
【发布时间】:2017-08-07 04:03:55
【问题描述】:

我有一个控制台应用程序连接到数据库(使用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\我的应用程序中正确执行

    SELECT ID FROM data.SOME_TABLE WHERE ROWNUM < 100 

错误:

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

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

【问题讨论】:

  • 你可能需要参考一些其他的客户端库。看看sqlserver way
  • 它应该可以工作,我尝试了它工作的代码。在代码中尝试相同的 sql 语句,而不是使用“脚本”文件,如果它正在工作,它也应该与那个“脚本”文件一起工作。
  • @imsome1 令人鼓舞的是它对您有用。因此,如果我删除脚本元素并改为传递一个字符串: "DEFINE CODE_PATH = C:\\Automation\r\n@\"&&CODE_PATH\\TEST.sql\"" 我仍然会收到错误
  • 好的,使用 Console.WriteLine(script) 打印“script”值;并检查输出
  • 打印到控制台看起来没问题。即使我通过:“@C:\\Automation\\test.sql”我仍然得到错误

标签: c# oracle sqlplus odp.net


【解决方案1】:

答案是否定的。

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

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

【讨论】:

    【解决方案2】:

    我仍然不确定是否可以通过 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

    【讨论】:

      猜你喜欢
      • 2021-07-07
      • 1970-01-01
      • 1970-01-01
      • 2021-05-22
      • 2023-03-19
      • 2017-03-29
      • 2012-06-01
      • 2014-02-04
      • 1970-01-01
      相关资源
      最近更新 更多