2017-01-05 80 views
2

該代碼能夠根據搜索表單文本框中提供的值搜索數據並將其加載到DataGridView。如果我將任何文本框留空,由於SQL查詢與「AND」組合在一起,因此沒有搜索結果。在數據庫中搜索時忽略空文本框

如何在搜索時忽略空文本框(從SQL查詢或C#代碼)?

private void btnSearch_Click(object sender, EventArgs e) 
{ 
    DataSet ds = new DataSet(); 

    String select = "SELECT DocumentNo, Revision, DocumentTitle, DocumentType 
        FROM DocumentLog 
        WHERE DocumentNo Like '%" + tbxDocumentNo.Text + "%' 
         AND Revision Like '%" + tbxRevision.Text + "%' 
         AND DocumentTitle Like '%" + tbxDocumentTitle.Text + "%' 
         AND DocumentType '%" + tbxDocumentType.Text + "%'" 
         AND IsDeleted = '0'; 

    SqlConnection conn = DBConnection.openConnection(); 
    SqlCommand command = new SqlCommand(select, conn); 

    SqlDataAdapter da = new SqlDataAdapter(command); 
    da.Fill(ds, "DocumentLog"); 

    dgvTracking.AutoGenerateColumns = false; 
    dgvTracking.DataSource = ds.Tables["DocumentLog"]; 
} 
+3

請使用綁定的參數,你的代碼很容易受到SQL注入攻擊。 – nvoigt

+0

爲什麼在查詢字符串之外的行AND ANDDeleted ='0''? – LightBulb

回答

3
  • 首先你必須用參數化查詢替換連接字符串查詢,以避免注射,
  • 其次,你可以使用String.IsNullOrEmpty來檢查值是否爲空或空之前將其添加到哪裏條款。
  • 您需要注意的第三件事是多個條件分隔符是AND,如果您添加了那麼在第二個條件(tbxRevision)的開頭,那麼如果tbxDocumentNo爲空或空,查詢就會變爲錯誤。類似的情況下,如果最後一個條件爲false,那麼查詢將以AND結尾,這也是一個錯誤。爲了避免這些,我們可以採取IsDeleted='0'作爲第一個條件,就像我在下面的代碼中一樣,

請看看:

string querySQL = "Select DocumentNo , Revision, DocumentTitle, DocumentType FROM DocumentLog WHERE IsDeleted='0'"; 
using(SqlConnection conSQL = DBConnection.openConnection()) 
{ 
    using(SqlCommand cmdSQL = new SqlCommand()) 
    { 
     if(!string.IsNullOrEmpty(tbxDocumentNo.Text)) 
     { 
      querySQL += "AND DocumentNo Like @DocumentNo"; 
      cmdSQL.Parameters.Add("@DocumentNo", SqlDbType.VarChar).Value = "%" + tbxDocumentNo.Text + "%"; 
     } 

     // Add rest of conditions here like this 

     cmdSQL.CommandText=querySQL; 
     cmdSQL.Connection = conSQL; 
    SqlDataAdapter da = new SqlDataAdapter(cmdSQL);          
    } 
} 
+0

你可以作弊並使用始終硬編碼IsDeleted = 0而不是1 = 1 :) – nvoigt

+0

@nvoigt:謝謝,你是對的,我錯過了那個條件;無論如何,我已經更新了答案 –

+0

謝謝!謝謝你的時間。這工作 – ceranda

0

你好你可以使用一些查詢邏輯爲此,例如查詢可能是:

Select DocumentNo , Revision, DocumentTitle, DocumentType 
FROM DocumentLog 
WHERE (DocumentNo Like '%"+tbxDocumentNo.Text+"%' OR tbxDocumentNo.Text = '') AND 
(Revision Like '%"+tbxRevision.Text+"%' OR Revision = '') AND 
(DocumentTitle Like '%"+tbxDocumentTitle.Text+"%' OR DocumentTitle = '') AND 
DocumentType '%"+tbxDocumentType.Text+"%'";AND IsDeleted='0' 
+0

我不明白這有何幫助?當字段的值未給出時,OP想要省略該字段的子句。 – nvoigt

1

如果你不想讓你的SQL命令,包括你需要停止該條款AND Revision Like ''將SQL命令硬編碼爲單個字符串,並根據輸入框生成該字符串。

StringBuilder sqlCommandText = new StringBuilder(); 

sqlCommandText.Append("Select DocumentNo , Revision, DocumentTitle, DocumentType FROM DocumentLog WHERE IsDeleted = 0"); 

if(!string.IsNullOrEmpty(tbxRevision.Text)) 
{ 
    sqlCommandText.Append(" AND Revision Like @revision"); 
    command.Parameters.Add("@revision", tbxRevision.Text); 
} 

// do this for all fields 

command.CommandText = sqlCommandText.ToString();