SqlCommand.ExecuteScalar()函数未返回插入行的Id

时间:2016-07-23 13:51:57

标签: c# asp.net asp.net-mvc-4

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 Class的以下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();
}

这里的问题是当插入另一个OredrMail插件时order.Id值然后它在那个地方存储零..列是自动增量的,我们已经存储在Order表中的ad.Id ...

1 个答案:

答案 0 :(得分:2)

ExecuteScalar返回返回的第一行的第一列。通常情况下,如果我们希望收到单个值,我们只需选择一个值。

在你的程序中声明一个像

这样的变量
declare @id

然后在插入后立即

set @id = scope_identity()

然后当程序执行完

select @id

您实际上可以将所有内容浓缩为

insert ....whatever
select scope_identity()

如果之间的任何其他操作替换scope_identity()的值,我只是倾向于更明确。