System.Data.SqlClient.SqlException:' @ p0'附近的语法不正确。'

时间:2017-12-29 06:30:07

标签: c# sql-server dbcontext

我对以下代码有一个例外,这对我来说似乎很好,但是我不知道它为什么抛出这样的异常。它是什么意思

  

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

如果您需要有关我的项目的更多信息,请告诉我。 谁能帮我吗?非常感谢。

3 个答案:

答案 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