Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ORA-00911:C#中的字符无效,但不是Oracle SQL Developer_C#_Sql_Oracle Sqldeveloper_Ora 00911 - Fatal编程技术网

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

ORA-00911:C#中的字符无效,但不是Oracle SQL Developer,c#,sql,oracle-sqldeveloper,ora-00911,C#,Sql,Oracle Sqldeveloper,Ora 00911,我有一个代码行,它抛出一个 Oracle异常-ORA-00911:无效字符 尝试以下C#代码时: GetTime是一个函数,它执行一个SQL调用,该调用接受上面看到的变量,SQL调用一个Oracle数字类型,然后GetTime C#函数每次返回一行的DataTableCollection Tables对象 public static DataTable GetTime(string tempObjID, DateTime objStartTime, DateTime todayTime) {

我有一个代码行,它抛出一个

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

尝试以下C#代码时:

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];
}

在C#字符串中使用分号和不使用分号都已尝试过,并导致相同的Oracle异常,尽管两者至少都在Oracle SQL Dev中工作,但您不希望在从C#发送的SQL语句中使用尾随分号


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

也有同样的问题,如果其他人正在解决此问题,请尝试以下方法:

从VisualStudio中的SqlSession字符串中删除“;”。“;”只是OracleDBManager的一部分,用于分隔句子,在那里无法工作(它被识别为无效字符)

这是一个棘手的问题。 调试C#应用程序时,从内联SQL执行以下字符时产生错误。 不过,它在SQL开发人员那里工作得很好。
当“,”被替换为更常用的逗号,即“,”时,调试终于起作用了。

我以前遇到过这个错误,当从
C#
调用存储过程时,它在
owner.MyPackageName.storedProcedureName处给出了“无效字符”错误。在深入挖掘并尝试数小时来确定问题的确切位置后,发现有一些隐藏和/或特殊字符,如
\n
。解决方案是重新编写查询。因此,如果有人正在与这个问题作斗争,那么就要吸取教训

  • 不要把你的查询写在别的地方,把它们复制到你的数据库中 数据库编辑器/管理工具,尤其是
    Toad
  • 在从
    C
    或任何其他语言调用存储过程之前, 确保在计算机上本地测试存储过程 查询中出现任何错误时,可选择编辑器/管理工具 你很容易就能弄明白

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

    删除了“;”从C#发送的SQL语句中,仍然有相同的异常message@KurtWagner-那么问题就出在你用来构建字符串的东西上(这是使用绑定变量非常有用的一个原因)。如果您想避免使用绑定变量,您需要准确地告诉我们您正在构建的字符串。你能在执行SQL语句之前打印它吗?我已经附加了一个使用真实案例发送的示例字符串。我有一个类似的问题,仍然不确定为什么会修复它,但我用记事本++打开了文件,并从UTF-8 BOM转换为UTF-8,现在它可以工作了…
    Kurt
    为什么不创建一个存储过程并使用参数化查询存储过程的主要目的是生成要加载到临时表中的中间结果,然后在SELECT语句中查询临时表。INSERT…EXEC语句可以使用表值函数编写。“由于函数不使用中间结果,因此最好作为函数而不是存储过程。谢谢,这对我很有帮助!顺便说一句,这是一个非常愚蠢的设计决策。
    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];
    }
    
    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