2013-06-25 18 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 блоки для SqlConnection и SqlCommand объектов. Используемый блок гарантирует правильную очистку ресурсов при выходе из используемого блока - таким образом вам не придется беспокоиться о таких вещах, как когда позвонить conn.Close(), поскольку блок using позаботится об этом для вас.

Кроме того, я создаю метод SqlConnection. connectionString в этом случае будет строковой переменной (на уровне класса, поэтому все методы, которые в ней нуждаются, могут получить к ней доступ), удерживая строку подключения.

Наконец, я создаю SqlCommand в блоке if, который будет введен только в том случае, если выражение !row.IsNewRow имеет значение true. Я не на 100% уверен, что вы можете переназначить значения существующим параметрам команды (скорее всего, вы можете, но ...)

Я бы также предложил включить обработку ошибок в случае, если что-то пойдет не так со вставкой.

Надеюсь, это касается вопросов/вопросов, которые у вас есть. Если нет, предоставьте более подробную информацию, чтобы мы могли лучше помочь вам. Счастливое кодирование!

+0

спасибо tim, поскольку вы указываете проблему с cs.close, в том же коде меня изменило положение соединения 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(); 

} 
Смежные вопросы