我想更新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
答案 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
,因为现在您正在执行update
和select
操作。
稍后,您应该使用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
获取值。