存储过程不更新记录

时间:2015-06-30 22:00:12

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

我有一个c#函数调用带有输入参数的SQL Server存储过程。直接通过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

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

Partha在原帖后的评论部分回答了这个问题。

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

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