【问题标题】:ORA-00911: invalid character in C#, but not Oracle SQL DeveloperORA-00911: C# 中的无效字符,但不是 Oracle SQL Developer
【发布时间】: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


【解决方案1】:

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

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

【讨论】:

  • 删除了';'从 C# 发送的 SQL 语句中仍然有相同的异常消息
  • @KurtWagner - 那么问题出在你用来构建字符串的东西上(这是使用绑定变量非常有用的原因之一)。如果您想避免使用绑定变量,您需要准确地告诉我们您正在构建的字符串。可以在执行之前打印 SQL 语句吗?
  • 我附加了一个使用真实案例发送的示例字符串。
  • 我有一个类似的问题,仍然不知道为什么这会解决它,但我在 notepad++ 中打开文件并从 UTF-8 BOM 转换为 UTF-8,现在它可以工作了......
【解决方案2】:

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

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

【讨论】:

  • 谢谢,这对我有帮助!顺便说一句,这是非常愚蠢的设计决定。
【解决方案3】:

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

【讨论】:

    【解决方案4】:

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

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

    希望这会节省其他人的时间。

    【讨论】:

      猜你喜欢
      • 2017-06-10
      • 1970-01-01
      • 1970-01-01
      • 2023-03-20
      • 2014-12-12
      • 2014-05-17
      • 1970-01-01
      • 2011-04-01
      • 1970-01-01
      相关资源
      最近更新 更多