C# 带参数的c SQLite插入命令
我正在使用c将一条记录插入SQLite DB表“VS_Types”,其中包含表“VS_Groups”中的一个参数。我用SQLite浏览器对它进行了测试,它可以正常工作。而我在C中使用System.Data.sqlite实现了相同的sqlite命令。它不起作用 我将commandText修改为如下所示。看起来参数'@value0'会影响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
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,,,100Sqlite 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”的解释非常清楚!