簡體   English   中英

SqlCommand.ExecuteScalar()函數未返回插入行的ID

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM