为什么在C#时分号不能放在OracleCommand的CommandText中

为什么分号(’;’)C#时无法放在OracleCommand的CommandText

只是舔下面

string sql = "select * from table1;"; OracleCommand oc = new OracleCommand(sql , con); oc.CommandType = CommandType.Text; oc.ExecuteNonQuery(); 

结果将是一个错误。

为什么? 谁能告诉我原因?

在评论中,我们已经为您找到了答案。 这样你得到一个正式的“答案”,这里来自OracleOverflow网站(见下文):

OracleCommmand一次只能运行1个sql或plsql语句。 不需要分隔多个语句。

分号是划分多个语句的文档的一部分。 它不是单个DDL语句的一部分。 对于OracleCommand,不需要附加分号,因为它一次只能处理一个语句。

编辑:这是原始链接,现在已经死了: http : //www.oracleoverflow.com/questions/145/running-ddl-through-an-oraclecommand-without-the-semicolon

替代方案: http ://web.archive.org/web/20100806014022/http: //www.oracleoverflow.com/questions/145/running-ddl-through-an-oraclecommand-without-the-semicolon

题:

当试图通过OracleCommand对象运行一系列DDL命令时,如果我包含最后一个分号,则会出现ORA-00911’无效字符’错误,即使这是文档中SQL语法的一部分。 它还意味着您一次只能执行一条SQL语句,而不是一次执行整个SQL脚本,这对我来说似乎很奇怪。

谷歌搜索了一下之后,我发现解决方法是将DDL包装在EXECUTE IMMEDIATE PL / SQL语句中,但如果DDL最后有分号,则会再次失败(除了PL / SQL create语句,需要分号)。

有谁知道这种行为的原因? 分号在语法文档中,所以我认为它总是必需的,但是如果包含分号则会失败…

在这里回答:

OracleCommmand一次只能运行1个sql或plsql语句。 不需要分隔多个语句。

分号是划分多个语句的文档的一部分。 它不是单个DDL语句的一部分。 对于OracleCommand,不需要附加分号,因为它一次只能处理一个语句。

增加:您可以将多个语句捆绑到BEGIN … END; 阻止(是的,这以分号结束)。 但是这个语句应该是DML,DDL或PL / SQL函数调用。 您不能将多个SELECT语句捆绑到BEGIN … END; 块。

评论:

为什么OracleCommand有这个限制,一次只能运行1个语句?

它基于ADO.Net中的DbCommand规范。 它不仅仅是OracleCommand的限制。

SqlCommand允许在单个命令中使用多个语句,这些语句必须只是SQL Server的“添加”。