我在这里做错了什么?
...
using (var ctx = ObjectContextManager<MyDataContext>.GetManager("MyDataContext"))
{
var idsToUpdate = "2,3";
var parameters = new[]
{
new SqlParameter("DesiredEndDate", SqlDbType.DateTime).Value = newUpperLimit,
new SqlParameter("TasksToUpdate", SqlDbType.NVarChar).Value = idsToUpdate
};
ctx.ObjectContext.ExecuteStoreCommand("UPDATE dbo.Tasks SET DesiredEndDate = @DesiredEndDate WHERE Id IN (SELECT Id FROM dbo.fn_Split(@TasksToUpdate, N','))", parameters);
ctx.ObjectContext.SaveChanges();
}
...
我收到错误
必须声明标量变量“@DesiredEndDate”。
必须声明标量变量“@TasksToUpdate”。
但是我看不出我的代码出了什么问题:/
答案 0 :(得分:5)
我仍然不明白为什么@ParamName语法不起作用。但是有一个替代方案,它确实有效:
ctx.ObjectContext
.ExecuteStoreCommand(
"UPDATE dbo.Tasks SET DesiredEndDate = {0} WHERE Id IN (SELECT Id FROM dbo.fn_Split({1}, N','))",
newUpperLimit,
idsToUpdate);
这样做的另一个好处是我不需要创建SqlParameter
s。
答案 1 :(得分:3)
问题在于您的代码:
var parameters = new[]
{
new SqlParameter("DesiredEndDate", SqlDbType.DateTime).Value = newUpperLimit,
new SqlParameter("TasksToUpdate", SqlDbType.NVarChar).Value = idsToUpdate
};
没有创建SqlParameter
s的数组 - 它实际上是创建了2个Value
属性的数组。您可以通过将代码更改为此(无法编译)来确认:
var parameters = new SqlParameter[]
{
new SqlParameter("DesiredEndDate", SqlDbType.DateTime).Value = newUpperLimit,
new SqlParameter("TasksToUpdate", SqlDbType.NVarChar).Value = idsToUpdate
};
和这(将编译)
var parameters = new SqlParameter[]
{
new SqlParameter("DesiredEndDate", SqlDbType.DateTime),
new SqlParameter("TasksToUpdate", SqlDbType.NVarChar)
};
parameters[0].Value = newUpperLimit;
parameters[1].Value = idsToUpdate;
你也可以这样做:
var param1 = new SqlParameter("DesiredEndDate", SqlDbType.DateTime);
param1.Value = newUpperLimit;
var param2 = new SqlParameter("TasksToUpdate", SqlDbType.NVarChar);
param2.Value = idsToUpdate;
ctx.ObjectContext.ExecuteStoreCommand("...", param1, param2);