我有一个SQL Update
语句,当通过新的查询窗口在VS2010中运行时,但是当我将它构造为更新语句时没有任何反应。
我想知道是否有人能看到我做错了什么?就像我说的那样,代码在通过VS2010中的查询窗口执行时起作用。
这是我的代码:
SqlConnection connection = new SqlConnection(DBConnection.GetConnection().ConnectionString);
string updateStatement =
"DECLARE @OldParent hierarchyid, @NewParent hierarchyid " +
"SELECT @OldParent = Hierarchy FROM SpecProducts " +
"WHERE ID = @NodeToMoveID ; ------ top item to be moved " +
"SELECT @NewParent = Hierarchy FROM SpecProducts " +
"WHERE ID = @NodeToMoveIntoID ; -- ID of item to move into - new parent " +
"DECLARE children_cursor CURSOR FOR " +
"SELECT Hierarchy FROM SpecProducts " +
"WHERE Hierarchy = @OldParent; " +
"DECLARE @ChildId hierarchyid; " +
"OPEN children_cursor " +
"FETCH NEXT FROM children_cursor INTO @ChildId; " +
"WHILE @@FETCH_STATUS = 0 " +
"BEGIN " +
"START: " +
"DECLARE @NewId hierarchyid; " +
"SELECT @NewId = @NewParent.GetDescendant(MAX(Hierarchy), NULL) " +
"FROM SpecProducts WHERE Hierarchy.GetAncestor(1) = @NewParent; " +
"UPDATE SpecProducts " +
"SET Hierarchy = Hierarchy.GetReparentedValue(@ChildId, @NewId), " +
"MovedToDate = @MovedToDate, " +
"MovedToBy = @MovedToBy " +
"WHERE Hierarchy.IsDescendantOf(@ChildId) = 1; " +
"IF @@error <> 0 GOTO START -- On error, retry " +
"FETCH NEXT FROM children_cursor INTO @ChildId; " +
"END " +
"CLOSE children_cursor; " +
"DEALLOCATE children_cursor;";
SqlCommand updateCommand = new SqlCommand(updateStatement, connection);
updateCommand.Parameters.AddWithValue("@NodeToMoveID", nodeIDToMove);
updateCommand.Parameters.AddWithValue("@NodeToMoveIntoID", newParentID);
updateCommand.Parameters.AddWithValue("@MovedToDate", DateTime.Now);
updateCommand.Parameters.AddWithValue("@MovedToBy", userModifying.ID);
try
{
connection.Open();
updateCommand.ExecuteNonQuery();
return true;
}
有一点需要指出的是,当我的代码在VS2010查询窗口中执行时,我收到有关“声明”功能的警告,但是我按下继续并且它可以工作。我的陈述不起作用与Declare功能有什么关系吗?
非常感谢任何想法/解决方案。
非常感谢。
罗布
答案 0 :(得分:1)
我将此作为答案添加,因为评论讨论有点长。
根据documentation,当存在数据库回滚时,ExecuteNonQuery
返回-1。这可能与您提供的错误有关:
错误来源: .net.sqlclient数据提供者
错误消息:必须声明标量变量NodeToMoveID&amp; NodeToMoveIntoID&amp; MovedToDate。
正如您所提到的,您在使用SQL参数时遇到了问题。对此的一个解决方案是用updateStatement
中的变量替换这些参数。
您可以尝试的另一件事是使用存储过程并更改这些参数,尽管由于某些原因这可能也不起作用。