我对以下代码有一个例外,这对我来说似乎很好,但是我不知道它为什么抛出这样的异常。它是什么意思
'' @ p0'附近的语法不正确。'
public static void ClearData(StoreContext context)
{
ExecuteDeleteSQL(context, "Categories");
ExecuteDeleteSQL(context, "Customers");
ResetIdentity(context);
}
public static void ExecuteDeleteSQL(StoreContext context, string tableName)
{
context.Database.ExecuteSqlCommand($"Delete from BrooksStore.{tableName}");
}
public static void ResetIdentity(StoreContext context)
{
var tables = new[] { "Categories", "Customers", "OrderDetails", "Orders", "Products", "ShoppingCartRecords" };
foreach (var itm in tables)
{
context.Database.ExecuteSqlCommand($"DBCC CHECKIDENT (\"BrooksStore.{itm}\", RESEED, -1);");
}
}
如果您需要有关我的项目的更多信息,请告诉我。 谁能帮我吗?非常感谢。
答案 0 :(得分:9)
我假设您正在使用EF Core 2,因为我遇到了同样的问题,并且它被确定为EFCore2的重大变化。
问题在于EFCore正在尝试将字符串插值转换为参数化查询,在特定情况下不允许这样做。
简单解决方案:将插值字符串转换为字符串。
context.Database.ExecuteSqlCommand((string)$"Delete from BrooksStore.{tableName}");
更多细节可以在这里找到: https://github.com/aspnet/EntityFrameworkCore/issues/9734
当我们更新EF Core使用字符串插值时 参数化我们认为这是代码的重大变化 已经使用它来做除参数化以外的事情。该 未来的指导是不让EF进行参数化 在这种情况下,可能通过像你展示的那样转换成字符串但是,是的 小心,这不会打开你的代码到SQL注入攻击 确保所有数据都被正确转义,特别是在来的时候 来自用户输入。
答案 1 :(得分:1)
我试试这个。 有用。你应该检查其他事情。
static void Main(string[] args)
{
using (HYBRIDM5_MeyerEntities context=new HYBRIDM5_MeyerEntities())
{
ExecuteDeleteSQL(context, "Sicil");
}
}
public static void ExecuteDeleteSQL(HYBRIDM5_MeyerEntities context, string tableName)
{
context.Database.ExecuteSqlCommand($"Delete from dbo.{tableName}");
}
答案 2 :(得分:0)
应该是这样的
public static void ExecuteDeleteSQL(StoreContext context, string tableName)
{
context.Database.ExecuteSqlCommand($"Delete from BrooksStore.{" + tableName + "}");
}
您必须使用来自邮件来电者
发送的 tableName