【问题标题】:SQL Update Statement Does NothingSQL 更新语句什么都不做
【发布时间】:2013-08-06 16:30:22
【问题描述】:

我有一个 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 功能有关吗?

任何想法/解决方案将不胜感激。

非常感谢。

罗伯

【问题讨论】:

  • 旁注:您应该在执行查询后立即关闭您的连接...
  • 不要硬编码这些sql语句,为什么不把它变成一个存储过程呢?
  • 如果您在SqlCommand updateCommand = new SqlCommand(updateStatement, connection); 处设置断点并获取updateStatement 的值,在查询窗口中运行此命令,是否有效?
  • 是否抛出了任何类型的异常,或者它通过查询没有问题?另外,查看从updateCommand.ExecuteNonQuery() 返回的int 是什么,因为它可能有助于了解正在发生的事情。
  • 查看documentationExecuteNonQuery 在发生数据库回滚时返回-1。此回滚可能是由于该错误。也许只是将这些变量添加到语句中而不是使用 SQL 变量?

标签: c# sql sql-server-2008 c#-4.0 hierarchy


【解决方案1】:

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

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

错误来源:.net.sqlclient 数据提供者
错误消息:必须声明标量变量 NodeToMoveID & NodeToMoveIntoID & MovedToDate。

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

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

【讨论】:

    猜你喜欢
    • 2010-11-18
    • 1970-01-01
    • 1970-01-01
    • 2013-07-20
    • 1970-01-01
    • 2014-10-08
    • 1970-01-01
    • 2014-06-20
    • 2018-09-06
    相关资源
    最近更新 更多