2017-04-20 13 views
0

SQL Database Tableのすべての列をフィルタリングする単一のtextboxがあります。フィルタリングは、FilterIDLSと呼ばれるbuttonでトリガされます。1つのテキストボックスと複数のパラメータを持つDataGridViewへのSQLデータベースのフィルタリング

private void filterIDLS_Click_1(object sender, EventArgs e) 
    { 
     string txt = keyIDLS.Text; 

     if (txt != "") 
     { 
      _db.conn(); 
      _db.cmd.CommandText = @"SELECT * FROM dbo.IncomingLog WHERE 
           [Date Received] LIKE '%{0}%' OR 
           [Reference Number] LIKE '%{0}%' OR 
           [Time Received] LIKE '%{0}%' OR 
           [Title/Description] LIKE '%{0}%' OR 
           [Received Copies] LIKE '%{0}%' OR 
           [Originating Office] LIKE '%{0}%' OR 
           [Received Person] LIKE '%{0}%' OR 
           [Filed Under] LIKE '%{0}%' OR 
           [Encoded By] LIKE '%{0}%'" + keyIDLS.Text; 

      dt = _db.executeDT(); 
     } 
     else 
     { 
      MessageBox.Show("Please type a keyword to search!", "Nothing to Search", MessageBoxButtons.OK, MessageBoxIcon.Error); 
     } 

     if (incomLogTableS.RowCount == 0) 
     { 
      MessageBox.Show("No records from the database found. Please try again.", "0 Records Found", MessageBoxButtons.OK, MessageBoxIcon.Information); 
     } 
    } 

ソリューションを保存するときにエラーはありません。私はそれをデバッグするときしかし、それはこの指す:

public DataTable executeDT() 
    { 
     cmd.Connection = con; 
     SqlDataAdapter adapter = new SqlDataAdapter(cmd); 
     DataTable datatable = new DataTable("DataTable"); 
     adapter.Fill(datatable); 

     adapter.Update(datatable); 

     return datatable; 
    } 

をとのSQLExceptionが未処理だったと言い、それが「PRS」(。私はテキストボックスに入力されたキーワード)

近くに不適切な構文を持っている私は何だろうこれを修正するには?

答えて

1

文字列書式機能の{0}プレースホルダをn回入力しましたが、文字列を正しく書式設定するためにstring.Format(string、arguments)を呼び出すことはありませんでした。

_db.cmd.CommandText = string.Format(@"SELECT ......", keyIDLS.Text); 

しかし、このアプローチ(string.Format)は、sqlコマンドを作成するときは正しくありません。その代わりに、パラメータを使用してSql Injectionを回避し、単一引用符を含む文字列の問題を解析します。

_db.cmd.CommandText = @"SELECT * FROM dbo.IncomingLog WHERE 
        [Date Received] LIKE @p1 OR 
        [Reference Number] LIKE @p1 OR 
        [Time Received] LIKE @p1 OR 
        [Title/Description] LIKE @p1 OR 
        [Received Copies] LIKE @p1 OR 
        [Originating Office] LIKE @p1 OR 
        [Received Person] LIKE @p1 OR 
        [Filed Under] LIKE @p1 OR 
        [Encoded By] LIKE @p1" 
List<SqlParameter> prms = new List<SqlParameter>() 
{ 
    new SqlParameter("@p1", SqlDbType.NVarChar) {Value = keyIDLS.Text} 
}; 
dt = _db.executeDT(prms); 

..... 
public DataTable executeDT(List<SqlParameter> prms = null) 
{ 
    cmd.Connection = con; 
    SqlDataAdapter adapter = new SqlDataAdapter(cmd); 
    DataTable datatable = new DataTable("DataTable"); 
    if(prms != null) 
     adapter.SelectCommand.Parameters.AddRange(prms.ToArray()); 
    adapter.Fill(datatable); 
    return datatable; 
} 

また、すべての列がNVarChar型である場合にのみ、クエリが正しく機能することができます。多くのフィールドは異なるデータ型のように見えるので、DateTime、Numbers、およびTextフィールドの両方を検索するために同じ値を使用するクエリから意味のある結果を得ることは不可能です。

+0

ありがとう、私はこれを試してみます。また、すべての列は 'nvarchar'データ型であり、私はそのように名前を付けました。 – ohmokipo

関連する問題