【问题标题】:Update database via stored procedure from code-behind fails to update从代码隐藏通过存储过程更新数据库无法更新
【发布时间】:2013-08-08 17:48:25
【问题描述】:

我已经解决了这个问题,但无法弄清楚我的更新失败的原因。我对 SQL 不感兴趣。我写了一个简单的存储过程。

代码如下:

CREATE PROCEDURE [dbo].sp_UpdateTeamMemberProfile
    @TeamMemberId int OUTPUT,
    @FirstName varchar(25),
    @LastName varchar(30),  
    @ContactNumber varchar (20),
    @ContactExt varchar (20) ,  
    @EmailAddress varchar(100),
    @Fax varchar (25),
    @LocationCity varchar (20),
    @LocationState varchar (20),
    @BeginWorkHrs int,
    @BeginWorkTime   varchar  (20) ,
    @EndWorkHrs  int ,
    @EndWorkTime varchar (20) ,
    @ZONE Varchar (20),
    @TeamMemberLanId varchar (20),
    @ManagerId varchar (20),
    @UpdateDate datetime
AS 
BEGIN
    SET NOCOUNT ON;

    BEGIN
       UPDATE dbo.LoanOwnerStamp
       SET FirstName = @FirstName,
           LastName = @LastName,
           ContactNumber = @ContactNumber,
           ContactExt = @ContactExt ,
           EmailAddress = @EmailAddress,
           Fax = @Fax, 
           LocationCity = @LocationCity, 
           LocationState = @LocationState,
           BeginWorkHrs = @BeginWorkHrs,
           BeginWorkTime = @BeginWorkTime,
           EndWorkHrs = @EndWorkHrs,
           EndWorkTime = @EndWorkTime, 
           Zone = @Zone,
           TeamMemberLanId = @TeamMemberLanId,
           ManagerId = @ManagerId ,
           UpdatedDate = @UpdateDate
       WHERE  
           TeamMemberLanId = @TeamMemberLanId 
           AND TeamMemberId = @TeamMemberId
     END 

     SET @TeamMemberId = SCOPE_IDENTITY()

     RETURN @TeamMemberId
 END

现在后面的代码如下...

using (SqlCommand updatetLSTeamMember = new SqlCommand("sp_UpdateTeamMemberProfile", myConnection))
{
    updatetLSTeamMember.CommandType = CommandType.StoredProcedure;
    updatetLSTeamMember.Parameters.Add("@FirstName", SqlDbType.VarChar, 25).Value = txtFirstName.Text;
    updatetLSTeamMember.Parameters.Add("@LastName", SqlDbType.VarChar, 30).Value = txtLastName.Text;
    updatetLSTeamMember.Parameters.Add("@ContactNumber", SqlDbType.VarChar, 20).Value = txtContactNumber.Text;
    updatetLSTeamMember.Parameters.Add("@ContactExt", SqlDbType.VarChar, 20).Value = txtContactExt.Text;
    updatetLSTeamMember.Parameters.Add("@EmailAddress", SqlDbType.VarChar, 100).Value = txtEmailAddress.Text;
    updatetLSTeamMember.Parameters.Add("@Fax", SqlDbType.VarChar, 25).Value = txtFax.Text;
    updatetLSTeamMember.Parameters.Add("@LocationCity", SqlDbType.VarChar, 20).Value = txtLocationCity.Text;
    updatetLSTeamMember.Parameters.Add("@LocationState", SqlDbType.VarChar, 20).Value = txtState.Text;
    updatetLSTeamMember.Parameters.Add("@BeginWorkHrs", SqlDbType.Int).Value = ddlBeginHrs.SelectedValue.ToString();
    updatetLSTeamMember.Parameters.Add("@BeginWorkTime", SqlDbType.VarChar, 20).Value = ddlBeginTime.SelectedValue.ToString();
    updatetLSTeamMember.Parameters.Add("@EndWorkHrs", SqlDbType.Int).Value = ddlEndHrs.SelectedValue.ToString();
    updatetLSTeamMember.Parameters.Add("@EndWorkTime", SqlDbType.VarChar, 20).Value = ddlEndTime.SelectedValue.ToString();
    updatetLSTeamMember.Parameters.Add("@Zone", SqlDbType.VarChar, 20).Value = ddlZone.SelectedItem.Text;
    updatetLSTeamMember.Parameters.Add("@TeamMemberLanId", SqlDbType.VarChar, 20).Value = txtTeamMemberLaniId.Text;
    updatetLSTeamMember.Parameters.Add("@ManagerId", SqlDbType.VarChar, 20).Value = gblUserId;
    updatetLSTeamMember.Parameters.Add("@UpdateDate", SqlDbType.DateTime).Value = DateTime.Now.ToLocalTime();

    pID = updatetLSTeamMember.Parameters.Add("@TeamMemberId", SqlDbType.Int);  // I'm thinking this is a culprit
    pID.Direction = ParameterDirection.Output;  // are these assignment correct.

    try
    {
        if (updatetLSTeamMember.Connection.State == ConnectionState.Closed)
        {
            updatetLSTeamMember.Connection.Open();
        }

        updatetLSTeamMember.ExecuteNonQuery();  // code bombs out here 

        string idcat = updatetLSTeamMember.Parameters["@TeamMemberId"].Value.ToString();

现在我的问题在几个地方,我的Parameter.Direction 输出是否正确,从存储过程的角度来看是否正确?

感谢任何帮助。

【问题讨论】:

  • 你得到什么错误?
  • 为什么在更新时使用SCOPE_IDENTITY()?只有在 INSERT 上才有意义
  • AND so the rest fo the cod follows ... - 这让我担心问题出在未包含的代码部分。请发布您的所有代码。
  • 所以我应该说成功返回 0 以及如何在后面的代码中捕获它是我没有做过的事情。感谢您让我知道。
  • 确定让我添加代码

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


【解决方案1】:

如果您想返回一个值,我建议您在存储过程中创建另一个变量,而不是使用您用于输入的值。

这就是我会做的:

@returnValue int OUTPUT
@TeamMemberId int,
@FirstName varchar(25),
@LastName varchar(30),  
@ContactNumber varchar (20),
@ContactExt varchar (20) ,  
@EmailAddress varchar(100),
@Fax varchar (25),
@LocationCity varchar (20),
@LocationState varchar (20),
@BeginWorkHrs int,
@BeginWorkTime   varchar  (20) ,
@EndWorkHrs  int ,
@EndWorkTime varchar (20) ,
@ZONE Varchar (20),
@TeamMemberLanId varchar (20),
@ManagerId varchar (20),
@UpdateDate datetime

作为

开始

SET NOCOUNT ON;

   UPDATE dbo.LoanOwnerStamp
   SET FirstName = @FirstName,
       LastName = @LastName,
       ContactNumber = @ContactNumber,
       ContactExt = @ContactExt ,
       EmailAddress = @EmailAddress,
       Fax = @Fax, 
       LocationCity = @LocationCity, 
       LocationState = @LocationState,
       BeginWorkHrs = @BeginWorkHrs,
       BeginWorkTime = @BeginWorkTime,
       EndWorkHrs = @EndWorkHrs,
       EndWorkTime = @EndWorkTime, 
       Zone = @Zone,
       TeamMemberLanId = @TeamMemberLanId,
       ManagerId = @ManagerId ,
       UpdatedDate = @UpdateDate
   WHERE  
       TeamMemberLanId = @TeamMemberLanId 
       AND TeamMemberId = @TeamMemberId 

 SET @returnValue= SCOPE_IDENTITY()

 RETURN @returnValue

结束

在你的代码后面:

编辑:您还需要添加:

updatetLSTeamMember.Parameters.AddWithValue("@TeamMemberId",  int.Parse(txtTeamMemberId.Text)); // or wherever you are getting the team member id from.



pID = updatetLSTeamMember.Parameters.Add("@returnValue", SqlDbType.Int);
pID.Direction = ParameterDirection.Output;

string idcat = updatetLSTeamMember.Parameters["@returnValue"].Value.ToString();

注意:我从未在更新中使用过 SCOPE_IDENTITY()。你可能想调查一下。

【讨论】:

    【解决方案2】:

    如果您需要在成功的情况下返回某些内容 - 您可以使用 @@ROWCOUNT 而不是 SCOPE_IDENTITY() - 它会返回受更新影响的行数。

    因此,如果返回 0 - 您将知道没有更新任何记录。

    【讨论】:

      【解决方案3】:

      我可能错了,但您正在根据使用 TeamMemberId(输出参数)的位置条件更新记录,但未在 c# 端为其提供任何值。输出参数的语法 si corect 但您在 where 子句中使用它,值是什么,... Scope Identity部分会在执行更新命令后执行

      【讨论】:

        猜你喜欢
        • 2016-01-09
        • 2023-04-11
        • 2015-12-16
        • 2016-06-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-02-20
        • 1970-01-01
        相关资源
        最近更新 更多