.NET / Oracle: Cómo ejecutar un script con sentencias DDL mediante progtwigción

Quiero hacer algo de manipulación de esquemas programáticos contra una base de datos de Oracle en C #. Por eso, lucho con algunas cuestiones básicas.

Las declaraciones de ddl sql se encuentran en un archivo de script. No quiero usar sqlplus.exe, pero quiero usar OracleCommand fuera de los ensamblados ODP.NET (System.Oracle.DataAccess). Aquí hay un ejemplo de mi archivo de script:

script.sql:

DROP TABLE ABCDEF; DROP TABLE GHIJKL; 

Quiero señalar:

  • El script contiene sentencias DDL (lenguaje de definición de datos)
  • El script contiene líneas vacías.
  • El script contiene más de una statement

El siguiente código debe ejecutar mi script:

 var content = File.ReadAllText("script.sql"); using (var oracleConnection = new OracleConnection(_connectionString)) { oracleConnection.Open(); using (var command = new OracleCommand(content) { Connection = oracleConnection }) { command.CommandType = CommandType.Text; command.ExecuteNonQuery(); } } 

Al ejecutar este código, obtengo un error de Oracle:

Oracle.DataAccess.Client.OracleException: ORA-00911: carácter no válido

Tal vez haya algún problema con el formato de las declaraciones, creo. Cualquier sugerencia es apreciada. Gracias.

—EDITAR—

Para resumir mis necesidades de una manera sencilla: busco un método para ejecutar cualquier script sql / ddl, que sea ejecutable por SQL Plus, programáticamente con C #.

Como dijo @Steve, los puntos y coma están causando su error. Y no puede envolver todo el archivo en un solo comando de execute immediate , ya que solo puede ejecutar una instrucción a la vez. Deberá analizar su archivo y ejecutar cada comando por sí solo, eliminando el punto y coma que delimita los comandos. Su análisis tendrá que lidiar con los literales de cadena, como anotó, que además de contener puntos y comas también puede contener comillas dobles (”) dentro de las comillas simples (‘) que comienzan y terminan el literal de la cadena.

Simplemente envuélvelo dentro de BEGIN y END y funcionará sin problemas

 var content =string.Format("BEGIN {0} END;", File.ReadAllText("script.sql")); using (var oracleConnection = new OracleConnection(_connectionString)) { oracleConnection.Open(); using (var command = new OracleCommand(content) { Connection = oracleConnection }) { command.CommandType = CommandType.Text; command.ExecuteNonQuery(); } } 

Intentaré ejecutar una línea a la vez para ver si tiene algún carácter extraño que bloquee la ejecución. (No estoy seguro también si podría enviar todos sus comandos juntos en una sola llamada).

También debes eliminar el punto y coma al final de las líneas.

 int lineNum = 0; try { string[] cmdTexts = File.ReadAllLines("script.sql"); using (var oracleConnection = new OracleConnection(_connectionString)) { oracleConnection.Open(); OracleCommand command = new OracleCommand(); command.Connection = oracleConnection; foreach(string cmd in cmdTexts) { lineNum++; if(cmd.Trim().Length > 0) { if(cmd.EndsWith(";")) cmd = cmd.Substring(0, cmd.Length - 1); command.CommandText = cmd; command.ExecuteNonQuery(); } } } } catch(Exception ex) { MessageBox.Show("Exception on line: " + lineNum + " message: " + ex.Message); }