【问题标题】:stored procedure not updating records存储过程不更新记录
【发布时间】:2015-06-30 22:00:12
【问题描述】:

我有一个使用输入参数调用 SQL Server 存储过程的 c# 函数。存储过程在直接通过 SQL Server Management Studio 执行时工作正常,所以我相信问题一定出在 c# 端,但是我无法终生解决。我已经搜索过所有以前出现过这个问题的其他人,但我一直无法找到解决方案。如果最终无法确定问题所在,我将非常感谢一些调试技巧,因为我不太擅长更高级的故障排除。

这里是c#函数:

protected void UpdateProfile(object sender, EventArgs e)
    {
        string connstring = ConfigurationManager.ConnectionStrings["TimeHubDBCS"].ConnectionString;
        using (SqlConnection conn = new SqlConnection(connstring))
        {
            try
            {
                SqlCommand cmd = new SqlCommand("spUpdateProfile", conn);
                cmd.CommandType = System.Data.CommandType.StoredProcedure;

                cmd.Parameters.Add("@UserId", SqlDbType.VarChar).Value = userloggedin.Text;

                cmd.Parameters.Add("@FirstName", SqlDbType.VarChar).Value = first_name.Text;
                cmd.Parameters.Add("@LastName", SqlDbType.VarChar).Value = last_name.Text;
                cmd.Parameters.Add("@MiddleInitial", SqlDbType.VarChar).Value = middle_initial.Text;
                cmd.Parameters.Add("@Assignment", SqlDbType.VarChar).Value = ddl_assignment.Text;
                cmd.Parameters.Add("@Rank", SqlDbType.VarChar).Value = rank.Text;
                cmd.Parameters.Add("@Star", SqlDbType.VarChar).Value = star.Text;

                cmd.Parameters.Add("@ContactPhone", SqlDbType.VarChar).Value = contact_phone.Text;
                cmd.Parameters.Add("@PhoneType", SqlDbType.VarChar).Value = phone_type.Text;
                cmd.Parameters.Add("@Email", SqlDbType.VarChar).Value = email.Text;
                cmd.Parameters.Add("@Shift", SqlDbType.VarChar).Value = ddl_shift.Text;

                cmd.Parameters.Add("@ModifyDate", SqlDbType.VarChar).Value = DateTime.Now.ToString();
                cmd.Parameters.Add("@ModifiedBy", SqlDbType.VarChar).Value = userloggedin.Text;
                cmd.Parameters.Add("@StatusId", SqlDbType.VarChar).Value = "active";

                conn.Open();
                cmd.ExecuteNonQuery();

                Response.Write("Profile updated successfully!");
            }
            catch (Exception ex)
            {
                Response.Write("Profile update error:  " + ex.Message);
            }
        }
    }

这里是 sql server 存储过程:

ALTER PROCEDURE spUpdateProfile

@UserId         VARCHAR(200)    =   NULL    ,

@FirstName      VARCHAR(200)    =   NULL    ,
@LastName       VARCHAR(200)    =   NULL    ,
@MiddleInitial  VARCHAR(200)    =   NULL    ,
@Assignment     VARCHAR(200)    =   NULL    ,
@Rank           VARCHAR(200)    =   NULL    ,
@Star           VARCHAR(200)    =   NULL    ,

@ContactPhone   VARCHAR(200)    =   NULL    ,
@PhoneType      VARCHAR(200)    =   NULL    ,
@Email          VARCHAR(200)    =   NULL    ,
@Shift          VARCHAR(200)    =   NULL    ,

@ModifyDate     VARCHAR(200)    =   NULL    ,
@ModifiedBy     VARCHAR(200)    =   NULL    ,
@StatusId       VARCHAR(200)    =   NULL    

AS
BEGIN
UPDATE dbo.users
    SET
        first_name          =   @FirstName          ,
        last_name           =   @LastName           ,
        middle_initial      =   @MiddleInitial      ,
        assignment          =   @Assignment         ,
        user_rank           =   @Rank               ,
        user_star           =   @Star               ,
        contact_phone       =   @ContactPhone       ,
        phone_type          =   @PhoneType          ,
        email               =   @Email              ,
        regular_shift       =   @Shift              ,
        modify_date         =   @ModifyDate         ,
        modified_by         =   @ModifiedBy         ,
        status_id           =   @StatusId           
    WHERE
        user_id             =   @UserId
END

【问题讨论】:

  • 第一步:确保您从代码中定位的 user_id 存在。
  • 你尝试先打开连接然后创建命令。
  • 完成。我有一个在 page_load 上运行的单独函数,它调用基于 session_id 提取 user_id 的存储过程,然后使用 user_id 填充隐藏的文本框(id = userloggedin)。我有另一个使用 userloggedin.Text 运行的函数,它运行时没有任何问题,所以我确定这不是问题
  • 你点击成功消息了吗? ExecuteNonQuery 返回什么?
  • 在 page_load 上使用 if(!Page.ispostback){//your function}

标签: c# asp.net sql-server stored-procedures


【解决方案1】:

您的描述缺少对代码进行故障排除的关键因素。究竟是什么错误?如果您无法识别错误,则无法真正开始对其进行故障排除。

在你的 catch 上设置一个断点并尝试运行它。当它在该断点处停止时,查看异常和异常的堆栈跟踪。它通常会告诉你失败的原因。此外,您可以在过程的顶部放置一个断点,然后将鼠标悬停在每个变量上,看看它们是否都存在。可能缺少一个或具有不正确的数据类型。

【讨论】:

    【解决方案2】:

    Partha 回答了原帖下 cmets 部分的问题。

    问题是我有一个函数,它用 page_load 上的用户数据填充页面上的文本框。每次更新函数运行时,页面回传到服务器并再次触发 page_load 事件,用原始数据重新填充文本框,然后使用该数据更新表中的记录。

    在 pag_load 事件中的函数周围添加 if(!Page.ispostback){function} 通过仅在页面首次加载时填充这些字段来解决问题,而不是在刷新/回发时

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-24
      • 1970-01-01
      相关资源
      最近更新 更多