2015-09-20 4 views
-1

Я добавил некоторые данные из таблицы Excel в DataGridView. Я использую этот код для сохранения данных в базе данных на SQL Server.Ошибка при использовании SqlCommand

Country и Currency имеют тип VARCHAR и rate является Float. Данные успешно добавлены, но у меня есть сообщение об ошибке из строки SqlCommand.

private void button1_Click(object sender, EventArgs e) 
{ 
    SqlConnection con = new SqlConnection("Data Source=NIFAL;Initial Catalog=Currency;Integrated Security=True;"); 

    foreach (DataGridViewRow Row in dataGridView1.Rows) 
    { 
      con.Open(); 
      SqlCommand cmd = new SqlCommand("INSERT INTO CurrencyTable(Country, Currency, Rate) VALUES('" + Row.Cells[0].Value.ToString() 

+ " ''" + row.Cells [1] .Value.ToString() + " ''" + row.Cells [2] .Value.ToString() + ")" , против); cmd.ExecuteNonQuery(); con.Close(); } }

+2

Строительство SQL с помощью конкатенации строк вместо параметризованных запросов не только вводят SQL-инъекцию, но и практически невозможно получить право. Любая конкретная причина, по которой вам нужно пройти такой болезненный маршрут? –

+2

Почему вы открываете и закрываете соединение для каждой строки? Откройте соединение один раз, перед началом и закройте его после завершения цикла. Эффективность будет значительно улучшена. –

ответ

3

Санитарный ввод важен, и у вас, вероятно, есть некоторая ошибка на вашем входе. Я хотел бы попробовать и получить сообщения об ошибках в списке, вот пример кода, который использует «с помощью» Постулаты, параметры и отправляет ошибку трассировки слушателю (ов) команды

 using (var con = new SqlConnection("Data Source=NIFAL;Initial Catalog=Currency;Integrated Security=True;")) 
     { 
      con.Open(); 
      foreach (var Row in dataGridView1.Rows) 
      { 
       var cmd = new SqlCommand("INSERT INTO CurrencyTable(Country, Currency, Rate) VALUES(@country, @currency, @rate)",con); 
       cmd.Parameters.Add("@country", SqlDbType.VarChar, 20).Value = Row.Cells[0].Value.ToString(); 
       cmd.Parameters.Add("@currency", SqlDbType.VarChar, 20).Value = Row.Cells[1].Value.ToString(); 
       cmd.Parameters.Add("@rate", SqlDbType.Float).Value = Row.Cells[2].Value.ToString(); 
       try 
       { 
        cmd.ExecuteNonQuery(); 
       } 
       catch (Exception err) 
       { 
        //You should here mark the row that has an error and output the error message 
        Row.Cells[3].Value = err.Message; 
       } 
      } 
     } 
+0

Просто используйте 'cmd.Parameters.Add (« @ Country », SqlDbType.VarChar, 50)' - не нужно явно создавать 'новый SqlParameter()' .... –

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