2017-05-31 15 views
0

私はsap.net Webフォームを使用しています。このウェブフォームには、テキストとボタンがあります。ユーザーが名前またはIDを入力し、検索ボタンを押します。 IDでの検索は正常に機能していますが、名前では機能しません。 私がここで逃しているものは私を助けてください。 シグナル照会でLikeと= operaterが連携していません

String Status = "Active"; 
     String BDstring = ConfigurationManager.ConnectionStrings["CS"].ConnectionString; 
     using (SqlConnection conn = new SqlConnection(BDstring)) 
     { 
      try 
      { 
       String query = "SELECT * from Driver where(Name LIKE '%' + @search + '%' OR DriverID = @search) AND Status = 'Active'"; 
       SqlCommand cmd = new SqlCommand(query, conn); 
       cmd.Parameters.AddWithValue("@search", SearchTextBox.Text); 
       conn.Open(); 
       SqlDataReader SDR = cmd.ExecuteReader(); 
       DataTable DT = new DataTable(); 
       if (SDR.HasRows) 
       { 
        DT.Load(SDR); 
        GridView.DataSource = DT; 
        GridView.DataBind(); 
       } 
      } 
      catch (SqlException exe) 
      { 
       throw exe; 
      } 
     } 
    } 
+3

? – Richard

+0

私はそれをテストしたので。 –

+1

** **何が起こったのですか?おそらくvarcharをintに変換できないという不平を言って例外がスローされますか? –

答えて

2

コードで例外が生成されています。あなたがこれを認識していないという事実は、実際には「エラー隠れ」である、システムのどこかで「エラー処理」が行われていることを示しています。空のcatchブロックまたは無意味なcatchブロックを削除して、例外の情報を破棄して再スローします。それらはあなたを助けていない。

実際の問題はDriverID列がintで、パラメータがvarcharであることです。 varcharに数値(変換がprecedenceのために起こる方向)に変換できる文字列が含まれている限り、クエリは整形式です。

暗黙的に数値に変換できない文字列がパラメータに含まれると、SQL Serverは.NETが例外となるエラーを生成します。

LIKEの変形では、LIKEは文字列に対してのみ動作するため、反対方向(数値 - > varchar)の変換を強制しています。その変換は常に成功しますが、数字ではなくテキストによる比較を実行していることを意味します。また、ここではインデックスの使用が可能でないことを意味します。

私はあなたが入力テキストにint.TryParseを試みるためにあなたのC#のコードを変更して、SQL Serverに文字列と(オプションで)その等価な数値を渡すの別々のパラメータを使用することをお勧めしたいです。次に、各比較のためにクエリで適切なパラメータを使用します。


ような何か:あなたはそれが機能していません知っていますどのように

String Status = "Active"; 
String BDstring = ConfigurationManager.ConnectionStrings["CS"].ConnectionString; 
using (SqlConnection conn = new SqlConnection(BDstring)) 
{ 
    String query = "SELECT * from Driver where(Name LIKE '%' + @search + '%' OR " + 
        "DriverID = @driverId) AND Status = 'Active'"; 
    SqlCommand cmd = new SqlCommand(query, conn); 
    cmd.Parameters.Add("@search", SqlDbType.VarChar,50).Value = SearchTextBox.Text; 
    cmd.Parameters.Add("@driverId", SqlDbType.Int); 
    int driverId; 
    if(int.TryParse(SearchTextBox.Text, out driverId)) 
    { 
     cmd.Parameters["@driverId"].Value = driverId; 
    } 
    conn.Open(); 
    SqlDataReader SDR = cmd.ExecuteReader(); 
    DataTable DT = new DataTable(); 
    if (SDR.HasRows) 
    { 
     DT.Load(SDR); 
     GridView.DataSource = DT; 
     GridView.DataBind(); 
    } 
} 
+0

ドライバIDをintに変換して、文字列が正しい形式でない文字列を返しました –

+0

@fahad - サンプルコードを更新しようとしましたが、不完全なのでコンパイルしてデバッグすることはできません。どのような変更が行われたか分かりませんが、どのデータ型*がどこにあっても*型が一致することを確認してください* - 暗黙的な変換が起こらないようにしてください。その点に達すると、変換エラーが発生してはいけません。あなたのコメントは、ドライバIDが既に 'int'だったので不明です。 –

0

"( '+ @search + "%% OR DriverID = '" + @search + "' ANDステータス= 'アクティブ' ドライバーどこ名LIKE)" から" SELECT *';

これはどうですか?

+0

このコンテキストでは名前の検索は存在しません –

+0

クエリ文字列の外にSQL変数を移動してコンパイルしないようにしました – MikeT

+0

これは以前は持っていなかったコードにSQLインジェクションの脆弱性を追加する* 1。本当にお勧めしません。クエリを送信する前に –

関連する問題