c# - 时间:2019-01-01 标签:c#sqliteinsert into command with parameter
问题描述
我正在使用 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_Groups 和 VS_Types 表及其内容
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,160,140,65536,,,,400,,,100
解决方案
Sqlite SQL 不能那样工作。您不能在变量中声明和存储值,然后再重用该变量。像这样的术语@groudId
只是传递给查询的参数的占位符。这意味着表达式@groudId = ID
不是赋值,而是比较。由于您没有将参数绑定@groudId
到任何东西,因此参数值为空,因此表达式是一个比较null = ID
,它将导致 false 数字为 0(零)。select 语句返回 0,并且未在 INSERT 语句中使用。
如果 INSERT 正在工作,它可能会导致类似的结果INSERT INTO VS_Types(Name, Group_id, Color) Values('20', null, 1245679);
在问题的最后,您还说“现有记录是......”并且您只显示 VS_Groups 的一条记录,尽管插入语句是针对表 VS_Types 的。但是您没有显示 VS_Types 表的输出!您正在检查插入数据的错误表。如果您查询表 VS_Types,您可能会发现许多带有Name == '20'
,GroupID == null
和Color == 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
列中添加一个 UNIQUE 约束。
推荐阅读
- node.js - 如何通过get方法返回mongodb管道的结果?
- java - java.lang.NoClassDefFoundError:org/springframework/web/util/UriTemplateHandler
- python - 保存在python中的for循环内创建的动画
- android - 两个活动通信中如何避免空指针异常
- c# - 尝试使用“c# 上的启动 url”但不起作用
- javascript - CSV 到 JSON 函数 - 未捕获的类型错误:无法读取未定义的属性“拆分”
- github - Github CI/CD 管道使用 webpack 崩溃
- python - 搜索文本文件并找到用值替换字典键
- amazon-ec2 - 错误 504 网关超时 nginx-ingress 控制器
- java - 处理动态 webtable 中的同步问题