首页 > 解决方案 > EC Core ExecuteSqlCommandAsync 截断参数不起作用

问题描述

我看过这个线程:如何将参数传递给 DbContext.Database.ExecuteSqlCommand 方法?

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

我试过了:

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的截断语句中使用变量作为表名吗

一些屏幕截图:

在此处输入图像描述

例外:

在此处输入图像描述

异常前的第三次尝试

在此处输入图像描述

第三次尝试异常

在此处输入图像描述

标签: c#sqlentity-framework.net-core

解决方案


你的第一次尝试

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);

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


推荐阅读