DataReader с параметрами; - PullRequest
       51

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

2 голосов
/ 19 июля 2010

В настоящее время я борюсь с базой данных 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...
    }

Но я чувствую,неправильный путь.Прежде всего, я не использую параметры.Второе - это выглядит грязно.Может кто-нибудь, пожалуйста, предложить что-нибудь.

Ответы [ 2 ]

1 голос
/ 19 июля 2010

Я бы разбил это и вызвал отдельные функции в зависимости от того, какой фильтр вы хотите применить:

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;
}
0 голосов
/ 23 мая 2013

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

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.

...