-2

我想更新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
   // 
}

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

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
4

2 回答 2

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 子句一次性完成,看:

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]));
    }
于 2013-07-06T08:53:39.450 回答
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然后按照建议使用获取值。

于 2013-07-06T15:26:00.893 回答