2017-10-04 13 views
0

J'ai quelques données qui devraient être insérées dans 4 tables une de ces données est stockée dans les lignes sélectionnées de la grille de données, donc je passerais en revue la grille les insérer dans la base de données J'ai aussi utilisé une méthode qui fait la transaction et prend les SqlCommands comme matrice et les passe ensuite une par une, mais quand j'essaie d'insérer des données, elle me donne l'exception "L'index était hors de portée. et moins que la taille de la collection. " dans cette ligneInsérer la grille de données afficher les lignes sélectionnées dans la base de données en utilisant la boucle

cm[i].Parameters.Add("@car", Convert.ToInt32(newCarAdCarDgv.Rows[i].Cells[0].Value.ToString())); 

Ceci est la méthode de transaction:

public void ExTr(SqlCommand[] cm) 
{ 
    if (cn.State == ConnectionState.Closed) 
    { 
     cn.Open(); 
    } 
    SqlTransaction tr = cn.BeginTransaction(); 
    for (int x = 0; x < cm.Length; x++) 
    { 
     cm[x].Connection = cn; 
     cm[x].Transaction = tr; 

    } 

    try 
    { 
     for (int x = 0; x < cm.Length; x++) 
     { 
      cm[x].ExecuteNonQuery(); 
     } 
     tr.Commit(); 
     MessageBox.Show("تمت عملية إضافة البيانات بنجاح"); 
    } 
    catch (SqlException ex) 
    { 
     tr.Rollback(); 
     MessageBox.Show(ex.Message); 

    } 
    finally 
    { 
     if (cn.State == ConnectionState.Open) 
     { 
      cn.Close(); 
     } 
    } 

} 

Et voici le code pour l'insertion:

private void newAdSaveBtn_Click(object sender, EventArgs e) 
{ 
    try 
    { 
     count = newCarAdCarDgv.SelectedRows.Count + 3; 
     if (cn.State == ConnectionState.Closed) 
     { 
      cn.Open(); 
     } 

     newCarAdClientPhoneTxt_Leave(sender, e); 
     newCarAdClientEmailTxt_Leave(sender, e); 
     newCarAdNotesTxt_Leave(sender, e); 

     SqlCommand[] cm = new SqlCommand[count]; 

     cm[0] = new SqlCommand("insert into clientData (Id,clientName,clientWork,clientPhone,clientMobile,clientEmail) values (@id,@name,@work,@phone,@mobile,@email)", cn); 
     cm[0].Parameters.AddWithValue("@id", id); 
     cm[0].Parameters.AddWithValue("@name", newCarAdClientNameTxt.Text.Trim()); 
     cm[0].Parameters.AddWithValue("@work", newCarAdClientWorkTxt.Text.Trim()); 
     cm[0].Parameters.AddWithValue("@phone", newCarAdClientPhoneTxt.Text.Trim()); 
     cm[0].Parameters.AddWithValue("@mobile", newCarAdClientMobileTxt.Text.Trim()); 
     cm[0].Parameters.AddWithValue("@email", newCarAdClientEmailTxt.Text.Trim()); 

     cm[1] = new SqlCommand("insert into marketingData (m_Id,marketingDurations,marketingStartsFrom,marketingEndsIn,notes,adDate) values (@id,@durations,@start,@end,@notes,@date)", cn); 
     cm[1].Parameters.AddWithValue("@id", id); 
     cm[1].Parameters.AddWithValue("@durations", newCarAdAdDurationTxt.Text.Trim()); 
     cm[1].Parameters.AddWithValue("@start", newCarAdStartDayDtp.Value); 
     cm[1].Parameters.AddWithValue("@end", newCarAdEndDayDtp.Value); 
     cm[1].Parameters.AddWithValue("@notes", newCarAdNotesTxt.Text.Trim()); 
     cm[1].Parameters.AddWithValue("@date", newCarAdDateDtp.Value); 

     cm[2] = new SqlCommand("insert into priceAndProfits (p_Id,marketingCost,marketingPrice,marketingProfit,dollarPrice) values (@id,@cost,@price,@profit,@dollar)", cn); 
     cm[2].Parameters.AddWithValue("@id", id); 
     cm[2].Parameters.AddWithValue("@cost", newCarAdCostTxt.Text.Trim()); 
     cm[2].Parameters.AddWithValue("@price", newCarAdPriceTxt.Text.Trim()); 
     cm[2].Parameters.AddWithValue("@profit", newCarAdProfitTxt.Text.Trim()); 
     cm[2].Parameters.AddWithValue("@dollar", newCarAdDollarPriceTxt.Text.Trim()); 

     for (int i = 3; i <= newCarAdCarDgv.SelectedRows.Count + 3; i++) 
     { 
      cm[i] = new SqlCommand("insert into carWorkCount (c_Id,carId) value (@id,@car)", cn); 
      cm[i].Parameters.Add("@id", id); 
      cm[i].Parameters.Add("@car", Convert.ToInt32(newCarAdCarDgv.Rows[i].Cells[0].Value.ToString())); 
     } 

     ExTr(cm); 

    } 
    catch (SqlException ex) 
    { 
     MessageBox.Show(ex.Message); 
    } 
} 

Répondre

0

Modifier la boucle finale

for (int i = 0; i < newCarAdCarDgv.SelectedRows.Count; i++) 
{ 
    cm[i+3] = new SqlCommand("insert into carWorkCount (c_Id,carId) value (@id,@car)", cn); 
    cm[i+3].Parameters.Add("@id", id); 
    cm[i+3].Parameters.Add("@car", 
     Convert.ToInt32(newCarAdCarDgv.SelectedRows[i].Cells[0].Value.ToString())); 
} 

Votre code fait référence à Rows [i ] mais je commence par la valeur 3 et vous pouvez sortir du nombre de lignes si vous sélectionnez toutes les lignes dans votre grille. Au lieu de cela, vous avez juste besoin de référencer les commandes avec i + 3

+0

il me donne "index était hors des limites du tableau" – Huda

+0

Sur quelle ligne avez-vous reçu l'exception? – Steve