【解決方法】C# の 1 つのテキスト ボックスで複数の値を検索する

プログラミングQA


親愛なるみんな、

C#で検索するフォームを作りました。 このフォームでは、データ グリッド ビューのテキスト ボックスから NTN (国税番号) を検索しますが、問題は、このテキスト ボックスから 1 つの NTN を検索できることです。 検索するNTNが何百もありますが。 このテキストボックスから複数の値を検索したい。 VB.NET でも同じように作成し、各 NTN を qomma で区切りました。 C#で同じことを行うにはどうすればよいですか。

私が試したこと:

private void searchbtn_Click(object sender, EventArgs e)
        {
            SqlConnection con = new SqlConnection(cs);
            string query = "select * from atlit where ntn like @ntn";
            SqlDataAdapter sda = new SqlDataAdapter(query, con);
            sda.SelectCommand.Parameters.AddWithValue("@ntn", searchtxtbox.Text.Trim());
            DataTable data = new DataTable();
            sda.Fill(data);
            if(data.Rows.Count > 0)
            {
                dataGridView1.DataSource = data;
                MessageBox.Show("This Search is in ATL List");
            }
            else
            {
                MessageBox.Show("No Record Found!!!!!");
                dataGridView1.DataSource= data;
            }

            lbl_recordfound.Text = "Total Records found: " + data.Rows.Count.ToString("#,###");
            lbl_recordfound.Enabled = true;

解決策 1

SQL IN 演算子を使用できます。以下を参照してください。 SQL IN 演算子[^]

例として、非常に尊敬されている CodeProject メンバーの 1 人からの次の回答を参照してください。 1 つのテキスト ボックスで複数の値を検索する方法[^]

解決策 2

解決策 1 からリンクされた回答では、値を直接クエリに連結すると脆弱になることが言及されています。 SQL インジェクション[^]; 残念ながら、それを回避する正しい方法は示されていません。

次のようなライブラリを使用できます ダッパー[^] これを達成するために。 または、それほど複雑ではない独自のコードを作成することもできます。

C#
DataTable data = new DataTable();

using (SqlConnection con = new SqlConnection(cs))
using (SqlDataAdapter sda = new SqlDataAdapter(null, con))
{
    var commandText = new System.Text.StringBuilder("SELECT * FROM atlit WHERE 1 = 0");
    foreach (string ntn in searchtxtbox.Text.Split(','))
    {
        if (string.IsNullOrWhiteSpace(ntn)) continue;
        
        string parameterName = "@ntn" + sda.SelectCommand.Parameters.Count;
        sda.SelectCommand.Parameters.AddWithValue(parameterName, ntn.Trim());
        commandText.Append(" OR ntn Like ").Append(parameterName);
    }
    
    sda.SelectCommand.CommandText = commandText.ToString();
    sda.Fill(data);
}

これにより、次のようなクエリが作成されます。

SQL
SELECT * FROM atlit WHERE 1 = 0 OR ntn Like @ntn0 OR ntn Like @ntn1

テキストボックスのカンマ区切りの各値は、パラメータとしてコマンドに追加されます。 値が入力されていない場合、データは返されません。

コメント

タイトルとURLをコピーしました