2013-06-15 11 views
5

Fondamentalmente quello che sto facendo è che, facendo clic su un pulsante, il programma estrarrà i dati da una particolare riga in base a ciò che l'utente ha scelto e lo colloca in una tabella diversa utilizzando INSERT. Quello che segue è il codice.Sintassi dell'istruzione 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(); 
    } 

Il mio codice non riesce e dice

"Sintassi non corretta accanto elemento fila"

I tipi di due tabelle sono uguali e ho cercato di testare questo fondo !

+0

Nel fare un 'INSERT', non stai tornando una raccolta di dati - quindi, si dovrebbe usare' command1.ExecuteNonQuery(); 'al posto del '.ExecuteReader()' dove poi ignori semplicemente il lettore, davvero .... –

risposta

15

Sembra che l'ultima istruzione SQL non è corretta. Forse la ragione è l'uso di apostrofo nel tuo sql stament, ma non dovresti preoccupartene. Spiego nel mezzo della mia risposta perché non dovresti preoccupartene.

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

Per scoprire qual è esattamente il problema, è possibile specificare invece i nomi di colonna. Ma ti suggerisco di utilizzare la query con parametri non è nemmeno necessario specificare i nomi delle colonne.

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(); 

È consigliabile utilizzare sempre parameterized queries. Questo tipo di codici sono disponibili per gli attacchi SQL Injection.

Anche come Marc mentioned, non è il caso di utilizzare ExecuteReader() per questa istruzione SQL perché è solo INSERT dati, non restituisce alcun dato. Per questo motivo, in questo caso è sufficiente utilizzare ExecuteNonQuery().

+1

Non hai idea di quanto sia grato adesso! Grazie mille! – NetUser101

4

provare a specificare le colonne nella query:

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

Come nota aggiuntiva, anche imparare a utilizzare le query paramerterized. Per esempio:

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

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

3

Il tuo problema immediato è che la tua istruzione INSERT ha una sintassi non valida in; molto probabilmente uno dei valori che stai usando per costruirlo ha un apostrofo che termina la stringa in anticipo.

Il tuo problema più grande è che il tuo non dovrebbe mai essere creare istruzioni di inserimento in questo modo. Oltre ad essere molto incline agli errori del tipo che stai vedendo, è anche una classica apertura agli attacchi SQL injection. (Immaginate, per esempio, se la natura di una situazione è foo'); drop table situation; --).

Si deve usare query con parametri:

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.