给定以下 MySQL 的 SQL 语句
var sql = @"INSERT INTO MyTable (Key1, Field1, Field2, Field3)
VALUES (@key, @field1, @field2, @field3)
ON DUPLICATE UPDATE Field3 = @existing";
我通常会像这样建立值列表(为此演示进行了高度修改):
var values = new List<Object> {
{ key = "xxx", field1 = "xxx", field2 = "xxx", field3 = "xxx" },
{ key = "xxx", field1 = "xxx", field2 = "xxx", field3 = "xxx" },
{ key = "xxx", field1 = "xxx", field2 = "xxx", field3 = "xxx" },
};
然后我会简单地通过使用来执行这个:
await connection.ExecuteAsync(sql, values);
但是现在,我需要在同一 SQL 语句中添加这个额外的“ON DUPLICATE”语句。我如何将 params 对象放在一起来处理“@existing”参数?
您需要将
existing
参数添加到您传递给ExecuteAsync
的参数值集合中的每个匿名对象。
例如,这最终只在数据库中插入一行,
Field3
的值为 "three"
:
var values = new List<Object> {
new { key = "xxx", field1 = "xxx", field2 = "xxx", field3 = "xxx", existing = "one" },
new { key = "xxx", field1 = "xxx", field2 = "xxx", field3 = "xxx", existing = "two" },
new { key = "xxx", field1 = "xxx", field2 = "xxx", field3 = "xxx", existing = "three" },
};
await connection.ExecuteAsync("""
INSERT INTO MyTable (Key1, Field1, Field2, Field3)
VALUES (@key, @field1, @field2, @field3)
ON DUPLICATE KEY UPDATE Field3 = @existing
""", values);
(如果您希望插入的每一行的
@existing
值相同,您可以在每个匿名对象中将 existing =
设置为相同的值,而不是像我在本例中所做的那样使它们不同。)