首页 > 解决方案 > 时间: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

标签: c#sqlite

解决方案


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 == nullColor == 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 约束。


推荐阅读