ORA-00911:C#中的字符无效,但不是Oracle SQL Developer

时间:2013-08-22 00:02:50

标签: c# sql oracle-sqldeveloper ora-00911

我有一个抛出

的代码行
  

Oracle异常 - ORA-00911:无效字符

尝试以下C#代码时:

double tempDateTimeObj = Convert.ToDouble(someClass.GetTime(tempObjID, objStartTime, todayTime).Rows[0][0]);

GetTime是一个函数,它进行SQL调用,接受上面看到的变量,SQL调用OUTs为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 Dev控制台中返回一个数字。但是,当我调试并遇到该行时,C#代码会抛出00911异常。由于字符串sql已在Oracle SQL Dev中测试过,因此语法应该有效。鉴于有效的语法,为什么VS2010会抛出此错误/异常?

修改 以下是在C#中构建并发送到DB的示例字符串:

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中工作

4 个答案:

答案 0 :(得分:9)

至少,您不希望在从C#发送的SQL语句中使用尾随分号。

强烈提倡您使用绑定变量,而不是将字符串与SQL语句连接在一起。这将更有效,它将防止与共享池相关的错误,它将使您的DBA更加快乐,并且它将保护您免受SQL注入攻击。

答案 1 :(得分:2)

如果遇到同样的问题,如果其他人正在努力解决这个问题,请尝试以下方法:

删除&#34;;&#34;来自Visual Studio中的sqlSentence String。 &#34 ;;&#34;只是Oracle DBmanager中用于分隔句子的一部分,它不会在那里工作(它被识别为无效字符)

答案 2 :(得分:0)

这是一个棘手的问题。 以下字符&#34;,&#34;在调试C#应用程序时从内联SQL执行时产生错误。 它虽然在SQL Developer中运行良好。 调试终于工作了&#34;,&#34;被更传统的逗号所取代,即&#34;,&#34;。

答案 3 :(得分:0)

我以前遇到过此错误,当从C#调用存储过程时,它在owner.MyPackageName.StoredPrcedureName上给出了“无效字符”错误。经过深入研究并尝试了几个小时才能确定问题出在哪里,结果发现其中存在一些隐藏和/或特殊字符,例如\n。解决方案是重新编写查询。因此,如果外面有人在为这个问题而苦苦挣扎,则需要学习的经验教训

  1. 请勿将您的查询写在其他地方,也不要将其复制粘贴到您的 数据库编辑器/管理工具,尤其是Toad
  2. C#或任何其他语言调用存储过程之前, 确保在您的本地测试存储过程 选择的编辑器/管理工具,以防查询中出现任何错误 您可以轻松解决。

希望这可以节省别人的时间。