Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 正在尝试使用带有EF的SqlParameters运行Insert,获取标量变量错误,如何修复?_C#_Entity Framework_Entity Framework 6 - Fatal编程技术网

C# 正在尝试使用带有EF的SqlParameters运行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

我正在使用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.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


有一种等效的方法可以做同样的事情。

刚刚尝试了你的第一个建议,它奏效了。真的很喜欢你非常全面的回答。我现在看到对象类型了!非常感激。