2017-03-16 59 views
0

我有一個連接到數據庫的控制檯應用程序(使用Oracle.ManagedDataAccess),然後嘗試執行位於本地硬盤驅動器上的一堆SQL*PLUS腳本。是否可以使用ODP.NET(Oracle.ManagedDataAccess)執行SQLPLUS腳本?

不幸的是,儘管我的應用程序適用於簡單的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 Developer中執行\我的應用程序,而不SQL*PLUS

SELECT ID FROM data.SOME_TABLE WHERE ROWNUM < 100 

錯誤:

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

我缺少什麼?這甚至有可能嗎?

+0

您可能需要參考客戶端的其他庫。看看[sqlserver的方式](http://stackoverflow.com/questions/1449646/how-can-i-execute-a-sql-from-c) –

+0

它應該工作,我試着它的代碼工作。在代碼中嘗試使用相同的sql語句,而不是使用「腳本」文件,如果它正在工作,它應該與該「腳本」文件一起工作。 – imsome1

+0

@ imsome1這是令人鼓舞的,它適用於你。因此,如果我刪除腳本元素並傳遞字符串,請改爲:「DEFINE CODE_PATH = C:\\ Automation \ r \ n @ \」&& CODE_PATH \\ TEST.sql \「」我仍然收到錯誤 – Freddie2025

回答

1

答案是否定的。 ODP.NET和其他Oracle編程接口(OCI,OCCI,JDBC等)旨在執行SQL,PL/SQL和調用存儲過程和函數。它們不是爲了處理SQL * Plus語法而設計的(除了「@」符號外,BTW還包含許多其他非SQL,非PL/SQL命令 - 例如「顯示錯誤」)。

SQL * Plus腳本被設計爲由SQL * Plus單獨執行,但近年來SQL Developer,Oracle Developer Tools for Visual Studio和其他一些Oracle工具爲其添加了解析器。但是,這些解析器不會通過公共API公開。

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

相關問題