Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.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 SQLite插入命令_C#_Sqlite - Fatal编程技术网

C# 带参数的c SQLite插入命令

C# 带参数的c SQLite插入命令,c#,sqlite,C#,Sqlite,我正在使用c将一条记录插入SQLite DB表“VS_Types”,其中包含表“VS_Groups”中的一个参数。我用SQLite浏览器对它进行了测试,它可以正常工作。而我在C中使用System.Data.sqlite实现了相同的sqlite命令。它不起作用 我将commandText修改为如下所示。看起来参数'@value0'会影响c SQLite命令的执行 cmd.CommandText = "INSERT INTO VS_Types(Name, Group_id, Color) Value

我正在使用c将一条记录插入SQLite DB表“VS_Types”,其中包含表“VS_Groups”中的一个参数。我用SQLite浏览器对它进行了测试,它可以正常工作。而我在C中使用System.Data.sqlite实现了相同的sqlite命令。它不起作用

我将commandText修改为如下所示。看起来参数'@value0'会影响c SQLite命令的执行

cmd.CommandText = "INSERT INTO VS_Types(Name, Group_id, Color) Values('20', 10, 1245679);";
SQLite SQL:

SELECT @value0=ID FROM VS_Groups WHERE (Name = 'Ato_h');
INSERT INTO VS_Types(Name, Group_id, Color)  VALUES('20', @value0, 65536);
C语言中的代码

using (SQLiteConnection conn = new SQLiteConnection(cs))
{
    try
    {
        conn.Open();
        SQLiteCommand cmd = new SQLiteCommand(conn);
        cmd.CommandText = "Select @groudId = ID From VS_Groups Where(Name = 'Ato_h'); " 
        + "INSERT INTO VS_Types(Name, Group_id, Color) Values('20', @groudId, 1245679);";

        cmd.ExecuteNonQuery();
        conn.Close();

        testOutput.WriteLine("Insert Successful");
    }
    catch (Exception ex)
    {
        this.testOutput.WriteLine("Failed to open connection: {0}", ex.Message);
    }
}
请给我一些关于在这种情况下如何使用C Sqlite命令中的参数的建议

更新:VS_组和VS_类型表及其内容

CREATE TABLE "VS_Groups" (
    `ID`    INTEGER PRIMARY KEY AUTOINCREMENT,
    `Name`  TEXT,
    `Width` INTEGER,
    `Height`    INTEGER,
    `Flags` INTEGER,
    `Limi_recognition`  INTEGER,
    `Base`  TEXT,
    `Flags1`    INTEGER,
    `Limit_recognition` INTEGER,
    `Flags2`    INTEGER,
    `Limit_recognition2`    INTEGER,
    `Distance_threshold`    INTEGER
)

CREATE TABLE `VS_Types` (
   `ID` INTEGER PRIMARY KEY AUTOINCREMENT,
   `Name`   TEXT,
   `Group_id`   INTEGER,
   `Color`  INTEGER
)

现有的记录是:9,Ato_h,16014065536,,,,,400,,,100

Sqlite SQL不是这样工作的。不能在变量中声明和存储值,然后在以后重用该变量。像@groudId这样的术语只是传递给查询的参数的占位符。这意味着表达式@groudId=ID不是赋值,而是比较。由于没有将参数@groudId绑定到任何对象,因此参数值为null,因此表达式是类似null=ID的比较,这将导致数值为0的false。select语句返回0,不在INSERT语句中使用

如果INSERT工作正常,可能会导致类似INSERT-INTO-VS_-TypesName、Group_-id、颜色值'20',null、1245679

在问题的最后,你还说现有的记录是。。。尽管insert语句是针对表VS_类型的,但是您只显示VS_组的一条记录。但是您不会显示VS_类型表的输出!您正在检查插入数据的错误表。如果查询表VS_类型,可能会发现许多记录的名称='20',GroupID==null,颜色==123456789。。。正如INSERT语句所说的那样

总之,您没有正确地使用参数,但在显示的代码中甚至不需要参数,因此很难知道如何正确地回答。显示正确使用参数的答案将被浪费,但替换SQL可能最终也不是您想要的。我建议单独研究参数,以了解如何正确使用它们。现在,请使用以下嵌套语句:

INSERT INTO VS_Types(Name, Group_id, Color) 
VALUES ('20', (Select ID From VS_Groups Where Name = 'Ato_h'), 1245679);

遗憾的是,这还不是全部。表定义没有显示VS_Groups.Name是唯一的,因此技术上可能有多行与嵌套查询匹配,因此INSERT语句仍然可能失败。我建议在VS_Groups.Name列中添加一个唯一的约束。

您能否提供有关引发异常的更多详细信息,例如异常的类型、消息、它包含的任何其他数据以及引发异常的确切方法调用?没有异常。实际上,代码执行到Insert SUCCESS行。我将更新SQLite表content相当确定ExecuteOnQuery只适用于一条语句选择anyways有什么意义?。另外,您没有将任何内容绑定到@groudId…我使用@groupId作为占位符来存储来自VS_组的Select查询的结果,然后将其插入表VS中_Types@ShawnSystem.Data.SQLite命令对象的最新版本将执行多条语句。您好,Perkins,谢谢您的回答。嵌套语句正在工作。事实上,VS_Groups.Name是唯一的。谢谢。您对“@groudId=ID”的解释非常清楚!