テキストボックスに入力した文字で名前の empid を検索したい。ワイルドカード文字の使用。声明を書きました
da = new SqlDataAdapter(
"Select empID from emp where FirstName like ' "+textbox1.text+" ' % "
, connstring);
da.Fill(ds);
この記述は正しいですか?
テキストボックスに入力した文字で名前の empid を検索したい。ワイルドカード文字の使用。声明を書きました
da = new SqlDataAdapter(
"Select empID from emp where FirstName like ' "+textbox1.text+" ' % "
, connstring);
da.Fill(ds);
この記述は正しいですか?
入力したステートメントでは、ワイルドカード検索の前に名の前と名の後にスペースを入れることができます。名の一部を検索する場合は、SQL を次のように変更する必要があります。
SELECT empID FROM emp WHERE FirstName LIKE '@FirstName%'
また、単に引数を連結するよりも、次のようにパラメーター化されたクエリを使用する方がはるかに安全です。
StringBuilder sb = new StringBuilder();
sb.Append("SELECT empID FROM emp WHERE FirstName LIKE '@FirstName%'");
SqlConnection conn = new SqlConnection(connStr);
SqlCommand command = new SqlCommand(sb.ToString());
command.CommandType = CommandType.Text;
command.Parameters.AddWithValue("FirstName", textbox1.Text);
DataTable dt = new DataTable();
SqlDataAdapter da = new SqlDataAdapter(command);
da.Fill(dt);
ストアド プロシージャを使用する場合は、次のように SqlCommand オブジェクトをセットアップする必要があります。
SqlCommand command = new SqlCommand("Procedure", conn);
command.CommandType = Command.StoredProcedure;
あなたはsql-injectionsql-parameters
のために開いています、代わりに使用してください:
string sql = "SELECT empID " +
"FROM emp " +
"WHERE FirstName like @FirstName";
using(var con = new SqlConnection(connstring))
using (SqlCommand command = new SqlCommand(sql, con))
{
command.Parameters.AddWithValue("@FirstName", textbox1.text + "%");
using(var da = new SqlDataAdapter(command))
{
da.Fill(ds);
}
}
% 記号はパラメーター値の一部である必要があり、バインディング パラメーターを使用する場合は一重引用符はまったく必要ありません。
その声明には多くの間違いがあります。
簡単なのは、一重引用符とテキストボックスの値の間にスペースがあり、パーセント記号が必要な場所の外にあることです。また、textbox1.text
スペルが間違っています。それはより近いはずです:
da = new SqlDataAdapter(
"Select empID from emp where FirstName like '"+textbox1.Text+"%' ", connstring);
しかし、それは最初の問題にすぎません。 より大きな問題は、これが SQL インジェクションの最有力候補であることです。パラメータ化されたクエリは SQL インジェクションに対してどのように役立ちますか? を 参照してください。