尝试 运行 使用带有 EF 的 SqlParameters 插入,出现标量变量错误,如何解决?
Trying to run Insert with SqlParameters with EF, getting scalar variable error, How to fix?
我正在使用 EF 6 MVC5/C#
我正在尝试 运行 插入语句,使用 SqlParameter
对象,通过 ExecuteStoreCommand
通过 EF。我这样做是因为 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);
我遇到错误:
Must declare the scalar variable "@Value". Statement(s) could not be prepared.
我注意到它总是抱怨 Insert 语句中的第一列,无论类型如何。所以如果我交换它,我会得到:
Must declare the scalar variable "@FkId". Statement(s) could not be prepared.
想法?
编辑:
刚刚注意到记录被插入并保存到数据库中,但我仍然收到此错误。不解...
如果您仔细查看编译器为变量推断的类型:
var paramList = new[]
{
new SqlParameter("@Value", SqlDbType.VarChar).Value = "SomeValue",
new SqlParameter("@FkId", SqlDbType.Int).Value = 123
};
您会看到 paramList
是一个具有两个标量值 Value(string)
和 123(int)
的 Object[2]
,并且 SqlParameters
完全丢失,因为赋值的结果就是赋值! Object
被编译器推断为 string
和 int
.
的最小公分母
不幸的是,调用 ExecuteStoreCommand
不会给你任何警告,表明你没有传递 SqlParameter[]
,因为它根据文档接受非常弱的类型 params object[]
:
The parameters value can be an array of DbParameter objects or an array of parameter values
要解决这个问题,您可以使用直接接受值的 SqlParameter
构造函数之一,例如
var paramList = new[]
{
new SqlParameter("@Value", "SomeValue"),
new SqlParameter("@FkId", 123)
};
或者创建参数,分配它们,然后添加到数组中。
出于兴趣,ExecuteStoreCommand
是 ObjectContext
上的方法,而不是 DbContext。
有一个等效方法 DbContext.Database.ExecuteSqlCommand
应该做同样的事情。
我正在使用 EF 6 MVC5/C#
我正在尝试 运行 插入语句,使用 SqlParameter
对象,通过 ExecuteStoreCommand
通过 EF。我这样做是因为 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);
我遇到错误:
Must declare the scalar variable "@Value". Statement(s) could not be prepared.
我注意到它总是抱怨 Insert 语句中的第一列,无论类型如何。所以如果我交换它,我会得到:
Must declare the scalar variable "@FkId". Statement(s) could not be prepared.
想法?
编辑:
刚刚注意到记录被插入并保存到数据库中,但我仍然收到此错误。不解...
如果您仔细查看编译器为变量推断的类型:
var paramList = new[]
{
new SqlParameter("@Value", SqlDbType.VarChar).Value = "SomeValue",
new SqlParameter("@FkId", SqlDbType.Int).Value = 123
};
您会看到 paramList
是一个具有两个标量值 Value(string)
和 123(int)
的 Object[2]
,并且 SqlParameters
完全丢失,因为赋值的结果就是赋值! Object
被编译器推断为 string
和 int
.
不幸的是,调用 ExecuteStoreCommand
不会给你任何警告,表明你没有传递 SqlParameter[]
,因为它根据文档接受非常弱的类型 params object[]
:
The parameters value can be an array of DbParameter objects or an array of parameter values
要解决这个问题,您可以使用直接接受值的 SqlParameter
构造函数之一,例如
var paramList = new[]
{
new SqlParameter("@Value", "SomeValue"),
new SqlParameter("@FkId", 123)
};
或者创建参数,分配它们,然后添加到数组中。
出于兴趣,ExecuteStoreCommand
是 ObjectContext
上的方法,而不是 DbContext。
有一个等效方法 DbContext.Database.ExecuteSqlCommand
应该做同样的事情。