SQL Update语句不执行任何操作

本文关键字:任何 操作 执行 Update 语句 SQL | 更新日期: 2023-09-27 18:26:35

我有一个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;
}

需要指出的一点是,当我的代码在VS2010Query窗口中执行时,我会收到关于"Declare"功能的警告,但我按continue,它就工作了。我的语句不起作用是否与Declare功能有关?

如有任何想法/解决方案,我们将不胜感激。

非常感谢。

Rob

SQL Update语句不执行任何操作

由于评论讨论有点长,我将添加此作为答案。

根据文档,当数据库回滚时,ExecuteNonQuery返回-1。这可能与您给出的错误有关:

错误源:.net.sqlclient数据提供程序
错误消息:必须声明标量变量NodeToMoveID&NodeToMoveIntoID&移动到日期。

正如您提到的,您在使用SQL参数时遇到了问题。对此的一个解决方案是用updateStatement中的变量替换这些参数。

您可以尝试的另一件事是使用存储过程并更改这些参数,尽管出于某种原因,这可能也不起作用。