2011-06-17 4 views
2

Je crée une méthode pour sélectionner l'ID de n'importe quelle table en passant un champ de recherche.Comment passer une table en tant que paramètre à MySqlCommand?

private int SelectId(string tabela, string campo, string valor) 
{ 
    int id = 0; 

    using (command = new MySqlCommand()) 
    { 
     command.Connection = conn; 

     command.Parameters.Add("@tabela", MySqlDbType.).Value = tabela; 
     command.Parameters.Add("@campo", MySqlDbType.Text).Value = campo; 
     command.Parameters.Add("@valor", MySqlDbType.VarChar).Value = valor; 

     command.CommandText = "SELECT `id` FROM @tabela WHERE @[email protected];"; 

     try 
     { 
      id = (int)command.ExecuteScalar(); 
     } 
     catch (MySqlException ex) 
     { 
      MessageBox.Show(ex.Number + " : " + ex.Message + command.CommandText); 
     } 
     catch (Exception) 
     { 
      throw; 
     } 
    } 

    return id; 
} 

Mais j'obtiens une exception MySqlException à propos de l'erreur de syntaxe. Quand je regarde le message d'exception, il me montre la requête avec le tableau cité! Comment passer la table en paramètre sans guillemets?

Répondre

6

La plupart des bases de données ne permettent pas de spécifier les noms de tables ou de colonnes via les paramètres. Les paramètres doivent être pour valeurs. Si vous avez réellement besoin de cela pour être dynamique, vous devez valider l'entrée (il doit s'agir d'un nom de table connu, avec des noms de colonnes connus dans cette table), puis l'inclure dans le SQL.

+0

Merci beaucoup, les gars. Maintenant, j'ai une meilleure compréhension de SQL paramétré. – programad

2

Je suis d'accord avec Jon. Voici un exemple de votre code avec le nom de la table inséré directement dans le script, et non en tant que paramètre. Notez que vous voulez toujours valider le nom de la table et de la colonne à pour empêcher l'injection SQL. Je n'ai pas inclus cela ici, mais j'ai mis des talons de commentaires pour vous.

private int SelectId(string tabela, string campo, string valor) 
    { 
     int id = 0; 

     using (command = new MySqlCommand()) 
     { 
      command.Connection = conn; 

      command.Parameters.Add("@campo", MySqlDbType.Text).Value = campo; 
      command.Parameters.Add("@valor", MySqlDbType.VarChar).Value = valor; 

      // TODO: Validate table name for parameter 'tabela' to prevent SQL injection 
      // TODO: Validate column name for parameter 'campo' to prevent SQL injection 

      command.CommandText = "SELECT `id` FROM " + tabela + " WHERE @[email protected];"; 

      try 
      { 
       id = (int)command.ExecuteScalar(); 
      } 
      catch (MySqlException ex) 
      { 
       MessageBox.Show(ex.Number + " : " + ex.Message + command.CommandText); 
      } 
      catch (Exception) 
      { 
       throw; 
      } 
     } 

     return id; 
    } 
Questions connexes