我目前正在使用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...
}
但我觉得这是一种错误的方式。首先,我没有使用参数。第二件事是它看起来有点脏。 任何人都可以提出建议。
答案 0 :(得分: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();
...
}
然后,每个Filter函数都包含生成命令对象的简单代码:
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;
}
答案 1 :(得分:0)
根据动态元素的复杂程度,我建议你加入一些
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测试。