从sql server更新表时从表返回列

时间:2013-07-06 08:29:48

标签: c# sql-server ado.net

我想更新Payments表中的一行并获取此行的多个列值

public void update(Int64 id , int status)
{
   dal.DoCommand("Payments_Update", new SqlParameter("@Id", id), new SqlParameter("@Status", status));

   // I WANT GET p_amount , p_credit ,p_debtor OF tbl_Payments HERE
   // 
}

在上面我调用了DAL类的DoCommand函数

public void DoCommand(string sqlCmd, params SqlParameter[] parms)
{
   command.CommandText = sqlCmd;
   command.CommandType = CommandType.StoredProcedure;
   command.Parameters.Clear();
   command.Parameters.AddRange(parms);
   command.ExecuteScalar();
}

这是Payments_update程序

alter procedure dbo.Payments_Update
   (@Id bigint,
    @Status int)
as
   update tbl_Payments
   set p_status = @Status
   where p_id = @Id

   return

这些是我payments

的列
p_amount int, p_creditor int, p_debtor int

2 个答案:

答案 0 :(得分:5)

为什么不直接更改SP(存储过程)以在更新后选择所需的列。

alter procedure dbo.UpdateAndGetPaymentDetails
   (@Id bigint,
    @Status int)
as
   update tbl_Payments
   set p_status = @Status
   where p_id = @Id
   select p_amount, p_creditor, p_debtor
   from dbo.tbl_Payments
   where p_id = @Id

更新:正如@ i-one在他的回答中建议的那样,也可以使用sql output clause一次性完成,看看:

alter procedure dbo.UpdateAndGetPaymentDetails
    (@Id bigint,
    @Status int)
as
    update tbl_Payments
    set p_status = @Status
    output inserted.p_amount, inserted.p_creditor, inserted.p_debtor
    where p_id = @Id

此外,我建议您将SP的名称更改为UpdateAndGetPaymentDetails,因为现在您正在执行updateselect操作。

稍后,您应该使用SqlDataReader方法而不是您当前正在使用的ExecuteScalar,因为您确实想要选择/返回记录,而ExecuteScalar只返回第一个查询返回的结果集中第一行的列。例如:

    SqlCommand command = new SqlCommand(queryString, connection);
    SqlDataReader reader = command.ExecuteReader();
    while (reader.Read())
    {
        Console.WriteLine(String.Format("{0}", reader[0]));
    }

答案 1 :(得分:0)

而不是更新然后选择,你可以一次性完成

alter procedure dbo.UpdateAndGetPaymentDetails
    (@Id bigint,
    @Status int)
as
    update tbl_Payments
    set p_status = @Status
    output inserted.p_amount, inserted.p_creditor, inserted.p_debtor
    where p_id = @Id

然后按照建议使用SqlDataReader获取值。