【问题标题】:DataReader with parametrs;带参数的数据读取器;
【发布时间】:2011-03-17 19:11:43
【问题描述】:

我目前正在使用 DataSet 处理 MySQL 数据库。问题是它使用了大量的内存(正如我在网上的某个地方发现的那样,它使用了几乎 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...
    }

但我觉得这是一种错误的方式。首先,我没有使用参数。第二件事是它看起来有点脏。 谁能给点建议。

【问题讨论】:

  • 这当然是等待发生的SQL注入攻击.....
  • 感谢您指出这一点!如果我做这样的事情会更好吗? if (txtName.Text!="") { selectCommand.CommandText += "name=@name"; selectCommand.Parameters.Add("@name",txtName.Text); }
  • 是的,这样会更好。始终清理您的输入!

标签: c# mysql dataset datareader


【解决方案1】:

我会根据您要应用的过滤器将其分解并调用单独的函数:

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

【讨论】:

  • 嗨,m_arnell!感谢你的回复!问题是我想动态创建一个查询。在这个例子中我只使用了 3 个参数,这并不难,而在我目前正在进行的项目中,我可能需要多达 7 个参数并且它们都是独立的。
【解决方案2】:

根据动态元素的复杂程度,我建议你包括几个

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 测试。

【讨论】:

    猜你喜欢
    • 2011-09-21
    • 2015-02-27
    • 1970-01-01
    • 2020-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-25
    相关资源
    最近更新 更多