2016-07-25 48 views
0

我有這段代碼。SqlCommand.ExecuteScalar()返回null

public void Insert(Order order) 
{ 
     SqlConnection con = DACHelper.GetConnection(); 

     SqlCommand cmd = new SqlCommand("Insert into Orders(Category_Id,Item_Id)Values(@Category_Id,@Item_Id)", 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 
      { 
       int orderId = Convert.ToInt32(cmd.ExecuteScalar()); 

       new OrderMailsDAC().Insert(orderId, order.Mail , tran); 
       tran.Commit(); 
      } 
      catch (Exception ex) 
      { 
       tran.Rollback(); 
       throw ex; 
      } 
     } 
} 

public void Insert(int orderId,OrderConfirmationMail mails,SqlTransaction tran) 
{ 
    SqlConnection con = tran.Connection; 

    SqlCommand cmd = new SqlCommand("Insert into OrderMails(Mail,Order_Id)Values(@Mail,@Order_Id)", con); 
    cmd.CommandType = System.Data.CommandType.Text; 
    cmd.Transaction = tran; 
    cmd.Parameters.Add("@Mail", SqlDbType.VarChar).Value=mails.Mail; 
    cmd.Parameters.Add("@Order_Id",SqlDbType.Int).Value=orderId; 

    cmd.ExecuteNonQuery(); 
} 

的這裏的問題是,

int orderId = Convert.ToInt32(cmd.ExecuteScalar()); 

,例外的是正確地存儲在Id返回null。

請幫我這個

+0

的'cmd'不返回任何東西 - 它只是** **插入新行到你的數據庫。因此,ExecuteScalar()將不會得到任何回報......你是否錯過了一個'; SELECT SCOPE_IDENTITY();'在你的'INSERT'語句之後可能?這將返回從'插入'狀態新插入的身份值 –

回答

0

你必須設置輸出參數的ExecuteScalar

0

的的ExecuteScalar,以獲得新的記錄值意味着它將返回結果集的第一個單元格。根據這個,現在看看你的命令代碼:

"Insert into Orders(Category_Id,Item_Id)Values(@Category_Id,@Item_Id)" 

你看,它只是插入一個記錄到你的Orders表,僅此而已,沒有什麼回報。

因此,如果我們希望返回OrderId以防萬一您的表具有該列,則應修改您的命令以返回該數據。

我建議這樣的事情

"Insert into Orders(Category_Id,Item_Id)Values(@Category_Id,@Item_Id); SELECT SCOPE_IDENTITY();" 
+0

感謝愛德華現在在它工作後 – Sajjad

+0

@Sajjad不客氣。你能否標記這個答案?所以其他人不會發布這個問題的答案了 –

0

使用SCOPE_IDENTITY()

public void Insert(int orderId,OrderConfirmationMail mails,SqlTransaction tran) 
    { 
SqlConnection con = tran.Connection; 

SqlCommand cmd = new SqlCommand("Insert into OrderMails(Mail,Order_Id)Values(@Mail,@Order_Id) " + 
         "SELECT SCOPE_IDENTITY()";, con); 
cmd.CommandType = System.Data.CommandType.Text; 
cmd.Transaction = tran; 
cmd.Parameters.Add("@Mail", SqlDbType.VarChar).Value=mails.Mail; 
cmd.Parameters.Add("@Order_Id",SqlDbType.Int).Value=orderId; 

int insertedId = (int) cmd.ExecuteNonQuery(); 
} 
+0

謝謝我已經得到了答案用戶55非常感謝 我錯過了SCOPE_Identity() – Sajjad