2014-11-17 96 views
0

我有一個問題,即要將datagridview中的所有值插入到SQL Server CE數據庫中。要插入到SQL Server CE數據庫的Datagridview值

這裏是我寫的代碼:

private void btn_savedp_Click(object sender, EventArgs e) 
{ 
     // Retrieve the connection string from the settings file. 
     string conString = Properties.Settings.Default.EchonologiaConnectionString; 

     string sqlQuery = "INSERT INTO tb_DataPoint (PierID, InspectDate, DPName, ZoneColumn, ZoneRow, Result, Longitude, Latitude)"; 
     sqlQuery += "VALUES (@PierID, @InspectDate, @DPName, @ZoneColumn, @ZoneRow, @Result, @Longitude, @Latitude)"; 

     // Open the connection using the connection string. 
     using (SqlCeConnection con = new SqlCeConnection(conString)) 
     { 
      // Insert into the SqlCe table. ExecuteNonQuery is best for inserts. 
      using (SqlCeCommand com = new SqlCeCommand(sqlQuery, con)) 
      { 
       con.Open(); 

       for (int i = 0; i < dgDataPoint.Rows.Count; i++) 
       { 
        com.Parameters.AddWithValue("DPName", dgDataPoint.Rows[i].Cells["DataPointName"].Value); 
        com.Parameters.AddWithValue("ZoneColumn", dgDataPoint.Rows[i].Cells["ZoneColumn"].Value); 
        com.Parameters.AddWithValue("ZoneRow", dgDataPoint.Rows[i].Cells["ZoneRow"].Value); 
        com.Parameters.AddWithValue("Result", dgDataPoint.Rows[i].Cells["Result"].Value); 
        com.Parameters.AddWithValue("Longitude", dgDataPoint.Rows[i].Cells["Longitude"].Value); 
        com.Parameters.AddWithValue("Latitude", dgDataPoint.Rows[i].Cells["Latitude"].Value); 
        com.Parameters.AddWithValue("PierID", cbPier.Text); 
        com.Parameters.AddWithValue("InspectDate", dtInspect.Text); 
       } 

       com.ExecuteNonQuery(); 
       com.Parameters.Clear();    
       con.Close();      
      } 
     } 

有錯誤我得到的是:

具有該名稱的SqlCeParameter已經被這個SqlCeParameterCollection遏制。

有人可以告訴我如何糾正這個問題嗎?

謝謝

回答

1

您可以在循環中的每次迭代中添加參數。您可以在循環外部和循環中移動參數的添加,只需設置值即可。像這樣:

//Before loop 
cms.Parameters.Add(<parameterNameHere>); 

// In the loop 
for (int i = 0; i < dgDataPoint.Rows.Count; i++) 
{ 
    com.Parameters["DPName"]= 
     dgDataPoint.Rows[i].Cells["DataPointName"].Value; 
    ... 
} 
+0

你好,我想你的答案,但它顯示一個錯誤「SqlCeParameterCollection只接受非空SqlCeParameter類型的對象,而不是String對象。」 – Momento

+0

我按照您的建議解決了問題。感謝您的幫助。 – Momento

0

您必須爲網格中的每一行構造一個新的命令。

修改後的代碼:

private void btn_savedp_Click(object sender, EventArgs e) 
    { 

     // Retrieve the connection string from the settings file. 
     string conString = Properties.Settings.Default.EchonologiaConnectionString; 

     string sqlQuery = "INSERT INTO tb_DataPoint (PierID, InspectDate, DPName, ZoneColumn, ZoneRow, Result, Longitude, Latitude)"; 
     sqlQuery += "VALUES (@PierID, @InspectDate, @DPName, @ZoneColumn, @ZoneRow, @Result, @Longitude, @Latitude)"; 


     // Open the connection using the connection string. 
     using (SqlCeConnection con = new SqlCeConnection(conString)) 
     { 
       con.Open(); 
      // Insert into the SqlCe table. ExecuteNonQuery is best for inserts. 
       for (int i = 0; i < dgDataPoint.Rows.Count; i++) 
       { 
        using (SqlCeCommand com = new SqlCeCommand(sqlQuery, con)) 
        { 

         com.Parameters.AddWithValue("DPName", dgDataPoint.Rows[i].Cells["DataPointName"].Value); 
         com.Parameters.AddWithValue("ZoneColumn", dgDataPoint.Rows[i].Cells["ZoneColumn"].Value); 
         com.Parameters.AddWithValue("ZoneRow", dgDataPoint.Rows[i].Cells["ZoneRow"].Value); 
         com.Parameters.AddWithValue("Result", dgDataPoint.Rows[i].Cells["Result"].Value); 
         com.Parameters.AddWithValue("Longitude", dgDataPoint.Rows[i].Cells["Longitude"].Value); 
         com.Parameters.AddWithValue("Latitude", dgDataPoint.Rows[i].Cells["Latitude"].Value); 
         com.Parameters.AddWithValue("PierID", cbPier.Text); 
         com.Parameters.AddWithValue("InspectDate", dtInspect.Text); 

         com.ExecuteNonQuery(); 

         com.Parameters.Clear();    
        } 

       } 

      con.Close(); 
     } 
+0

嗨,我試過你的解決方案,但它獲取錯誤「com不存在於當前上下文」爲com.Parameters.Clear()。 – Momento

+0

'com.Parameters.Clear(); '在'com.ExecuteNonQuery();'之後使用'' –

+0

我已根據@Ganesh_Devlekar評論更新了答案。 –