2 votes

DataReader avec des paramètres ;

Je me débats actuellement avec une base de données MySQL avec DataSet. Le problème est qu'il utilise beaucoup de mémoire (comme je l'ai trouvé quelque part sur le net, il utilise presque 4 fois plus de mémoire que lorsque vous utilisez DataReader). Ce à quoi je pensais, c'était de créer une fonction qui utiliserait DataReader pour la commande SQL SELECT.

Ce à quoi je pense actuellement est (exemple) :

  public void GetData(string name,string surname, string company)
    {
        string selectCommand="";
        selectCommand += "SELECT * FROM thetable ";
        if (txtName.Text!="" || txtSurname.Text!="" || txtCompany.Text!="")
            selectCommand += "WHERE ";

        if (txtName.Text!="")
            selectCommand += "name=" + txtName.Text+ " ";

        if (txtSurname.Text!="")
            selectCommand += "surname=" + txtSurname.Text + " ";

        if (txtCompany)
            selectCommand += "company=" + txtCompany.Text + " ";

        MySqlDataAdapter dataAdapter = new MySqlDataAdapter(selectCommand+";",conn);
      ///etc...
    }

Mais je pense que c'est une mauvaise voie. Tout d'abord, je n'utilise pas de paramètres. Ensuite, cela a l'air un peu sale. Quelqu'un peut-il me suggérer quelque chose ?

3voto

Colin Points 9465

Il s'agit bien sûr d'une attaque par injection SQL qui ne demande qu'à se produire......

1voto

Michael Arnell Points 653

Je décomposerais cela et appellerais des fonctions séparées en fonction du filtre que vous voulez appliquer :

public void GetData(string name, string surname, string company)
{
    DbDataCommand command;

    if (name=!"" && surname!="" && company!="")
    {
        command = GetDataFilteredByFirstNameSurnameCompany(name, surname, company);
    }

    if (name=!"" && surname!="")
    {
        command = GetDataFilteredByFirstNameSurname(name, surname);
    }

    ...

    DbDataReader reader = command.ExecuteReader();

    ...
 }

Chaque fonction de filtre contiendrait alors un code simple pour générer des objets de commande :

private DbCommand GetDataCommandFilteredByFirstNameSurnameCompany(string name,string surname, string company)
{
  DbCommand command = conn.CreateCommand();

  command.CommandText = @"
      SELECT    *
      FROM      some_table
      WHERE     name = @name AND
                surname = @surname AND
                company = @company";

   DbParameter parameter = command.CreateParameter();

   parameter.Name = "name";
   parameter.Value = name;

   command.Parameters.Add(parameter);

   parameter = command.CreateParameter();

   parameter.Name = "surname";
   parameter.Value = surname;

   command.Parameters.Add(parameter);

   parameter = command.CreateParameter();

   parameter.Name = "company";
   parameter.Value = company;

   command.Parameters.Add(parameter);

   return command;
}

0voto

Samuel Renkert Points 4139

Selon la complexité des éléments dynamiques, je vous suggère d'inclure quelques

selectCommand += "(surname='" + txtSurname.Text + "' or surname='') and ";
selectCommand += "(company='" + txtCompany.Text + "' or company='') and ";

Bien sûr, vous pouvez très bien le paramétrer.

selectCommand += "(surname=:i_surname or :i_surname='') and ";
selectCommand += "(company=:i_company or :i_company='') and ";

// etc... etc...

parameter = command.CreateParameter();
parameter.Name = "surname";
parameter.Value = txtSurname.text;
command.Parameters.Add(parameter);

Vous n'avez même pas besoin des tests.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X