带有C#的SQL-UPDATE不起作用,但INSERT起作用

本文关键字:INSERT 起作用 不起作用 SQL-UPDATE 带有 | 更新日期: 2023-09-27 18:25:07

我使用的是带有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逻辑错误或缺少数据库

接近"(":语法错误

带有C#的SQL-UPDATE不起作用,但INSERT起作用

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

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)

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

如果(从详细信息中选择计数(*))>0开始更新详细信息SET首字母缩写=@init,participantID=@ID,affectedSide=@side,age=@age,comments=@comm完其他开始插入详细信息(首字母缩写,参与者ID,受影响的侧面年龄,评论)值(@init,@ID,@侧面,@年龄,@comm)结束

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

SQLite 中的UPSERT

带有C#的SQL-UPDATE不起作用,但INSERT起作用