参数化原始 SQL 更新在 EF Core 中不起作用
Parameterized Raw SQL Update not working in EF Core
我正在尝试参数化我正在使用 Entity Framework Core 6 执行的 SQL 语句。参数没有按预期工作。我希望所有这些语句都能起作用,但它们不起作用:
await _context.Database.ExecuteSqlInterpolatedAsync(
$@"UPDATE Schema.Table
SET {columnName}={Convert.ToByte(value)}
WHERE Id = {id}");
await _context.Database.ExecuteSqlRawAsync(
@"UPDATE Schema.Table
SET {0}={1}
WHERE Id= {2}", columnName, Convert.ToByte(value), id);
var p0 = new SqlParameter("@column", columnName);
var p1 = new SqlParameter("@value", Convert.ToByte(value));
var p2 = new SqlParameter("@id", id);
await _context.Database.ExecuteSqlRawAsync(
@"UPDATE Schema.Table
SET @column=@value
WHERE Id = @id", p0, p1, p2);
我确实让它可以处理这两个查询,但它们没有正确参数化:
await _context.Database.ExecuteSqlRawAsync(
$@"UPDATE Schema.Table
SET {columnName}={{0}}
WHERE Id = {{1}}", Convert.ToByte(value), id);
var cmdUpdate = $"UPDATE Schema.Table " +
$"SET {columnName}={Convert.ToByte(value)} " +
$"WHERE Id = {id}";
await _context.Database.ExecuteSqlRawAsync(cmdUpdate);
问题似乎与参数化列名有关,但我找不到任何表明我不能这样做的内容。有没有办法参数化列名?
我以前做过这样的事情
试试这个:
_context.Database.ExecuteSqlCommand(
$"update schema.table
set columnName= :value1
where columnName= :value2 and columnName is null", value1, value2);
I can not find anything that says I can't do this
但是您找不到任何可以可以的东西。这一事实以及您自己的测试向我们表明这是不允许的。与Entity Framework无关;这是 SQL 服务器的限制。 Entity Framework 使用 sp_executesql
to execute queries with parameters, and parameters just won't work for column or table names. You're certainly not the first to ask.
如您所见,您可以使用 C# 字符串插值,但要小心。如果您的 columnName
变量是从用户输入中获取的,它会让您面临 SQL 注入。所以在执行查询之前确保它是一个真实的列名。
我正在尝试参数化我正在使用 Entity Framework Core 6 执行的 SQL 语句。参数没有按预期工作。我希望所有这些语句都能起作用,但它们不起作用:
await _context.Database.ExecuteSqlInterpolatedAsync(
$@"UPDATE Schema.Table
SET {columnName}={Convert.ToByte(value)}
WHERE Id = {id}");
await _context.Database.ExecuteSqlRawAsync(
@"UPDATE Schema.Table
SET {0}={1}
WHERE Id= {2}", columnName, Convert.ToByte(value), id);
var p0 = new SqlParameter("@column", columnName);
var p1 = new SqlParameter("@value", Convert.ToByte(value));
var p2 = new SqlParameter("@id", id);
await _context.Database.ExecuteSqlRawAsync(
@"UPDATE Schema.Table
SET @column=@value
WHERE Id = @id", p0, p1, p2);
我确实让它可以处理这两个查询,但它们没有正确参数化:
await _context.Database.ExecuteSqlRawAsync(
$@"UPDATE Schema.Table
SET {columnName}={{0}}
WHERE Id = {{1}}", Convert.ToByte(value), id);
var cmdUpdate = $"UPDATE Schema.Table " +
$"SET {columnName}={Convert.ToByte(value)} " +
$"WHERE Id = {id}";
await _context.Database.ExecuteSqlRawAsync(cmdUpdate);
问题似乎与参数化列名有关,但我找不到任何表明我不能这样做的内容。有没有办法参数化列名?
我以前做过这样的事情
试试这个:
_context.Database.ExecuteSqlCommand(
$"update schema.table
set columnName= :value1
where columnName= :value2 and columnName is null", value1, value2);
I can not find anything that says I can't do this
但是您找不到任何可以可以的东西。这一事实以及您自己的测试向我们表明这是不允许的。与Entity Framework无关;这是 SQL 服务器的限制。 Entity Framework 使用 sp_executesql
to execute queries with parameters, and parameters just won't work for column or table names. You're certainly not the first to ask.
如您所见,您可以使用 C# 字符串插值,但要小心。如果您的 columnName
变量是从用户输入中获取的,它会让您面临 SQL 注入。所以在执行查询之前确保它是一个真实的列名。