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

lav*_*hen 4 c# oracle ado.net

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

只是舔下面

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

结果会变成错误.

为什么?任何人都可以告诉我原因吗?

DOK*_*DOK 9

在评论中,我们为您找到了答案.这样你得到一个正式的"答案",这里来自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的"添加".