[ad_1]
親愛なるみんな、
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
テキストボックスのカンマ区切りの各値は、パラメータとしてコマンドに追加されます。 値が入力されていない場合、データは返されません。
[ad_2]
コメント