2017-03-16 7 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 개발자

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

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

덕분에 대답은 no입니다.

ODP.NET 및 기타 Oracle 프로그래밍 인터페이스 (OCI, OCCI, JDBC 등)는 SQL, PL/SQL 및 저장 프로 시저 및 함수를 호출하도록 설계되었습니다. SQL * Plus 구문을 처리하도록 설계되지 않았습니다 (BTW는 "@"기호 이외의 많은 비 SQL, 비 PL/SQL 명령을 포함합니다 - 예 : "show errors").

SQL * Plus 스크립트는 SQL * Plus 단독으로 실행되도록 설계되었지만 최근에는 SQL Developer, Visual Studio 용 Oracle Developer Tools 및 일부 다른 Oracle 도구에서 파서를 추가했습니다. 그러나 이러한 파서는 공용 API를 통해 노출되지 않습니다.