C# 正在尝试使用带有EF的SqlParameters运行Insert,获取标量变量错误,如何修复?
我正在使用EF 6和MVC5/C# 我试图通过EF上的EXECUTESTORECOMAND运行insert语句,使用C# 正在尝试使用带有EF的SqlParameters运行Insert,获取标量变量错误,如何修复?,c#,entity-framework,entity-framework-6,C#,Entity Framework,Entity Framework 6,我正在使用EF 6和MVC5/C# 我试图通过EF上的EXECUTESTORECOMAND运行insert语句,使用SqlParameter对象。我这样做是因为AddObject存在一些性能问题 我的代码是: string insertCmd = "INSERT INTO TABLE (Value,FkId) VALUES (@Value,@FkId)"; var paramList = new[]{ new SqlParameter("@Value", SqlDbType.VarCh
SqlParameter
对象。我这样做是因为AddObject
存在一些性能问题
我的代码是:
string insertCmd = "INSERT INTO TABLE (Value,FkId) VALUES (@Value,@FkId)";
var paramList = new[]{
new SqlParameter("@Value", SqlDbType.VarChar).Value = value,
new SqlParameter("@FkId", SqlDbType.Int).Value = fkId
};
db.ExecuteStoreCommand(insertCmd, paramList);
我得到一个错误:
必须声明标量变量“@Value”。无法准备对账单
我注意到它总是抱怨Insert语句中的第一列,而不管它是什么类型。因此,如果我交换它,我会得到:
必须声明标量变量“@FkId”。无法准备对账单
想法
编辑:
刚刚注意到记录被插入并保存到数据库中,但我仍然收到这个错误。困惑…如果您仔细查看编译器为变量推断的类型:
var paramList = new[]
{
new SqlParameter("@Value", SqlDbType.VarChar).Value = "SomeValue",
new SqlParameter("@FkId", SqlDbType.Int).Value = 123
};
您将看到,paramList
是一个对象[2]
,具有两个标量值Value(string)
和123(int)
,并且SqlParameters
将全部丢失,因为赋值的结果就是赋值<编译器将code>Object推断为string
和int
的最小公分母
不幸的是,对的调用不会给您任何警告,说明您没有传递SqlParameter[]
,因为它根据文档接受非常弱的类型params object[]
:
参数值可以是DbParameter对象数组或参数值数组
要解决这个问题,您可以使用一个直接接受值的SqlParameter
构造函数,例如
var paramList = new[]
{
new SqlParameter("@Value", "SomeValue"),
new SqlParameter("@FkId", 123)
};
或者创建参数,分配参数,然后添加到数组中
出于兴趣,ExecuteStoreCommand
是上的一个方法,而不是DbContext
有一种等效的方法可以做同样的事情。刚刚尝试了你的第一个建议,它奏效了。真的很喜欢你非常全面的回答。我现在看到对象类型了!非常感激。