0

テキストボックスに入力した文字で名前の empid を検索したい。ワイルドカード文字の使用。声明を書きました

da = new SqlDataAdapter(
 "Select empID from emp where FirstName like ' "+textbox1.text+" ' % "
   , connstring); 
da.Fill(ds);

この記述は正しいですか?

4

3 に答える 3

1

入力したステートメントでは、ワイルドカード検索の前に名の前と名の後にスペースを入れることができます。名の一部を検索する場合は、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;
于 2013-04-01T17:55:29.740 に答える
1

あなたは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);
    }
}

% 記号はパラメーター値の一部である必要があり、バインディング パラメーターを使用する場合は一重引用符はまったく必要ありません。

于 2013-04-01T17:52:44.723 に答える
0

その声明には多くの間違いがあります。

簡単なのは、一重引用符とテキストボックスの値の間にスペースがあり、パーセント記号が必要な場所の外にあることです。また、textbox1.textスペルが間違っています。それはより近いはずです:

da = new SqlDataAdapter(
 "Select empID from emp where FirstName like '"+textbox1.Text+"%' ", connstring); 

しかし、それは最初の問題にすぎません。 より大きな問題は、これが SQL インジェクションの最有力候補であることです。パラメータ化されたクエリは SQL インジェクションに対してどのように役立ちますか? を 参照してください。

于 2013-04-01T17:51:17.437 に答える