【问题标题】:Missing Comma, oracle ORA-00917缺少逗号,oracle ORA-00917
【发布时间】:2016-06-02 13:15:26
【问题描述】:

我有这段代码用于将值插入到 oracle 数据库中,我得到“缺少逗号”异常,我看不到它来自哪里。

 "insert into comandadvd values('" + txt_idComanda.Text + "','" +
                    txtFormat.Text + "','" + "', to_date('" + txtData.Text + "','DDMMYYY')'" + txtIdTipPlata.Text + "','" + txtPret.Text + "')";

这里还有它的 Oracle 代码:

INSERT INTO ComandaDVD (Id_Comanda,Id_Format,Data_Comanda,Id_TipPlata,Pret)
VALUES ('1','1','12-11-2011','1','200');

提前致谢!

【问题讨论】:

  • 您给出的命令是值示例还是实际命令?如果txtFormat.Text 曾经包含O'Leary(或者实际上是Robert'); DROP TABLE ComandaDvd; --),这将非常失败——请阅读 SQL 注入和参数化命令。
  • insert语句在数据库中单独工作,在c#代码中失败?
  • @JeroenMostert Robert'); DROP TABLE ComandaDvd; -- 将失败,因为 Oracle(与其他一些 RDBMS 不同)不允许在同一命令中使用多个语句。
  • @MT0:公平点,对于这个特定的命令——当然,SQL 注入对 Oracle 来说也是一个真正的风险。
  • @JeroenMostert: Little Bobby Tables :-)

标签: c# sql oracle


【解决方案1】:
  • 尝试一次

"insert into comandadvd values('" + txt_idComanda.Text + "','" + txtFormat.Text + "','" + "' to_date('" + txtData.Text + "','DDMMYYY')'" + "','" + txtIdTipPlata.Text + "','" + txtPret.Text + "')";

【讨论】:

    【解决方案2】:
    1. 日期前多了一个逗号。日期部分 to_date 不应包含在引号内。
    2. 日期格式错误。您在示例中提到了DD-MM-YYYY

    试试这个,因为我还没有测试过,如果你遇到错误,请告诉我。

    "insert into comandadvd values('" + txt_idComanda.Text + "','" + txtFormat.Text + "','" + "to_date('" 
    + txtData.Text + "','DD-MM-YYY')" + txtIdTipPlata.Text + "','" + txtPret.Text + "')";
    

    【讨论】:

      【解决方案3】:

      错误的直接原因在

      "','" + "', to_date('"
      

      碎片化。最好的解决方案是使用参数化查询:

        @"insert into comandadvd (
            Id_Comanda,
            Id_Format,
            Data_Comanda,
            Id_TipPlata,
            Pret)
          values ( 
            :prm_Id_Comanda,
            :prm_Id_Format,
            :prm_Data_Comanda,
            :prm_Id_TipPlata,
            :prm_Pret)";
      

      如果由于某种原因您不能使用 parametrized 查询,请使用 formatted 之一:

         String.Format(
           @"insert into comandadvd (
               Id_Comanda,
               Id_Format,
               Data_Comanda,
               Id_TipPlata,
               Pret)
             values ( 
               {0},
               {1},
               to_date('{2}', 'DDMMYYY'),
               {3},
               {4})",
            txt_idComanda.Text,
            txtFormat.Text, 
            txtData.Text,
            txtIdTipPlata.Text,
            txtPret.Text);
      

      指导原则是让您的 SQL 可读

      【讨论】:

        【解决方案4】:

        您在查询中的 to_date( 之前添加了额外的逗号。更正后的代码如下:

        "INSERT INTO ComandaDVD (Id_Comanda,Id_Format,Data_Comanda,Id_TipPlata,Pret) VALUES (" +
            "'" + txt_idComanda.Text + "', " +
            "'" + txtFormat.Text + "', " +
            "to_date('" + txtData.Text + "', 'DDMMYYY'), " +
            "'" + txtIdTipPlata.Text + "', " + 
            "'" + txtPret.Text + "')";
        

        【讨论】:

        • 你是对的 Arulkumar。我完全忘记了参数。
        【解决方案5】:

        似乎有多个问题:

        1. 最大的问题是你没有运行代码来看看它到底做了什么——见证代码中使用的表名和SELECT中显示的表名大小写不同,并且有一个字段在已发布的SELECT 中列出代码不会生成的列表;因此,您发布的SELECT 文本显然不是由该代码生成的。如果您确实运行代码并生成了 INSERT 语句,您会发现它不像您认为那样工作,您可以自己修复它.
        2. 此代码将在to_date 之前放置多个逗号。
        3. 代码不会在txtIdTipPlata.Text之前生成逗号。
        4. INSERT 语句应始终包含要插入的字段名称列表。

        祝你好运。

        【讨论】:

        • Oracle 不关心对象名称的大小写,除非双引号,所以这不是问题。此外,代码仅提供要插入的值,没有列名。代码中的值与 select 语句中的列名完全匹配。所以这也不是问题。正如您所指出的,连接字符串中的额外逗号确实是问题所在,OP 可能意味着在日期之后和 idtipplata 之前添加它。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-11-21
        • 2013-10-07
        • 2019-09-12
        • 1970-01-01
        • 2022-12-07
        相关资源
        最近更新 更多