我正在开发Windows应用程序。
我,我正在实施搜索功能。
我有5个过滤器[搜索类别]。
Partycode,branchId,Symbol,BuySell,TerminalId。
如果所有文本框都为空,则应显示所有数据。
如果Partycode已填满,那么它应仅显示特定政党代码的数据。
如果填写了聚会代码和branchId文本框,那么它应该为具有特定终端ID的微粒提供数据。 ......所有排列和组合的条件都在继续。
我正在编写不同的if else语句。这些正在成为许多If-Else声明。
是否有针对此情况编写查询的特定方法?或者.NET提供了什么功能来处理它?</ p>
或者我正朝着正确的方向前进[有很多If-Else陈述]?
我已经尝试了&gt;&gt;
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 :(得分: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注入(一个好的数据库包装器会为您执行此操作)。
答案 1 :(得分:1)
创建一行调用sql语句构建的代码然后添加if not blank以添加到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+"&'";**
答案 2 :(得分:1)
首先,尝试至少为数据访问重构代码。你现在的课程做得很多。
1-将您的数据访问代码重构为至少一些帮助程序类
2-尝试将SQL创建的责任转移到其他辅助类中。
3-创建一个包含所有搜索参数的参数类,将此参数对象传递给SQL Creation类。
4-阅读Builder Pattern
答案 3 :(得分:1)
动态创建您的查询
Select * from TableName where "+ColumnName+"="'"+txtSearch.Text+"'" // Example
从txtSearch文本框名称
中识别您的ColumnName希望这会有所帮助
答案 4 :(得分: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;
}
}
答案 5 :(得分:0)
Select * from TableName where "+ColumnName+"="'"+txtSearch.Text+"'"
//示例