.NET / Oracle:如何以编程方式使用DDL语句执行脚本

我想对C#中的oracle数据库进行一些程序化的模式操作。 因此,我在努力解决一些基本问题。

ddl sql语句位于脚本文件中。 我不想使用sqlplus.exe,但我想在ODP.NET程序集中使用OracleCommand(System.Oracle.DataAccess)。 这是我的脚本文件的示例:

script.sql:

DROP TABLE ABCDEF; DROP TABLE GHIJKL; 

我想指出:

  • 该脚本包含DDL语句(数据定义语言)
  • 该脚本包含空行
  • 该脚本包含多个语句

以下代码应该执行我的脚本:

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

执行此代码,我确实得到一个oracle错误:

Oracle.DataAccess.Client.OracleException:ORA-00911:无效字符

我认为,这些陈述的格式可能存在一些问题。 任何提示都表示赞赏。 谢谢。

– -编辑 – –

以一种简单的方式总结我的需求:我搜索一种方法来执行任何sql / ddl脚本,该脚本可由SQL Plus执行,以C#编程。

正如@Steve所说,分号导致你的错误。 并且您无法将整个文件包装到单个execute immediate命令中,因为它一次只能执行一个语句。 您将需要解析文件并自行执行每个命令,删除分隔命令的分号。 正如您所指出的,您的解析必须处理字符串文字,除了包含分号之外,还可以在单​​引号(’)中包含加倍的单引号(”),用于开始和结束字符串文字。

只需将其包裹在BEGIN和END内,它就能顺利运行

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

我将尝试执行一行,看看你是否有任何阻止执行的怪异角色。 (我也不确定你是否可以在一次通话中将所有命令一起发送)。

您还应该删除行尾的分号

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