2016-05-13 45 views
0

以下是我正在做什么的一些背景...C#ASP.NET - 使用代码编写的SQL查询语句数量减少

我正在编写一个C#web应用程序。在主页上,我有一个包含大约25个单独的Dropdownlists的数据输入表单。我创建了一个名为options的表,它非常简单(ID,Category,Option)。我创建的每个选项都进行了分类,因此我的查询将只包含与查找类别相匹配的选项。每个类别都与我需要填写的25个下拉列表中的一个匹配。

所以我能够得到一些这些填充形式和他们的工作很好。我担心这个代码的重写(DDlist名称和类别名称的细微变化)会导致代码长得多。有没有一种方法可以创建它自己的类,并将参数传递给类,以便它仅从正确的类别返回数据并填充正确的下拉列表?以下是我迄今为止的2个DD字段的示例代码。该DDStationList和DDReqeustType是我创造的25个Dropdownlists的2名:从我的配置文件

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.UI; 
using System.Web.UI.WebControls; 
using System.Data; 
using System.Data.SqlClient; 
using System.Configuration; 
using System.Drawing; 
namespace TEST 
{ 
    public partial class _Default : Page 
    { 
     //Main connection string 
     string SqlConn = ConfigurationManager.AppSettings["SqlConn"];  
     string qryRequestType = ConfigurationManager.AppSettings["qryRequestTypes"]; 
     string qryStationNumbers = ConfigurationManager.AppSettings["qryStationNumbers"]; 
     protected void Page_Load(object sender, EventArgs e) 
     {} 
     protected void BtnAddNew_Click(object sender, EventArgs e) 
     { 
      //GET Request Types 
      DataTable RequestTypes = new DataTable(); 
      SqlConnection Conn = new SqlConnection(SqlConn); 
      { 
       SqlDataAdapter adapter = new SqlDataAdapter(qryRequestType, Conn); 
       adapter.Fill(RequestTypes); 
       DDRequestType.DataSource = RequestTypes; 
       DDRequestType.DataTextField = "Option"; 
       DDRequestType.DataValueField = "Option"; 
       DDRequestType.DataBind(); 
      } 
      // Get Stations 
      DataTable Stations = new DataTable(); 
      SqlConnection Conn = new SqlConnection(SqlConn); 
      { 
       SqlDataAdapter adapter = new SqlDataAdapter(qryStationNumbers, Conn); 
       adapter.Fill(Stations); 
       DDStationList.DataSource = Stations; 
       DDStationList.DataTextField = "Option"; 
       DDStationList.DataValueField = "Option"; 
       DDStationList.DataBind(); 
      } 
     } 
     protected void BtnSubmit_Click(object sender, EventArgs e) 
     { 
      //More stuff to do here for submit code 
     } 
    } 
} 

例子查询对应于上面的代码:

SELECT [Option] FROM Table WHERE Category = 'RequestType'; 
SELECT [Option] FROM Table WHERE Category = 'Station'; 

那么,有没有可能,我可以创建一个类,我可以通过该选项的类别到运行查询像这样:

SELECT [Option] FROM Table WHERE Category = @Category; 

...然后填入正确的下拉列表(需要这样做25次)?

如果我不是清楚我的问题,我会很乐意进一步解释。

+0

至于,'有没有一种方法我可以创建一个类它自己的和参数传递给类,所以它只返回我的数据来自正确的类别并填充正确的下拉列表,您可能更适合向当前班级添加功能。 –

+0

您能给我一个例子吗? – Joe

回答

2

为什么不创建一个存储过程呢?

using (SqlConnection con = new SqlConnection(dc.Con)) { 
    using (SqlCommand cmd = new SqlCommand("sp_GetCategory", con)) { 
     cmd.CommandType = CommandType.StoredProcedure;  
     cmd.Parameters.Add("@Category", SqlDbType.VarChar).Value = txtCategory.Text; 

     con.Open(); 
     var results = cmd.ExecuteReader(); 
    } 
} 

或包括参数

string sql = "SELECT [Option] FROM Table WHERE Category = @Category"; 

using (SqlConnection con = new SqlConnection(dc.Con)) { 
    using (SqlCommand cmd= new SqlCommand(sql, con)) { 
     cmd.Parameters.Add("@Category", SqlDbType.VarChar).Value = txtCategory.Text; 
     con.Open(); 
     var results = cmd.ExecuteReader(); 
    } 
} 

编辑

class Category 
{ 
    /* properties */ 

    /* method */ 
    public List<Category> GetCategory(string selectedCategory) 
    { /* Method statements here */ } 
} 
+0

感谢您的回复。一旦我有办法让这种疯狂下来,我实际上会转换到一个存储过程。我如何使用您的示例将其绑定到Dropdownlist? – Joe

+0

为该类创建一个函数,并将结果分配给下拉列表。合理? –

+0

返回结果集的存储过程可以绑定到下拉列表。只需将其设置为DataSource。即'DDStationList.DataSource = cmd.ExecuteReader();'最好还是使用'SqlDataReader dr = cmd.ExecuteReader(); DDStationList.DataSource = dr;' –