2016-11-28 45 views
0

任何想法,爲什麼這隻返回5行DGV的DataGridView的第一個值? SQL應該插入成功,我的循環中一定有什麼問題,我沒有拿起。理想情況下,它應該返回datagridview中的5行值而不僅僅是第一行,從而有效地將整個datagridview傳送到數據庫中。C#插入DataGridView數據到數據庫成功,但只返回第一個值n次?

using (OleDbConnection conn = new OleDbConnection(Con)) 
using (OleDbCommand cmd = new OleDbCommand()) 
{ 
    cmd.Connection = conn; 
    conn.Open(); 
    for (int i = 0; i <= DGVExcel.Rows.Count - 1; i++) 
    { 
     cmd.CommandText = 
      "Insert INTO ACTB (FirstName, LastName, GrossIncome, LessTNT, TaxableIncomeCE, TaxableIncomePE, GrossTaxableIncome, LessTE, LessPPH, NetTax, TaxDue, HeldTaxCE, HeldTaxPE, TotalTax) " + 
      "VALUES(@First, @Last, @Gross, @LessTNT, @TCI, @ADDTI, @GTI, @LessTE, @LessPPH, @LessNTI, @TD, @TWCE, @TWPE, @TATW)"; 
     //cmd.Parameters.AddWithValue("@ID", Convert.ToInt32(txtID.Text)); 
     cmd.Parameters.AddWithValue("@First", DGVExcel.Rows[i].Cells[0].Value); 
     cmd.Parameters.AddWithValue("@Last", DGVExcel.Rows[i].Cells[1].Value); 
     cmd.Parameters.AddWithValue("@Gross", Convert.ToDouble(DGVExcel.Rows[i].Cells[2].Value)); 
     cmd.Parameters.AddWithValue("@LessTNT", 
      Convert.ToDouble(DGVExcel.Rows[i].Cells[3].Value)); 
     cmd.Parameters.AddWithValue("@TCI", Convert.ToDouble(DGVExcel.Rows[i].Cells[4].Value)); 
     cmd.Parameters.AddWithValue("@ADDTI", Convert.ToDouble(DGVExcel.Rows[i].Cells[5].Value)); 
     cmd.Parameters.AddWithValue("@GTI", Convert.ToDouble(DGVExcel.Rows[i].Cells[6].Value)); 
     cmd.Parameters.AddWithValue("@LessTE", Convert.ToDouble(DGVExcel.Rows[i].Cells[7].Value)); 
     cmd.Parameters.AddWithValue("@LessPPH", 
      Convert.ToDouble(DGVExcel.Rows[i].Cells[8].Value)); 
     cmd.Parameters.AddWithValue("@LessNTI", 
      Convert.ToDouble(DGVExcel.Rows[i].Cells[9].Value)); 
     cmd.Parameters.AddWithValue("@TD", Convert.ToDouble(DGVExcel.Rows[i].Cells[10].Value)); 
     cmd.Parameters.AddWithValue("@TWCE", Convert.ToDouble(DGVExcel.Rows[i].Cells[11].Value)); 
     cmd.Parameters.AddWithValue("@TWPE", Convert.ToDouble(DGVExcel.Rows[i].Cells[12].Value)); 
     cmd.Parameters.AddWithValue("@TATW", Convert.ToDouble(DGVExcel.Rows[i].Cells[13].Value)); 
     cmd.ExecuteNonQuery(); 
    } 
} 
+0

使用調試,看看這看起來好看一看。 – mybirthname

+0

沒錯。我已經調試過它,運行良好。除了它僅返回DataGridView的第一個值n次的事實。 N是視圖的項目數。我的猜測是它可能是第一次傳遞後某個地方沒有得到更新的地方。 – Aroueterra

回答

0

您需要在循環過程中爲每個新插入調用初始化您的OleDdCommand。試試這個:

using (OleDbConnection conn = new OleDbConnection(Con)) 
{ 
    conn.Open(); 
    for (int i = 0; i <= DGVExcel.Rows.Count - 1; i++) 
    { 
     OleDbCommand cmd = new OleDbCommand(); 
     cmd.Connection = conn; 

     cmd.CommandText = 
      "Insert INTO ACTB (FirstName, LastName, GrossIncome, LessTNT, TaxableIncomeCE, TaxableIncomePE, GrossTaxableIncome, LessTE, LessPPH, NetTax, TaxDue, HeldTaxCE, HeldTaxPE, TotalTax) " + 
      "VALUES(@First, @Last, @Gross, @LessTNT, @TCI, @ADDTI, @GTI, @LessTE, @LessPPH, @LessNTI, @TD, @TWCE, @TWPE, @TATW)"; 
     //cmd.Parameters.AddWithValue("@ID", Convert.ToInt32(txtID.Text)); 
     cmd.Parameters.AddWithValue("@First", DGVExcel.Rows[i].Cells[0].Value); 
     cmd.Parameters.AddWithValue("@Last", DGVExcel.Rows[i].Cells[1].Value); 
     cmd.Parameters.AddWithValue("@Gross", Convert.ToDouble(DGVExcel.Rows[i].Cells[2].Value)); 
     cmd.Parameters.AddWithValue("@LessTNT", 
      Convert.ToDouble(DGVExcel.Rows[i].Cells[3].Value)); 
     cmd.Parameters.AddWithValue("@TCI", Convert.ToDouble(DGVExcel.Rows[i].Cells[4].Value)); 
     cmd.Parameters.AddWithValue("@ADDTI", Convert.ToDouble(DGVExcel.Rows[i].Cells[5].Value)); 
     cmd.Parameters.AddWithValue("@GTI", Convert.ToDouble(DGVExcel.Rows[i].Cells[6].Value)); 
     cmd.Parameters.AddWithValue("@LessTE", Convert.ToDouble(DGVExcel.Rows[i].Cells[7].Value)); 
     cmd.Parameters.AddWithValue("@LessPPH", 
      Convert.ToDouble(DGVExcel.Rows[i].Cells[8].Value)); 
     cmd.Parameters.AddWithValue("@LessNTI", 
      Convert.ToDouble(DGVExcel.Rows[i].Cells[9].Value)); 
     cmd.Parameters.AddWithValue("@TD", Convert.ToDouble(DGVExcel.Rows[i].Cells[10].Value)); 
     cmd.Parameters.AddWithValue("@TWCE", Convert.ToDouble(DGVExcel.Rows[i].Cells[11].Value)); 
     cmd.Parameters.AddWithValue("@TWPE", Convert.ToDouble(DGVExcel.Rows[i].Cells[12].Value)); 
     cmd.Parameters.AddWithValue("@TATW", Convert.ToDouble(DGVExcel.Rows[i].Cells[13].Value)); 
     cmd.ExecuteNonQuery(); 
    } 
} 
+0

或者,只需添加一次參數(在循環之前),然後在循環內只設置它們的值。這樣做對我來說似乎更有效率。 – stakx

+0

我現在要試試這個。順便說一句@stakx有沒有像縮小縮進的捷徑,或者必須手動完成?我正在考慮在VS上發佈一篇文章,尋求與其他生活質量提示一樣的內容。編輯:我得到它的工作。我也試過cmd.parameters.Clear(),這是可以接受的,還是必須改變你的建議? – Aroueterra

+0

@Vendredi:首先選擇一些文本行,然後按Ctrl + K,可以將縮進縮小4個空格。 – stakx