Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.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
C# 带C-UPDATE的SQL不起作用,但INSERT起作用_C#_Sql_Sqlite - Fatal编程技术网

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

C# 带C-UPDATE的SQL不起作用,但INSERT起作用,c#,sql,sqlite,C#,Sql,Sqlite,我将SQLite与C一起使用,并且在数据库中有一个表,如果该表为空,我希望在该表中插入一行,否则,如果该表中有行,则更新该表中的行。此表将只有一行,因此无需约束UPDATE命令。如果我注释掉update部分和row count部分,只保留insert部分,那么它将插入一行,但是下面实现我想要的功能的代码在VisualStudio中抛出了一个错误,我不知道为什么 using (SQLiteConnection con = new SQLiteConnection(cs)) {

我将SQLite与C一起使用,并且在数据库中有一个表,如果该表为空,我希望在该表中插入一行,否则,如果该表中有行,则更新该表中的行。此表将只有一行,因此无需约束UPDATE命令。如果我注释掉update部分和row count部分,只保留insert部分,那么它将插入一行,但是下面实现我想要的功能的代码在VisualStudio中抛出了一个错误,我不知道为什么

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:语法错误


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

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中选择计数* 开始 更新详细信息 设置首字母=@init,participantID=@ID,affectedSide=@side,age=@age,comm=@comm 终止 其他的 开始 插入细节 首字母 ,参与者 ,受影响的方面 年龄 ,评论 价值观 @初始化 ,@ID ,@side 岁 ,@comm
结束

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


它显示了什么错误?请在这里提到您的错误我没有使用SQLite,但我怀疑,像这样的命令是否会被您使用的客户端库解析。将其拆分为两个单独的命令,首先运行update命令,如果其ExecuteOnQuery将返回0,则运行insert命令。我已添加了错误@mattmurdock。为了便于尝试,请在if语句周围加上大括号。仍然会出现错误。其他信息:SQL逻辑错误或缺少数据库:接近IF:语法错误