DataReader с параметри;

В момента се боря с MySQL база данни с DataSet. Работата е там, че използва много памет (както намерих някъде в мрежата, използва почти 4 пъти повече памет, отколкото когато използвате DataReader). Това, което мислех, е да направя функция, която ще използва DataReader за командата SQL SELECT.

Това, за което в момента мисля е (пример):

  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...
    }

Но чувствам, че това е грешен начин. Първо, не използвам параметри. Второто нещо е, че изглежда доста мръсно. Може ли някой да предложи нещо.


person nomail    schedule 19.07.2010    source източник
comment
Това разбира се е SQL инжекция атака, която чака да се случи.....   -  person Colin    schedule 19.07.2010
comment
Благодаря ви, че го посочихте! Ще бъде ли по-добре, ако направя нещо подобно? if (txtName.Text!=) { selectCommand.CommandText += name=@name ; selectCommand.Parameters.Add(@name,txtName.Text); }   -  person nomail    schedule 19.07.2010
comment
Да, така би било по-добре. Винаги дезинфекцирайте входовете си!   -  person Colin    schedule 19.07.2010


Отговори (2)


Бих разделил това и бих извикал отделни функции в зависимост от това какъв филтър искате да приложите:

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

    ...
 }

След това всяка филтърна функция ще съдържа прост код за генериране на командни обекти:

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;
}
person Michael Arnell    schedule 19.07.2010
comment
Здравей, m_arnell! Благодаря ви за отговора! Работата е там, че исках да създам заявка динамично. Тъй като в този пример използвам само 3 параметъра, не е трудно, докато в проекта, в който съм в момента, може да имам нужда от до 7 параметъра и всички те са независими. - person nomail; 19.07.2010

В зависимост от сложността на динамичните елементи, предлагам да включите няколко

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

разбира се, можете да го параматеризирате добре.

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

По дяволите, дори не се нуждаете от if тестове.

person DrFloyd5    schedule 23.05.2013