实现数据库搜索

时间:2013-02-24 16:44:31

标签: c# mysql sql search select

我使用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
有什么建议吗? 感谢。

2 个答案:

答案 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);
....

3 - Sql Injection vulnerabilities

答案 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 
王陛下 再见.....