EC Core ExecuteSqlCommandAsync使用参数截断不起作用

时间:2019-08-31 02:32:13

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

我看过以下线程: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的截断语句中不能使用变量作为表名吗?

一些屏幕截图:

enter image description here

例外:

enter image description here

第三次在异常发生前尝试

enter image description here

第三次尝试异常

enter image description here

1 个答案:

答案 0 :(得分:3)

您的第一次尝试

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

不起作用,因为Entity Framework需要使用常量字符串作为原始SQL。

您的第四次尝试

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

不起作用,因为ExecuteSqlCommandAsync无法正确映射参数。

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

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

这可以确保在将查询传递给Entity Framework时,它确切知道需要什么。