我正在使用OLEDB提供程序来连接到Oracle数据库的ADO.Net。 在我的循环中,我正在执行插入操作:
1
| INSERT INTO ps_tl_compleave_tbl VALUES('2626899', 0, TO_DATE('01/01/2002', 'MM/DD/YYYY'), 'LTKN', 'LTKN', '52', TO_DATE('01/01/2002', 'MM/DD/YYYY'), 16.000000, 24.000)INSERT INTO ps_tl_compleave_tbl VALUES('4327142', 0, TO_DATE('03/23/2002', 'MM/DD/YYYY'), 'LTKN', 'LTKN', '51', TO_DATE('03/23/2002', 'MM/DD/YYYY'), 0.000000, 0.000) |
第一个插入成功,但是第二个插入错误:
1
| ORA-00933: SQL command NOT properly ended |
我究竟做错了什么?
在.net中,当我们尝试执行一个以分号结尾的Oracle SQL语句时。结果将是一个oracle错误:ora-00911:无效字符。好的,您发现一个SQL语句不需要分号,但是例如在一个字符串中执行2条SQL语句呢?
1 2 3 4 5 6 7 8
| Dim db AS DATABASE = DatabaseFactory.CreateDatabase("db")
Dim cmd AS System.Data.Common.DbCommand
Dim SQL AS String =""
SQL ="DELETE FROM iphone_applications WHERE appid = 1; DELETE FROM iphone_applications WHERE appid = 2;"
cmd = db.GetSqlStringCommand(SQL)
db.ExecuteNonQuery(cmd) |
上面的代码将给您同样的Oracle错误:ora-00911:无效字符。
解决此问题的方法是使用BEGIN和END;语法包装您的2条Oracle SQL语句,例如:
1
| SQL ="BEGIN DELETE FROM iphone_applications WHERE appid = 1; DELETE FROM iphone_applications WHERE appid = 2; END;" |
礼貌:http://www.lazyasscoder.com/Article.aspx?id=89&title=ora-00911%3A+invalid+character+when+executing+multiple+Oracle+SQL+statement
在Oracle中,分号';'仅在sqlplus中使用。在使用ODBC / JDBC,OLEDB等时,请不要在语句的末尾添加分号。在上述情况下,您实际上在执行2条不同的语句,因此处理该问题的最佳方法是使用2条语句,而不是尝试合并为一条语句,因为您不能使用分号。
对我来说,您似乎在两个语句之间缺少了;:
insert into ps_tl_compleave_tbl values('2626899', 0, TO_DATE('01/01/2002', 'MM/DD/YYYY'), 'LTKN', 'LTKN', '52', TO_DATE('01/01/2002', 'MM/DD/YYYY'), 16.000000, 24.000)
;
insert into ps_tl_compleave_tbl values('4327142', 0, TO_DATE('03/23/2002', 'MM/DD/YYYY'), 'LTKN', 'LTKN', '51', TO_DATE('03/23/2002', 'MM/DD/YYYY'), 0.000000, 0.000)
;
尝试添加;并告诉我们。
第一次插入后的半结肠?
Oracle SQL使用分号;作为语句结束标记。
您将需要添加;;在插入语句之后。
注意:这还假定ADODB在一次调用中将允许2次插入。
另一种选择是将两个调用都包装在一个块中,
1 2 3 4
| BEGIN
INSERT (...) INTO (...);
INSERT (...) INTO (...);
END; |
在我的循环中,我没有重新初始化StringBuilder ...因此我发布了多个insert语句。
还是要谢谢你的帮助!!
问题可能是您有一个参数变量,该变量为null插入查询中。那就是我的问题。一旦为参数指定了空字符串的默认值,它就会起作用。
除了分号问题,我强烈建议您研究绑定变量。未能使用它们可能会导致数据库性能问题。该代码也倾向于更简洁。
ADO.NET OLE DB提供程序用于常规数据访问,而您没有数据库的特定提供程序。对于Oracle数据库连接,优先于OleDbConnection使用OracleConnection等。
OLE_DB是否需要分号?大多数API都不需要它吗?
这是一个远景,但是在第一个插入中,sql日期格式对英国和美国均有效,如果Oracle DB设置为英国日期格式,则第二个插入无效,我意识到您已经使用了TO_DATE函数,但我没有看到其他...