使用C#的SQL - UPDATE不起作用但INSERT确实有效

时间:2015-12-01 10:18:17

标签: c# sql sqlite

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

     

near“(”:语法错误

3 个答案:

答案 0 :(得分:0)

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

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)

答案 1 :(得分:0)

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

运行它

IF(SELECT COUNT(*)FROM details)> 0 开始   更新详情   SET initials = @ init,participantID = @ID,affectedSide = @side,age = @age,comments = @comm 结束 其他 开始   插入详细信息   (英文缩写   ,participantID   ,affectedSide   ,年龄   ,评论)   VALUES   (@在里面   ,@ID   ,@侧   ,@年龄   @ COMM) END

答案 2 :(得分:0)

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

UPSERT in SQLite

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