2013-06-15 3 views
5

В основном, что я делаю, так это то, что при нажатии кнопки программа будет извлекать данные из определенной строки в соответствии с тем, что пользователь выбрал, и поместить в другую таблицу, используя INSERT. Ниже приведен код.Синтаксис инструкции SQL Insert

private void button3_Click(object sender, EventArgs e) 
{ 
     const String connectionString = "Data Source = Vanessa-PC\\SQLEXPRESS; Initial Catalog = IUMDC; Connect Timeout = 15; Integrated Security = true"; 
     SqlConnection con = new SqlConnection(connectionString); 

     //int SituationID1; 
     label24.Show(); 

     foreach (SitID x in Sittbl) 
     { 
      if (x.ID == Convert.ToInt16(comboBox1.SelectedItem)) 
      { 
       try 
       { 
        con.Open(); 
        SqlCommand command = new SqlCommand("SELECT * FROM Situation WHERE SituationID=" + x.SitIDs, con); 
        SqlDataReader dr = command.ExecuteReader(); 

        while (dr.Read()) 
        { 
         sitid1 = Convert.ToInt32(dr[0]); 
         name1 = dr[4].ToString(); 
         incident1 = Convert.ToDateTime(dr[1]); 
         charges1 = dr[5].ToString(); 
         nature1 = dr[2].ToString(); 
        } 

        con.Close(); 
       } 
       catch (SqlException ex) 
       { 
        MessageBox.Show("Database failed to connect" + ex.Message); 
       } 

       //SituationID = x.SitIDs; 
      } 
     } 

     try 
     {      
      con.Open(); 
      SqlCommand command1 = new SqlCommand("INSERT INTO CurrentSit VALUES (" + sitid1 + ",'" + incident1.ToString("YYYY-mm-DD") + "', '" + nature1 + "', '" + name1 + "', '" + charges1 + "'", con); 
      SqlDataReader dr1 = command1.ExecuteReader(); 
      con.Close(); 
     } 
     catch (SqlException ex) 
     { 
      MessageBox.Show("Database failed to connect" + ex.Message); 
     } 
     //Situation Sit = new Situation(); 
     //Sit.ShowDialog(); 
    } 

Мой код не удается, и говорит

«Неправильный синтаксис около строки пункт»

Типы двух таблиц такие же, и я попытался проверить это тщательно !

+0

При выполнении 'INSERT', вы не получаете набор данных - таким образом, вы должны использовать' command1.ExecuteNonQuery(); 'вместо '.ExecuteReader()', где вы тогда просто игнорируете читателя, действительно .... –

ответ

15

Похоже, ваше последнее утверждение SQL не является правильным. Может быть, причина в использовании апострофа в вашем sql stament, но вы не должны заботиться об этом. Я объясняю в середине своего ответа, почему вам все равно.

SqlCommand command1 = new SqlCommand("INSERT INTO CurrentSit VALUES (" + sitid1 + ",'" + incident1.ToString("YYYY-mm-DD") + "', '" + nature1 + "', '" + name1 + "', '" + charges1 + "'", con); 

Чтобы выяснить, в чем проблема, вы можете указать вместо них имена столбцов. Но я предлагаю вам использовать параметризованный запрос , даже не обязательно указывать имена столбцов.

SqlCommand command1 = new SqlCommand("INSERT INTO CurrentSit VALUES(@sitid1, @incident1, @nature1, @name1, @charges1)", con); 

command1.Parameters.AddWithValue("@sitid1", sitid1); 
command1.Parameters.AddWithValue("@incident1", incident1.ToString("YYYY-mm-DD")); 
command1.Parameters.AddWithValue("@nature1", nature1); 
command1.Parameters.AddWithValue("@name1", name1); 
command1.Parameters.AddWithValue("@charges1", charges1); 

command1.ExecuteNonQuery(); 

Вы должны всегда использовать parameterized queries. Этот вид кодов открыт для SQL Injection атак.

Также как Marc mentioned, нет смысла использовать ExecuteReader() для этого оператора sql, поскольку он является только INSERT данных, не возвращает никаких данных. Из-за этого вам нужно использовать только ExecuteNonQuery().

+1

Вы не представляете, насколько я благодарен за то, что я сейчас! Спасибо огромное! – NetUser101

4

Try указания столбцов в запросе:

"INSERT INTO CurrentSit (sitid, incident, nature, name1, charges) VALUES (" + sitid1 + ",'" + incident1.ToString("YYYY-mm-DD") + "', '" + nature1 + "', '" + name1 + "', '" + charges1 + "'", con)"; 

В качестве дополнительной записке, а также научиться использовать paramerterized запросы. Например:

command1.Parameters.AddWithValue("@name1", name1); 
command1.Parameters.AddWithValue("@charges1", charges1); 

http://johnhforrest.com/2010/10/parameterized-sql-queries-in-c/

3

Ваша непосредственная проблема в том, что ваш оператор INSERT имеет некоторые недопустимые синтаксисы; скорее всего, одно из значений, которое вы используете для его создания, имеет апостроф в нем, который рано заканчивает вашу строку.

Ваша большая проблема в том, что вы никогда не должны никогда строить вставки заявления таким образом. Помимо того, что вы очень склонны к ошибкам, которые вы видите, это также классическое открытие для SQL-инъекций. (Представьте, например, если природа ситуации foo'); drop table situation; --).

Вы должны использовать параметризованные запросы:

var sql = "INSERT INTO CurrentSit VALUES (@sitid, @incident, @nature, @name, @charges)" 
var cmd = new SqlCommand(sql, con); 
cmd.Parameters.Add("@Sitid", SqlDbType.Int).Value = sitid1; 
// etc. 
Смежные вопросы