8

我有一个抛出一个代码行

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 Dev 控制台中返回一个数字。但是,当我调试并遇到该行时,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

尽管都在 Oracle SQL Dev 中工作,但已尝试在 C# 字符串中使用分号和没有分号并导致相同的 Oracle 异常

4

4 回答 4

9

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

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

于 2013-08-22T00:06:01.007 回答
2

有同样的问题,如果其他人正在努力解决这个问题,请尝试以下操作:

去除 ”;” 来自 Visual Studio 中的 sqlSentence 字符串。这 ”;” 只是用于分隔句子的 Oracle DBmanager 的一部分,它在那里不起作用(它被识别为无效字符)

于 2015-01-14T14:47:15.420 回答
0

这是一个棘手的问题。以下字符“,”在调试 C# 应用程序时从内联 SQL 执行时产生错误。不过,它在 SQL Developer 中运行良好。当“,”被替换为更传统的逗号,即“,”时,调试终于起作用了。

于 2017-02-20T17:12:02.493 回答
0

我之前遇到过这个错误,当从C#它调用存储过程时,会在owner.MyPackageName.StoredPrcedureName. 在深入挖掘并尝试数小时以确定问题究竟出在哪里之后,结果发现存在一些隐藏和/或特殊字符,例如\n. 解决方案是重新编写查询。所以,如果有人在这个问题上苦苦挣扎,要吸取教训

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

希望这会节省别人的时间。

于 2019-02-11T19:55:52.587 回答