2015-07-27 3 views
2

У меня есть следующий код:SQL Query только один раз

SqlConnection con = new SqlConnection(@"Data Source=NUC\MICROGARDE;Initial Catalog=SQL;Integrated Security=True"); 
String Query; 

for (int i = 0; i < this.dataGridView1.Columns.Count; i++) 
{ 
      MessageBox.Show(" " + this.dataGridView1.Columns.Count); 
      MessageBox.Show(" " + this.dataGridView1.Columns[i].Name + " "); 
      MessageBox.Show(" " + this.dataGridView1.SelectedRows[0].Cells[i].Value + " "); 

      Query = "insert into [" + this.comboBox1.Text + "] ([" + this.dataGridView1.Columns[i].Name + "]) Values ('" + this.dataGridView1.SelectedRows[0].Cells[i].Value + "') ;"; 

      SqlCommand cmd = new SqlCommand(Query, con); 

      con.Open(); 

      DataTable dt = new DataTable(); 
      SqlDataAdapter sda = new SqlDataAdapter(Query, con); 

      cmd.CommandType = CommandType.Text; 
      cmd.Connection = con; 

      sda.SelectCommand = cmd; 

      sda.Fill(dt); 

      BindingSource bSource = new BindingSource(); 
      bSource.DataSource = dt; 

      dataGridView1.DataSource = bSource; 
     } 
     con.Close(); 

Он должен вставить определенное значение в каждом столбце таблицы (как показано в DataGridView), но после того, как он сохраняет первое значение (значение из первого столбца строки, которую мы хотим вставить), он обновляет таблицу, и только первое значение вставлено ... Я хочу вставить всю строку

+1

Вы попытались переместить привязку за пределами цикла 'for'? Я имею в виду эти строки 'BindingSource bSource = new BindingSource(); bSource.DataSource = dt; dataGridView1.DataSource = bSource; ' – Jaco

+0

Я пробовал ... Это не хорошо –

ответ

1

код ведет себя корректно, как ожидалось.

здесь ваш код:

for each column 
build sql string to take first row, current column and insert in db 
create sql command using the above sql string 
execute the above command 
refresh datagrid 
next 

выше производит точное поведение, которое вы испытываете, это, как ожидается, и правильно в том смысле, что код делает именно то, что он сказал делать.

, что ваш код должен быть основан на описании:

for each row 
build base sql statement 
for each column 
    add current value and field name to the base statement 
next 
create sql command 
fill the command with the statement built in the previous cycle 
execute the sql statement 
next 
refresh datagrid 

, если вам нужно вставить только один ряд, то внешний foreach не нужен
при выполнении конкатенации строить заявления заботиться о входе санитария и типы данных.

+0

Как добавить текущее значение и имя поля в базовый оператор? Должен ли я написать что-то подобное: Query = "insert into [" + this.comboBox1.Text + "] ([", а для каждого столбца для записи Query + = ...? –

+0

используйте 2 отдельные переменные, чтобы присоединиться к используйте переменную для списка полей, другую для значений и в конце вы помещаете: «INSERT INTO table (« + fields + ») VALUE (« + values ​​+ »)». – Paolo

+0

good point :) thanks много! –

0

con.open() должен находиться вне петли

+0

Это не дает ответа на вопрос. Чтобы критиковать или запросить разъяснения у автора, оставьте комментарий ниже своего сообщения - вы всегда можете прокомментировать свои собственные сообщения, и как только у вас будет достаточно [репутации] (http://stackoverflow.com/help/whats-reputation), вы будете быть в состоянии [прокомментировать любое сообщение] (http://stackoverflow.com/help/privileges/comment). –

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