2017-10-04 49 views
0

我有一些數據應該插入到4個表中,其中一個數據存儲在數據網格視圖中選定的行,所以我會通過數據網格視圖循環選定行到將它們插入到數據庫中我還使用了一種方法來執行事務並將SqlCommands作爲矩陣,然後逐個執行它們,但是當我嘗試插入數據時,它給了我一個例外:「索引超出範圍,必須是非負數並且小於收藏的大小。「在這條線插入數據網格視圖使用循環查看選定的行到數據庫

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

這是交易方法:

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

} 

這是用於插入的代碼:

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

回答

0

改變最終循環到

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

你的代碼引用了行[i ]但我從值3開始,如果選擇網格中的所有行,則可以跳出行數。相反,你只需要參考命令與我+ 3

+0

它給了我「索引超出數組的界限」 – Huda

+0

你在哪一行得到異常? – Steve

相關問題