2

データを保存するデータベースとしてmysqlを使用しています。

テキストボックス、ラジオボタン、コンボボックスなどを備えたウィンドウフォームがあります。人々が自分自身に関する個人情報を提供する場所 (名、姓、性別、誕生日、電話番号、父親の名前など)。(全40分野)

検索ボタンをつけたい。このボタンを使用していくつかのフィールドに入力し、検索ボタンを押すと、同じ個人情報を持つすべての人を含む新しいウィンドウが開きます。1 つのフィールドに対して検索ボタンを実行することができました (たとえば、名前だけで検索するなど)。

しかし、複数のフィールドで検索することを選択すると問題が発生します。たとえば、名前:Chris、ニックネーム:Dung、性別:男性、出生国: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

3つのことを考慮する必要があると思います
1- ORAndに置き換えることができますクエリ
では、使用する代わりに

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 で作成する必要があります ... その他の節 , so ,

2つのソリューションが存在します:以下の定義によるストアプロシージャによるサーバー側:以下
の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? 

ビジネスレイヤーコードのその他のソリューション: Entity Framework などの 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 に答える