我正在将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);
...
是否可以编写一个插入语句,其中列的名称中有破折号,然后为与列名同名的参数赋值?
正如我所说的,列名是动态计算的,必须“按原样”使用。