【问题标题】:EC Core ExecuteSqlCommandAsync Truncate with Param Doesn't WorkEC Core ExecuteSqlCommandAsync 截断参数不起作用
【发布时间】:2019-08-31 02:32:13
【问题描述】:

我看过这个帖子:How to pass parameters to the DbContext.Database.ExecuteSqlCommand method?

我感觉 EF Core 正在阻止我对 Azure Sql 数据库中的 truncate 表使用参数化查询。

我试过了:

var tableName = csvEntity.FileName.Replace(".csv", string.Empty);
var tableNameParam = new SqlParameter("@TableName", tableName);
await DbContext.Database.ExecuteSqlCommandAsync("TRUNCATE TABLE @TableName", tableNameParam);

还有:

await DbContext.Database.ExecuteSqlCommandAsync("TRUNCATE TABLE @{0}", tableNameParam);

还有:

await DbContext.Database.ExecuteSqlCommandAsync($"TRUNCATE TABLE {tableName}");

还有:

await DbContext.Database.ExecuteSqlCommandAsync("TRUNCATE TABLE {tableName}", tableName);

但所有这些都会导致:

错误:“@TableName”附近的语法不正确。

但是如果我跑了

await DbContext.Database.ExecuteSqlCommandAsync("TRUNCATE TABLE AllStarFull");

我们都很好!

你不能在带有ExecuteSqlCommandAsync的截断语句中使用变量作为表名

一些屏幕截图:

例外:

异常前的第三次尝试

第三次尝试异常

【问题讨论】:

  • 否,参数不能用于传递表名。说我想知道为什么你的$"TRUNCATE TABLE {tableName}" 不起作用。你确定你写的和这里显示的完全一样吗?当你尝试这个时,你能告诉我们你的 tableName 变量是什么吗?
  • 是的,添加了截图
  • 屏幕截图显示了您的第一次尝试。您能否向我展示您问题中的第三次尝试。一个你使用await DbContext.Database.ExecuteSqlCommandAsync($"TRUNCATE TABLE {tableName}");的地方
  • 第三次尝试更新
  • 是的,马上就这样做,并为来到这里的其他人做出正确的解释。

标签: c# sql entity-framework .net-core


【解决方案1】:

您的第一次尝试

await DbContext.Database.ExecuteSqlCommandAsync("TRUNCATE TABLE @TableName", tableNameParam);

不工作,因为表名不能作为参数传递给 SQL 语句。

您的第二次尝试

await DbContext.Database.ExecuteSqlCommandAsync("TRUNCATE TABLE @{0}", tableNameParam);

不起作用,因为替换 {0} 需要您使用 string.Format

您的第三次尝试

await DbContext.Database.ExecuteSqlCommandAsync($"TRUNCATE TABLE {tableName}");

不工作,因为实体框架需要一个常量字符串作为原始 SQL。

您的第四次尝试

await DbContext.Database.ExecuteSqlCommandAsync("TRUNCATE TABLE {tableName}", tableName);

因为ExecuteSqlCommandAsync 无法正确映射参数而无法正常工作。

为了解决这个问题,我们可以使用您的第三次尝试,如下所示。

var sqlQuery = $"TRUNCATE TABLE {tableName}";
await DbContext.Database.ExecuteSqlCommandAsync(sqlQuery);

这确保当查询被传递到实体框架时,它确切地知道需要什么。

【讨论】:

  • 解释中有些遗漏。如果您将格式字符串直接放在原始 SQL 方法中,EF Core 将用参数化查询静默替换插值字符串。这就是为什么你必须在这里单独建立字符串的原因。见docs.microsoft.com/en-us/ef/core/querying/raw-sql
猜你喜欢
  • 2021-06-26
  • 1970-01-01
  • 2015-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-13
相关资源
最近更新 更多