2013-03-22 49 views
0

我正在開發Windows應用程序。c#搜索功能查詢/代碼

我說,我正在實現搜索功能。

我有5個過濾器[搜索類別]。

Partycode,branchId,Symbol,BuySell,TerminalId。

如果所有文本框爲空,那麼它應該顯示所有數據。

如果Partycode被填滿,那麼它應該只顯示特定派對代碼的數據。

如果派對代碼和branchId文本框被填充,那麼它應該爲具有特定終端ID的參數提供數據。 ...和條件繼續所有排列和組合。

我寫了不同的if else語句。這些正在成爲許多If-Else聲明。

有沒有特別的方法來爲這種情況編寫查詢?還是有.NET提供的任何功能來處理它?

或者我正朝着正確的方向[有很多If-Else陳述]?

我已經試過>>

private void btnRefresh_Click_1(object sender, EventArgs e) 
     { 
      string SQL = ""; 
      if ((txtSearchPartyCode.Text == "") && (txtSearchBranchId.Text == "") && (txtSearchSymbol.Text == "") && (txtSearchTerminalId.Text == "")&&(cmbBuySell.Text=="")) 
      { 

       SQL = "select Party_Code,TradeNo,Scrip_Code,Inst_Type,Expirydate,Strike_price,Option_type,TerminalId,Branch_Id,Buy_Sell,Trade_Qty,Market_Rate,Sauda_Date,OrderNo from tradeFile"; 

      } 
      else 
       if ((txtSearchPartyCode.Text != "") && (txtSearchBranchId.Text == "") && (txtSearchSymbol.Text == "") && (txtSearchTerminalId.Text == "")&&(cmbBuySell.Text==""))  
       { 

         SQL="select Party_Code,TradeNo,Scrip_Code,Inst_Type,Expirydate,Strike_price,Option_type,TerminalId,Branch_Id,Buy_Sell,Trade_Qty,Market_Rate,Sauda_Date,OrderNo from tradeFile where Party_Code='"+txtSearchPartyCode.Text+"'"; 

       } 
       else 
        if ((txtSearchPartyCode.Text == "") && (txtSearchBranchId.Text != "") && (txtSearchSymbol.Text == "") && (txtSearchTerminalId.Text == "")&&(cmbBuySell.Text=="")) 
        { 
         SQL="select Party_Code,TradeNo,Scrip_Code,Inst_Type,Expirydate,Strike_price,Option_type,TerminalId,Branch_Id,Buy_Sell,Trade_Qty,Market_Rate,Sauda_Date,OrderNo from tradeFile where Branch_Id='"+txtSearchBranchId.Text+"'"; 
        } 
      else 
         if ((txtSearchPartyCode.Text == "") && (txtSearchBranchId.Text == "") && (txtSearchSymbol.Text != "") && (txtSearchTerminalId.Text == "")&&(cmbBuySell.Text=="")) 
         { 
          SQL="select Party_Code,TradeNo,Scrip_Code,Inst_Type,Expirydate,Strike_price,Option_type,TerminalId,Branch_Id,Buy_Sell,Trade_Qty,Market_Rate,Sauda_Date,OrderNo from tradeFile where Scrip_Code='"+txtSearchSymbol.Text+"'"; 
         } 
      else 
         if ((txtSearchPartyCode.Text == "") && (txtSearchBranchId.Text == "") && (txtSearchSymbol.Text == "") && (txtSearchTerminalId.Text != "")&&(cmbBuySell.Text=="")) 
         { 
          SQL="select Party_Code,TradeNo,Scrip_Code,Inst_Type,Expirydate,Strike_price,Option_type,TerminalId,Branch_Id,Buy_Sell,Trade_Qty,Market_Rate,Sauda_Date,OrderNo from tradeFile where TerminalId='"+txtSearchTerminalId.Text+"'"; 
         } 
      else 
          if((txtSearchPartyCode.Text == "") && (txtSearchBranchId.Text == "") && (txtSearchSymbol.Text == "") && (txtSearchTerminalId.Text == "")&&(cmbBuySell.Text!="")) 
          { 
           float buy_Sell=0; 
           if(cmbBuySell.Text=="Buy") 
            buy_Sell=1; 
           else 
            if(cmbBuySell.Text=="Sell") 
             buy_Sell=2; 
           SQL="select Party_Code,TradeNo,Scrip_Code,Inst_Type,Expirydate,Strike_price,Option_type,TerminalId,Branch_Id,Buy_Sell,Trade_Qty,Market_Rate,Sauda_Date,OrderNo from tradeFile where Buy_Sell='"+buy_Sell+"'"; 
          } 

        try 
        { 
        da = new SqlDataAdapter(SQL, con); 
        DataSet ds = new DataSet(); 
        da.Fill(ds); 
        gvTradeFile.DataSource = ds.Tables[0]; 
        } 
        catch(Exception ex) 
        { 
         MessageBox.Show(ex.Message); 
        } 
     } 

請救我出去吧。!!!!

+0

不是一個答案,但要避免在SQL查詢字符串連接,因爲它可以導致SQL注入。改爲使用參數化查詢。 – akton 2013-03-22 07:47:23

回答

4

首先,直接回答你問題:

private void btnRefresh_Click_1(object sender, EventArgs e) 
{ 
    var sb = new StringBuilder("select Party_Code,TradeNo,Scrip_Code,Inst_Type,Expirydate,Strike_price,Option_type,TerminalId,Branch_Id,Buy_Sell,Trade_Qty,Market_Rate,Sauda_Date,OrderNo from tradeFile"); 
    if (!string.IsNullOrEmpty(txtSearchPartyCode.Text)) 
     sb.AppendFormat(" where Party_Code='{0}'", txtSearchPartyCode.Text); 
    if (!string.IsNullOrEmpty(txtSearchBranchId.Text)) 
     sb.AppendFormat(" where Branch_Id='{0}'", txtSearchBrandId.Text); 
    // ...and so on... 
    sb.Append(";"); 
    try 
    { 
     da = new SqlDataAdapter(sb.ToString(), con); 
     DataSet ds = new DataSet(); 
     da.Fill(ds); 
     gvTradeFile.DataSource = ds.Tables[0]; 
    } 
    catch(Exception ex) 
    { 
     MessageBox.Show(ex.Message); 
    } 
} 

把你的代碼改成這樣的東西,你的生活可能會更容易一些。

其次,一些建議。你的代碼顯然是你的新手,可能值得花些時間去閱讀更好的數據庫工作方式。有數據庫包裝器,你可以使用,並且這可能不是最好的直接查詢數據庫的想法。你還需要清理你的用戶輸入,你的代碼很容易被SQL注入(一個好的數據庫包裝器會爲你做這件事)。

+0

同意你的意見。將這樣的代碼寫入練習。 – Freelancer 2013-03-22 07:55:44

+0

這個工作是否會遇到兩個情況?用Eg表示。我必須檢查>> Party_Code和Branch_Id兩個條件,然後? – Freelancer 2013-03-22 07:58:36

+0

如果Party_Code文本框有文本,它將被搜索。如果Branch_Id文本框中有文本,它將被搜索。即使他們都有文字,情況也是如此。請記住,我在瀏覽器中編寫了這段代碼,並且未經測試 - 這只是爲了讓您瞭解如何解決問題。 – 2013-03-22 16:12:52

1

創建一行代碼,調用您的sql語句來構建,然後添加如果不是空白以添加到sql語句。 Partycode , branchId , Symbol ,BuySell , TerminalId。還要將您的搜索功能改爲類似的語句,所以它不是二元的。

select Party_Code,TradeNo,Scrip_Code,Inst_Type,Expirydate,Strike_price,Option_type, 
TerminalId,Branch_Id,Buy_Sell,Trade_Qty,Market_Rate,Sauda_Date,OrderNo 
from tradeFile 
where Party_Code like '&"+txtSearchPartyCode.Text+"&'";** 
1

首先,嘗試至少爲數據訪問重構您的代碼。你目前的班級做得很好。

1-重構你的數據訪問代碼到一些輔助類ATLEAST

2 - 嘗試取出SQL創建的責任納入其他一些輔助類。

3-創建一個參數類,它將保存所有搜索參數,並將此參數對象傳遞給SQL Creation類。

4-閱讀有關Builder Pattern

1

創建查詢動態

Select * from TableName where "+ColumnName+"="'"+txtSearch.Text+"'" // Example 

從txtSearch文本名稱識別您的ColumnName

希望這有助於

0

你可能想嘗試這樣的:

private void btnRefresh_Click_1(object sender, EventArgs e) 
    { 
     string WHERE_STATEMENT = null; 
     string SEARCH = null; 
     string SQL = null; 
     int i = 1; 

     switch (i) 
     { 
      case 1: 
       WHERE_STATEMENT = "Party_Code"; 
       SEARCH = ""; 
      case 2: 
       WHERE_STATEMENT = "Branch_Id"; 
       SEARCH = ""; 
      case 3: 
       WHERE_STATEMENT = "Scrip_Code"; 
       SEARCH = ""; 
      case 4: 
       WHERE_STATEMENT = "TerminalId"; 
       SEARCH = ""; 
      case 5: 
       WHERE_STATEMENT = "BUY_SELL"; 
       SEARCH = ""; 
      case 6: 
       WHERE_STATEMENT = ""; 
       SEARCH = ""; 
     } 

     try 
      {   
       SQL = "select Party_Code,TradeNo,Scrip_Code,Inst_Type,Expirydate,Strike_price,Option_type,TerminalId,Branch_Id,Buy_Sell,Trade_Qty,Market_Rate,Sauda_Date,OrderNo from tradeFile where " + WHERE_STATEMENT + " like '%" + SEARCH + "%'"; 
       da = new SqlDataAdapter(SQL, con); 
       DataSet ds = new DataSet(); 
       da.Fill(ds); 
       gvTradeFile.DataSource = ds.Tables[0]; 
      } 
     catch (Exception) 
      { 
       MessageBox.Show(ex.Message); 
       throw; 
      } 

    } 
0

Select * from TableName where "+ColumnName+"="'"+txtSearch.Text+"'" //例

+0

謝謝我的朋友 – Freelancer 2013-05-31 05:05:32