2013-06-25 148 views
1

下面是我寫的只保存數據庫中的第一行值的代碼,但是當我嘗試保存多行值時會發出錯誤。我不知道如何在此代碼中使用循環,以及在何處使用循環在數據庫中一次插入多行。將數據從datagridview保存到SQL Server數據庫

如何將DataGridView值保存到SQL Server數據庫中?

private void button1_Click(object sender, EventArgs e) 
{ 
    SqlCommand cmd = new SqlCommand("INSERT INTO datagrid (sr, name, email, tel_no) VALUES(@c1,@c2,@c3,@c4)", cs); 
    { 
     cmd.Parameters.Add(new SqlParameter("@C1", SqlDbType.VarChar)); 
     cmd.Parameters.Add(new SqlParameter("@C2", SqlDbType.VarChar)); 
     cmd.Parameters.Add(new SqlParameter("@C3", SqlDbType.VarChar)); 
     cmd.Parameters.Add(new SqlParameter("@C4", SqlDbType.VarChar)); 

     cs.Open(); 

     foreach (DataGridViewRow row in dataGridView1.Rows) 
     { 
      { 
       if (!row.IsNewRow) 
       { 
        cmd.Parameters["@C1"].Value = row.Cells[0].Value; 
        cmd.Parameters["@C2"].Value = row.Cells[1].Value; 
        cmd.Parameters["@C3"].Value = row.Cells[2].Value; 
        cmd.Parameters["@C4"].Value = row.Cells[3].Value; 
        cmd.ExecuteNonQuery(); 
       } 
       cs.Close(); 
      } 
     } 
    } 
} 
+0

什麼錯誤?我敢打賭,它與某個關閉的連接有關 - 你在每個代碼塊的末尾關閉連接,所以它只會保存第一行,不管你有多少行。在每個循環外移動'cs.Close();'。 – Tim

+0

你不需要foreach循環。 –

+0

@SaroopTrivedi - 如果OP從DataGridView保存多行,他們需要某種循環。 – Tim

回答

0
private void button1_Click(object sender, EventArgs e) 
     {     
SqlConnection conn = new SqlConnection(); 
conn.Open(); 

SqlCommand comm = new SqlCommand(); 
comm.Connection = conn; 

string sr = null; 
string name = null; 
string email = null; 
string tel_no = null; 


for (int i = 0; i <= this.DataGridView1.Rows.Count; i++) { 
sr == this.DataGridView1.Rows(i).Cells(0).Value.ToString() 
name == this.DataGridView1.Rows(i).Cells(1).Value.ToString() 
email == this.DataGridView1.Rows(i).Cells(2).Value.ToString() 
tel_no == this.DataGridView1.Rows(i).Cells(3).Value.ToString() 

comm.CommandText = "insert into mytable(name,age) values('" & name & "','" & age& "')" 
    comm.ExecuteNonQuery() 

conn.Close() 


} 

} 

試試這個,看看。它應該工作

+1

他正在進入C#不在VB.Net ...最好把C#代碼 –

+0

謝謝你所有上述答案真的幫助我 –

3

有一些信息,將是不錯的,你沒有把你原來的問題:

  1. cs是最有可能是SqlConnection,既然你說這作品中插入一行我猜這是一個全局(類級別)變量,並在其他地方創建。我會做一點不同(請參閱我的代碼示例爲什麼)。

  2. 你得到了什麼錯誤?根據問題描述,我敢打賭它是一個封閉的連接(因爲你在foreach代碼塊的末尾關閉它,當你應該關閉它在foreach代碼塊外)。

因此,隨着中說,這裏的東西可能會爲你做的伎倆:

private void button1_Click(object sender, EventArgs e) 
{ 

    using (SqlConnection conn = new SqlConnection(connectionString)) 
    { 

     cs.Open(); 

     foreach (DataGridViewRow row in dataGridView1.Rows) 
     { 

      if (!row.IsNewRow) 
      { 
       using (SqlCommand cmd = new SqlCommand("INSERT INTO datagrid (sr, name, email, tel_no) VALUES(@c1,@c2,@c3,@c4)", conn)) 
       { 

        cmd.Parameters.AddWithValue("@C1", row.Cells[0].Value); 
        cmd.Parameters.AddWithValue("@C2", row.Cells[1].Value); 
        cmd.Parameters.AddWithValue("@C3", row.Cells[2].Value); 
        cmd.Parameters.AddWithValue("@C4", row.Cells[3].Value); 

        cmd.ExecuteNonQuery(); 

       } 
      } 
     } 
    } 
} 

在上面的例子中,我使用using塊爲SqlConnectionSqlCommand對象。 Using塊確保資源被正確地清理時,使用退出塊 - 這樣你就不必擔心像何時調用conn.Close(),爲using塊會照顧的,對於你。

另外,我在該方法中創建了SqlConnection。在這種情況下,connectionString將是一個字符串變量(在類級別,因此所有需要它的方法都可以訪問它)持有連接字符串。

最後,我在if塊中創建了SqlCommand,只有在!row.IsNewRow表達式計算結果爲true時纔會進入該塊。我不是100%肯定,你可以重新分配值與現有命令的參數(最有可能的,你可以,但是......)

我也建議包括一些錯誤的東西的情況下處理出錯與刀片。

希望這可以解決您遇到的問題。如果沒有,請提供更多細節,以便我們能夠更好地爲您提供幫助快樂的編碼!

+0

感謝蒂姆,因爲你指定問題與cs.close,在相同的代碼我改變了連接的位置關閉和相同的代碼正常工作 –

0

問題是cs關閉的次數多於打開的次數。

您打開連接,插入,但隨後嘗試關閉每個迭代。

要麼你應該打開每個迭代的連接,或者你應該看到如何做的一切只有唯一的連接。

0
int ab; 

int PIrowss = dataGridView2.Rows.Count; 

for (ab = 0; ab < PIrowss; ab++) 

{ 

PiCGetAutID(); 

purchaeOrder.pcautoid = Catget; 

purchaeOrder.ponum = label119.Text; 

purchaeOrder.col1 = dataGridView2.Rows[ab].Cells[0].Value.ToString(); 

purchaeOrder.col2 = dataGridView2.Rows[ab].Cells[1].Value.ToString(); 

purchaeOrder.col3 = dataGridView2.Rows[ab].Cells[2].Value.ToString(); 

purchaeOrder.col4 = dataGridView2.Rows[ab].Cells[3].Value.ToString(); 

    purchaeOrder.col5 = dataGridView2.Rows[ab].Cells[4].Value.ToString(); 


purchaeOrder.POcSave(); 

} 
相關問題