2012-01-30 2 views
2

J'ai un formulaire avec une zone de texte et un bouton, de sorte que lorsque l'utilisateur clique sur le bouton, le nom spécifié dans la zone de texte est ajouté à une table dans ma base de données sql. Le code du bouton est la suivante:Erreur de syntaxe SQL (commande INSERT)

private void btnAddDiaryItem_Click(object sender, EventArgs e) 
{ 
    try 
    { 
     string strNewDiaryItem = txtAddDiaryItem.Text; 
     if (strNewDiaryItem.Length == 0) 
     { 
      MessageBox.Show("You have not specified the name of a new Diary Item"); 
      return; 
     } 
     string sqlText = "INSERT INTO tblDiaryTypes (DiaryType) VALUES = ('" + strNewDiaryItem + "');"; 
     cSqlQuery cS = new cSqlQuery(sqlText, "non query"); 
     PopulateInitialDiaryItems(); 
     MessageBox.Show("New Diary Item added succesfully"); 
    } 
    catch (Exception ex) 
    { 
     MessageBox.Show("Unhandled Error: " + ex.Message); 
    } 
} 

La cSqlQuery de classe est une classe simple qui exécute différentes actions T-SQL pour moi et son code est le suivant:

class cSqlQuery 
{ 
    public string cSqlStat; 
    public DataTable cQueryResults; 
    public int cScalarResult; 

    public cSqlQuery() 
    { 
     this.cSqlStat = "empty"; 
    } 

    public cSqlQuery(string paramSqlStat, string paramMode) 
    { 
     this.cSqlStat = paramSqlStat; 

     string strConnection = BuildConnectionString(); 
     SqlConnection linkToDB = new SqlConnection(strConnection); 

     if (paramMode == "non query") 
     { 
      linkToDB.Open(); 
      SqlCommand sqlCom = new SqlCommand(paramSqlStat, linkToDB); 
      sqlCom.ExecuteNonQuery(); 
      linkToDB.Close(); 
     } 

     if (paramMode == "table") 
     { 
      using (linkToDB) 
      using (var adapter = new SqlDataAdapter(cSqlStat, linkToDB)) 
      { 
       DataTable table = new DataTable(); 
       adapter.Fill(table); 
       this.cQueryResults = table; 
      } 
     } 

     if (paramMode == "scalar") 
     { 
      linkToDB.Open(); 
      SqlCommand sqlCom = new SqlCommand(paramSqlStat, linkToDB); 
      this.cScalarResult = (Int32)sqlCom.ExecuteScalar(); 
      linkToDB.Close(); 
     } 
    } 

    public cSqlQuery(SqlCommand paramSqlCom, string paramMode) 
    { 
     string strConnection = BuildConnectionString(); 
     SqlConnection linkToDB = new SqlConnection(strConnection); 
     paramSqlCom.Connection = linkToDB; 

     if (paramMode == "table") 
     { 
      using (linkToDB) 
      using (var adapter = new SqlDataAdapter(paramSqlCom)) 
      { 
       DataTable table = new DataTable(); 
       adapter.Fill(table); 
       this.cQueryResults = table; 
      } 
     } 

     if (paramMode == "scalar") 
     { 
      linkToDB.Open(); 
      paramSqlCom.Connection = linkToDB; 
      this.cScalarResult = (Int32)paramSqlCom.ExecuteScalar(); 
      linkToDB.Close(); 
     } 
    } 

    public string BuildConnectionString() 
    { 
     cConnectionString cCS = new cConnectionString(); 
     return cCS.strConnect; 
    }   
} 

La classe fonctionne bien tout au long de ma demande, donc je ne pense pas que l'erreur est dans la classe, mais je ne peux pas être sûr.

Lorsque je clique sur le bouton, je reçois le message d'erreur suivant:

syntaxe incorrecte = près

Ce qui est vraiment ennuyeux moi, parce que quand je lance exactement la même commande dans SQL Management Studio ça fonctionne bien. Je suis sûr qu'il me manque quelque chose d'assez simple, mais après avoir lu mon code à plusieurs reprises, j'ai du mal à voir où je me suis trompé.

+2

Regardez dans les requêtes paramétrées. Ne jamais aller à la base de données avec une entrée d'utilisateur non-anonymes. –

+3

essayez d'entrer ceci sous la forme: 'MyDiaryItem '); DROP TABLE tblDiaryTypes'. Alors lisez quelques-uns des liens dans cette recherche google: http://www.google.com/search?q=sql+injection – jeroenh

Répondre

7

Vous n'avez pas besoin =

Un insert valide ressemblerait

INSERT INTO table_name (column1, column2, column3,...) 
VALUES (value1, value2, value3,...) 

Source: http://www.w3schools.com/sql/sql_insert.asp

+0

bon sang - j'ai dit que ce serait quelque chose de simple: s Merci à tous. – PJW

11

vous devez enlever = après les valeurs.

string sqlText = "INSERT INTO tblDiaryTypes (DiaryType) VALUES ('" + strNewDiaryItem + "');" 

et d'essayer d'utiliser des requêtes paramétrées pour éviter l'injection Sql. Utilisez votre code comme ça. Sql Parameters

string sqlText = "INSERT INTO tblDiaryTypes (DiaryType) VALUES (@DairyItem);" 
    YourCOmmandObj.Parameters.AddwithValue("@DairyItem",strNewDiaryIItem) 
-1

Supprimer "=", et aussi je vous recommande d'utiliser string.format() au lieu de concaténation de chaînes.

sqlText = string.format(INSERT INTO tblDiaryTypes (DiaryType) VALUES ('{0}'), strNewDiaryItem);"

+4

String.Format ne va pas vous sauver ici. N'utilisez jamais directement l'entrée de l'utilisateur dans une requête SQL. Utilisez plutôt des requêtes paramétrées. – jeroenh

0

S'il vous plaît utiliser ce qui suit:

insert into <table name> Values (value);