2016-07-25 12 views
0

Ich habe diesen Code.SqlCommand.ExecuteScalar() gibt Null zurück

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(); 
} 

Das Problem hierbei ist, dass die

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

mit Ausnahme der Id null zurückkehrt, die korrekt gespeichert wird.

Bitte helfen Sie mir mit diesem

+0

Die 'cmd' nichts zurückliefert - es ist nur ** ** Einsätze eine neue Zeile in Ihrer Datenbank. Daher wird 'ExecuteScalar()' nichts zurück bekommen ...... fehlt ein '; SELECT SCOPE_IDENTITY(); 'nach Ihrer' INSERT'-Anweisung vielleicht ?? Das würde den neu eingefügten Identitätswert aus dem 'INSERT'-Statemnet zurückgeben. –

Antwort

0

Sie haben Ausgangsparameter setzen in ExecuteScalar neuen Rekordwert zu erhalten

0

Die ExecuteScalar bedeutet, dass es die erste Zelle der Ergebnismenge zurück. Danach ist nun ein Blick auf Ihrem Befehlscode:

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

Sie sehen, es einfügen nur einen Datensatz in der Tabelle Orders, das ist es, nichts Rückkehr.

Wenn Sie daher die OrderId zurückgeben möchten, falls Ihre Tabelle diese Spalte enthält, sollten Sie Ihren Befehl ändern, um diese Daten zurückzugeben.

Ich schlug vor, so etwas wie dieses

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

Danke, Edward. Danach funktioniert es. – Sajjad

+0

@Sajjad Gern geschehen. Könnten Sie bitte diese Antwort markieren? Also die anderen werden die Antwort für diese Frage nicht mehr posten –

0

Verwenden 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

Danke Ich habe die Antwort User55 vielen Dank Ich war vermisst SCOPE_Identity() – Sajjad