我使用mysql作为存储数据的数据库。
我有一个带有文本框radiobuttons,comboboxes等的窗体;人们提供自己的个人信息,如(名字,姓氏,性别,约会生日,电话,父亲姓名等)。 (总共40个字段)
我想做一个搜索按钮。使用此按钮,我想填写一些字段,在我按下搜索按钮后,将打开一个新窗口,其中包含具有相同个人信息的所有人。我实现了为一个字段执行搜索按钮(例如,仅按名称搜索)。
但是当我选择使用多个字段进行搜索时,我遇到了问题。例如,我选择搜索所有姓名为:Chris,Nickname:Dung,sex:Male,Birth_Country:UK等的人,但是当我推送搜索时,它会返回一个与搜索数据无关的窗口。有人可以帮我吗?
我在更改后为搜索按钮创建的代码是:
public MySqlDataAdapter da;
public DataSet ds;
public string sTable = "data";
private void anazitisi_button_Click(object sender, EventArgs e)
{
Form2 form2 = new Form2();
try
{
conn = openconnectio.GetConn();
string radiob = null;
if (radioButton1.Checked == true)
{
radiob = radioButton1.Text;
}
else if(radioButton2.Checked == true)
{
radiob = radioButton2.Text;
}
StringBuilder Query = new StringBuilder("SELECT * FROM data d INNER JOIN country c ON d.id_data = c.id_country WHERE 1=1 ");
if (!String.IsNullOrEmpty(textBox1.Text))
Query.Append(" AND name like '" + textBox1.Text + "'");
if (!String.IsNullOrEmpty(textBox2.Text))
Query.Append(" AND lastname like '" + textBox2.Text + "'");
if (!String.IsNullOrEmpty(radiob))
Query.Append(" AND sex like '" + radiob + "'");
if (!String.IsNullOrEmpty(maskedTextBox1.Text))
Query.Append(" AND birthdate like '" + maskedTextBox1.Text + "'");
if (!String.IsNullOrEmpty(maskedTextBox2.Text))
Query.Append(" AND phone_number like '" + maskedTextBox2.Text + "'");
MySqlDataAdapter da = new MySqlDataAdapter(Query.ToString(), conn);
ds = new DataSet();
da.Fill(ds, sTable);
conn.Close();
}
catch (MySql.Data.MySqlClient.MySqlException ex)
{
MessageBox.Show(ex.Message);
}
finally
{
DataGridView dg1 = new DataGridView();
form2.Controls.Add(dg1);
dg1.Dock = DockStyle.Fill;
dg1.Refresh();
dg1.DataSource = ds;
dg1.DataMember = sTable;
form2.Show();
if (conn != null)
{
conn.Close();
}
}
}
当我评论该代码时,搜索后的结果很好:
(生日代码),我当然不用作搜索。
//if (!String.IsNullOrEmpty(maskedTextBox1.Text))
// Query.Append(" AND birthdate like '" + maskedTextBox1.Text + "'");
但是当我使用(生日代码)时,我得到的结果只是一个空白行
我认为因为生日日期maskedTextbox有一个掩码:00/00/0000
有什么建议吗?
感谢。
答案 0 :(得分:3)
我认为你应该考虑三件事 1 - 您可以在查询中将或替换为和 我的意思是代替使用
da = new MySqlDataAdapter(
"SELECT * FROM data INNER JOIN country ON id_data = id_country
WHERE name like '" + textBox1.Text +
"'OR lastname like '" + textBox2.Text +
"'OR sex like '" + radiob +
"'OR birthdate like '" + maskedTextBox1.Text +
"'OR phone
_number like '" + maskedTextBox2.Text + "' ;", conn);
您可以使用
da = new MySqlDataAdapter(
"SELECT * FROM data INNER JOIN country ON id_data = id_country
WHERE name like '" + textBox1.Text +
"'AND lastname like '" + textBox2.Text +
"'AND sex like '" + radiob +
"'AND birthdate like '" + maskedTextBox1.Text +
"'AND phone_number like '" + maskedTextBox2.Text + "' ;", conn);
2 - 您必须根据文本框构建查询字符串,否则查看它们是否具有任何值,如下所示:
StringBuilder Query = "SELECT * FROM data INNER JOIN country ON id_data = id_country
WHERE 1=1 ";
if(!String.IsNullOrEmpty(textBox1.Text))
Query.Append(" AND name like '" + textBox1.Text);
....
答案 1 :(得分:-1)
where子句必须由和/或其他子句创建, 所以,
存在两种解决方案:
在服务器端按存储过程按以下定义:
你必须关注下面的AND / OR位置:
CREATE PROCEDURE [dbo].[dbo_Bank_SELByFields]
(
@ID nvarchar(50) = NULL ,
@BankName nvarchar(50) = NULL ,
@BankCode nvarchar(50) = NULL ,
@Address nvarchar(50) = NULL ,
@BranchCode nvarchar(50) = NULL
)
AS
SELECT * FROM dbo.Bank WHERE
(
(@ID IS NULL OR ID = @ID) AND
(@BankName IS NULL OR BankName =@BankName) AND
(@BankCode IS NULL OR BankCode =@BankCode) AND
(@Address IS NULL OR Address =@Address) AND
(@BranchCode IS NULL OR BranchCode =@BranchCode)
) ORDER BY BankCode
//---you know call the Sp . OK?
以及您的业务层代码中的其他解决方案: 如果您使用ORM(如Entity Framework),非常简单的By IQueryable对象,您可以使用以下内容:
var selectByEnyCondition=(from c in ctx.customer ...);
//---- you must add by below way :
if(!(String.IsNullOrEmpty(txtName.Text)))
{
selectByEnyCondition.Where(.....);
}
if(!String.IsNullOrEmpty(sex))
{
selectByEnyCondition= opportunites.Where(.....);
}
//------
/* **** beacuse you use by ADO.NET technique you should use StringBuilder -->*/
StringBuilder query;
query.add("SELECT * FROM BankTbl WHERE ");
if(!(String.IsNullOrEmpty(txtName.Text))){
query.Add("Name Like {0}",txtName.Text);
//-----now continue for build your criteria
王陛下
再见.....