【问题标题】:SQL with C# - UPDATE not working but INSERT does work带有 C# 的 SQL - UPDATE 不起作用但 INSERT 起作用
【发布时间】:2015-12-01 10:18:16
【问题描述】:

我在 C# 中使用 SQLite,并且在数据库中有一个表,如果表为空,我想在其中插入一行,否则如果其中有一行,则更新表中的行。该表将只有一行,因此没有必要限制 UPDATE 命令。如果我注释掉更新部分和行计数部分只留下插入部分,那么它会很好地插入一行,但下面实现我想要的功能的代码会在 Visual Studio 中引发错误,我不知道为什么。

using (SQLiteConnection con = new SQLiteConnection(cs))
    {
        con.Open();

        using (SQLiteCommand cmd = new SQLiteCommand(con))
        {
            cmd.CommandText = "UPDATE details SET (initials = @init, participantID = @ID, affectedSide = @side, age = @age, comments = @comm) IF @@ROWCOUNT = 0 INSERT INTO details (initials, participantID , affectedSide , age, comments) VALUES (@init, @ID, @side, @age, @comm)";

            cmd.Parameters.AddWithValue("@init", InitalsTextBox.Text);
            cmd.Parameters.AddWithValue("@ID", IDTextBox.Text);
            cmd.Parameters.AddWithValue("@side", side);
            cmd.Parameters.AddWithValue("@age", ageindex);
            cmd.Parameters.AddWithValue("@comm", ParticipantText.Text);

            cmd.ExecuteNonQuery();
        }
        con.Close();
    }

错误:

“System.Data.SQLite.SQLiteException”类型的异常发生在 System.Data.SQLite.dll 但未在用户代码中处理

附加信息:SQL 逻辑错误或缺少数据库

“(”附近:语法错误

【问题讨论】:

  • 显示什么错误?
  • 请在此处提及您的错误
  • 我没有使用 SQLite,但我怀疑这样的命令会被您使用的客户端库解析。将其拆分为两个单独的命令,首先运行更新命令,如果它的ExecuteNonQuery 将返回 0,则运行插入命令。
  • 我添加了错误@MattMurdock
  • 为了试一试,请在 IF 语句周围加上大括号。

标签: c# sql sqlite


【解决方案1】:

试试这个,改变你的更新查询

UPDATE details SET initials = @init, participantID = @ID, affectedSide = @side, age = @age, comments = @comm IF @@ROWCOUNT = 0 INSERT INTO details (initials, participantID , affectedSide , age, comments) VALUES (@init, @ID, @side, @age, @comm)

【讨论】:

  • 仍然出现错误。附加信息:SQL 逻辑错误或缺少数据库:“IF”附近:语法错误
【解决方案2】:

只需关闭存储过程中的逻辑并使用您的参数运行它

IF(从详细信息中选择计数(*))> 0 开始 更新详情 SET 首字母 = @init,participantID = @ID,affectedSide = @side,age = @age,cmets = @comm 结尾 别的 开始 插入细节 (姓名缩写 ,参与者ID ,受影响的一面 ,年龄 ,厘米) 价值观 (@在里面 ,@ID ,@边 ,@年龄 ,@comm) 结束

【讨论】:

    【解决方案3】:

    正如@AlexK 指出的那样。在我的问题的 cmets 中:SQLite 没有 @@ROWCOUNT 也没有 IF 构造,因此实现所需功能的不同方式可以不同地实现。请参阅以下链接:

    UPSERT in SQLite

    SQL with C# - UPDATE not working but INSERT does work

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-06
      • 1970-01-01
      • 1970-01-01
      • 2014-10-22
      • 2016-11-02
      • 2016-06-19
      相关资源
      最近更新 更多