2

我使用 mysql 作为存储数据的数据库。

我有一个带有文本框、单选按钮、组合框等的窗体;人们在其中提供有关自己的个人信息,例如(名字、姓氏、性别、生日日期、电话、父亲姓名等等)。(共 40 个字段)

我想做一个搜索按钮。使用此按钮,我想填写一些字段,然后按搜索按钮打开一个新窗口,其中包含所有具有相同个人信息的人。我实现了为一个字段做一个搜索按钮(例如仅按名称搜索)。

但是当我选择使用多个字段进行搜索时,我遇到了问题。例如,我选择搜索所有姓名为:Chris、昵称:Dung、性别: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 有什么
建议吗?
谢谢。

4

2 回答 2

3

我认为您应该考虑三件事
1-您可以在查询中将OR替换为And
我的意思是而不是使用

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 注入漏洞

于 2013-02-24T17:56:01.527 回答
-1

我的天啊 !!!一些编程!

where 子句必须由 and/or ,... 其他子句创建,所以 ,

存在两种解决方案:在服务器端按以下定义存储过程:
您必须注意以下 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,非常容易通过 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 

国王守卫
再见......

于 2013-02-24T17:47:35.507 回答