![](/img/trans.png)
[英]InvalidOperationException on SqlCommand.ExecuteScalar()
[英]The SqlCommand.ExecuteScalar() function is not returning the Id of the inserted row
public void Insert(Order order)
{
SqlConnection con = DACHelper.GetConnection();
SqlCommand cmd = new SqlCommand(INSERT, con);
cmd.CommandType = System.Data.CommandType.Text;
cmd.Parameters.AddWithValue("@Category_Id", order.Category.Id);
cmd.Parameters.AddWithValue("@Item_Id", order.Item.Id);
con.Open();
using (con)
{
SqlTransaction tran = con.BeginTransaction();
cmd.Transaction = tran;
try
{
order.Id= Convert.ToInt32(cmd.ExecuteScalar());
new OrderMailsDAC().Insert(order.Id, order.Mail , tran);
tran.Commit();
}
catch (Exception)
{
tran.Rollback();
throw;
}
}
}
然后在下面的OrderMails类的Insert函数中插入了order.Id。
public void Insert(int orderId,OrderConfirmationMail mails,SqlTransaction tran)
{
SqlConnection con = tran.Connection;
SqlCommand cmd = new SqlCommand(INSERT, con);
cmd.CommandType = System.Data.CommandType.Text;
cmd.Transaction = tran;
cmd.Parameters.AddWithValue("@Mail", mails.Mail);
cmd.Parameters.AddWithValue("@Order_Id", orderId);
cmd.ExecuteNonQuery();
}
这里的问题是,将order.Id值插入OredrMail的另一个Insert中,然后在该位置存储零。.列是自动递增的,我们存储在Order表中的ad.Id ...
ExecuteScalar
返回所返回的第一行的第一列。 通常,如果我们希望接收单个值,则只需让过程选择一个值。
在您的过程中声明一个变量,例如
declare @id
然后在您插入之后
set @id = scope_identity()
然后当程序完成执行
select @id
您实际上可以将所有内容浓缩为
insert ....whatever
select scope_identity()
我只是倾向于更加明确,以防两者之间的任何其他操作替换scope_identity()的值。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.