代码之家  ›  专栏  ›  技术社区  ›  Ahmad

名称中包含破折号的列的参数

  •  2
  • Ahmad  · 技术社区  · 4 月前

    我正在将Dapper与SQLite结合使用。

    我有一个这样定义的表:

    CREATE TABLE Example (
       id            INTEGER NOT NULL,
       "some-field"  TEXT  
    );
    

    我用C#编写了一个控制台应用程序,将值插入到上表中:

    public void Insert(int id, string somefield)
    {
        using(var db = new SQLiteConnection("..."))
        {
            string sql = "INSERT INTO Example (Id, [some-field]) VALUES (@id, @somefield)";
            db.Execute(sql, new { id, somefield });
        }
    }
    

    请注意,我必须重命名sql语句中的参数。 我的程序实际上动态构建了sql insert语句,但为了解决这个问题,让我们假设我想传递一个与列名匹配的参数:

       INSERT INTO Example (id, [some-field]) VALUES (
         @id,           -- this is fine
         [@some-field]  -- SQL logic error: no such column @some-field
         @[some-field]  -- SQL logic error: unrecognized token: "@"
         @"some-field"  -- same error as above
         "@some-field"  -- works, but inserts the literal value, not the passed in parameter
       );
    

    我甚至尝试将字典作为参数传递:

    public void Insert(int id, string somefield)
    {
       var parameters = new Dictionary<string, object>()
       {
           ("id", id),
           ("some-field", somefield),      
           ("@some-field", somefield),     
           ("@\"some-field\"", somefield), 
       };
       ...
       db.Execute(sql, parameters);
       ...
    

    是否可以编写一个插入语句,其中列的名称中有破折号,然后为与列名同名的参数赋值?

    正如我所说的,列名是动态计算的,必须“按原样”使用。

    1 回复  |  直到 4 月前
        1
  •  1
  •   Guru Stron    4 月前

    Binding Values To Prepared Statements SQLite文档(强调我的):

    在输入到sqlite3_prepare_v2()及其变体的SQL语句文本中,字面值可以用与以下模板之一匹配的参数替换:

    • ?
    • ?NNN
    • :VVV
    • @VVV
    • $VVV

    在上述模板中NNN表示整数文字, VVV表示字母数字标识符 这些参数的值(也称为“主机参数名”或“SQL参数”)可以使用此处定义的sqlite3_bind_*()例程进行设置。

    - 它不是字母数字的一部分,因此不能用作参数名的一部分。因此,您需要对列名进行净化,才能将其用作参数名。