【发布时间】:2013-08-22 00:02:49
【问题描述】:
我有一个代码行抛出一个
Oracle 异常 - ORA-00911:无效字符
在尝试以下 C# 代码时:
double tempDateTimeObj = Convert.ToDouble(someClass.GetTime(tempObjID, objStartTime, todayTime).Rows[0][0]);
GetTime 是一个执行 SQL 调用的函数,该函数接受您在上面看到的变量,SQL 调用输出一个 Oracle 数字类型,然后 GetTime C# 函数每次返回一行的 DataTableCollection Tables 对象。
public static DataTable GetTime(string tempObjID, DateTime objStartTime, DateTime todayTime)
{
string sql = "select some_pkg.get_time('" + tempObjID + "', to_date('" + objStartTime + "', 'mm/dd/yyyy hh:mi:ss am'), to_date('" + todayTime + "', 'mm/dd/yyyy hh:mi:ss am')) from dual;";
return <connection object>.getDS(sql).Tables[0];
}
如果我调试,获取具有变量值的 sql 字符串,然后将其放入 Oracle SQL Developer 中,它可以正常工作并在 SQL 开发控制台中返回一个数字。但是,当我调试并遇到该行时,C# 代码会引发 00911 异常。由于字符串 sql 已经在 Oracle SQL Dev 中测试过,因此语法应该是有效的。给定有效的语法,为什么 VS2010 会抛出这个错误/异常?
编辑: 以下是用 C# 构建并发送到数据库的示例字符串:
select some_pkg.get_time('23569245', to_date('11/8/2012 1:21:06 PM', 'mm/dd/yyyy hh:mi:ss am'), to_date('12/31/2012 12:52:18 AM', 'mm/dd/yyyy hh:mi:ss am')) from dual
已经尝试在 C# 字符串中使用分号和没有分号并导致相同的 Oracle 异常,尽管两者都在 Oracle SQL Dev 中工作
【问题讨论】:
-
Kurt为什么不创建存储过程并使用参数化查询 -
"存储过程的主要目的是构建要加载到临时表中的中间结果,然后在 SELECT 语句中进行查询。INSERT...EXEC 语句可以使用表值函数。” msdn.microsoft.com/en-us/library/ms187650.aspx 由于该函数不使用中间结果,因此最好保留为函数而不是存储过程。
标签: c# sql oracle-sqldeveloper ora-00911