在ASP.NET中使用SQL的IN操作

來源:互聯網
上載者:User
asp.net 這篇文章將建立一列包含CheckBox控制項的DataGrid,這個控制項允許使用者對明細瀏覽進行多列選擇。如果沒有恢複對於動態SQL獲得該功能的一種方法,那麼必須使用IN操作。

  在文章的結尾,我們寫了一個SQL Server使用者自訂函數(UDF),為了將一個字串分解成帶分隔字元的子字串。在這篇文章中,我們能看到這樣一個UDF如何派得上用場。我們將建立一個web表單,在此使用者可以通過選擇checkbox控制項而選擇一些在DataGrid中的記錄。對這些被檢查的記錄的明細將會出現在表單中的另一個DataGrid中。這個表單像來如圖所示。

 
  在下面顯示了我們用來建立表單的ASPX。注意:如何使用TemplateColumn和Checkbox控制項增加DataGrid列。我們也使用DataGrid的DataKeyField屬性來告訴對象,在資料庫記錄的哪一個欄位將會包含第一行的關鍵字標示符。  

<form id="Form1" method="post" runat="server">
<asp:DataGrid id="DataGrid1" runat="server"
   AutoGenerateColumns="False" DataKeyField="EmployeeID">
 <Columns>
  <asp:TemplateColumn>
   <ItemTemplate>
    <asp:CheckBox runat="server" ID="EmployeeCheckBox" />
   </ItemTemplate>
  </asp:TemplateColumn>
 <asp:TemplateColumn>
  <ItemTemplate>
   <%# DataBinder.Eval(Container.DataItem, "LastName") %>,
   <%# DataBinder.Eval(Container.DataItem, "FirstName") %>
  </ItemTemplate>
 </asp:TemplateColumn>
</Columns>
</asp:DataGrid>

<hr>

<asp:Button id="Orders" runat="server" Text="View Orders"></asp:Button>
<hr>
<asp:DataGrid ID="DataGrid2" Runat="server" AutoGenerateColumns="True" />
</form>
  當表單載入初始化時,需要組裝頂端的DataGrid。代碼使用Enterprise Library來存取SQL Sever Northwind例子資料庫並且執行“SELECT EmployeeID,FirstName,LastName FROM Employees”這一語句。載入事件的代碼如下:

private void Page_Load(object sender, System.EventArgs e)
{
 if(!Page.IsPostBack)
 {
  Database db = DatabaseFactory.CreateDatabase();
  DBCommandWrapper dbCommandWrapper;

  using(dbCommandWrapper = db.GetSqlStringCommandWrapper(SELECT_EMPLOYEES))
  {
   using (IDataReader dataReader = db.ExecuteReader(dbCommandWrapper))
   {
    DataGrid1.DataSource = dataReader;
    DataGrid1.DataBind();
   }
  }
 }
}
  當使用者單擊“Orders”按鈕時,我們想顯示與資料庫中的那些與Employees相配並與Orders資料相關的第二個資料表格。這樣做的一種方法是建立動態SQL並且使用所有EmployeeIDs所需的WHERE語句的OR條件。

  第二個方法是使用WHERE語句的IN操作。IN操作將會一列運算式進行比較。例如,下列語句返回employee中IDS 7和4之間的資訊。

SELECT EmployeeID, FirstName, LastName FROM Employees WHERE EmployeeID IN (7, 4)
  在觀念上說,我願意使用一個單一字串參數來查詢所傳遞的IDs,然而,也許作為一個單字串,不能對IN操作使用一個單一字串參數。如果那樣,SQL語句會這樣“WHERE Employee IN (‘7,4’)”,並且資料庫因為EmployeeID屬於類型int—不屬於varchar類型而返回一個錯誤訊息。

  不過,我們使用文章中構造的split函數將字串分離成不同的值。向split函數傳遞字串‘7,4’,並且我們會得到與值4和7相對應的兩條記錄。選擇employees並且計算它們的定單總數的SQL查詢,將會如下:

SELECT count(*) AS Orders, E.FirstName, E.LastName

FROM Orders O

INNER JOIN Employees E ON O.EmployeeID = E.EmployeeID

WHERE E.EmployeeID IN(SELECT Value FROM fn_Split(@employeeIDs, ','))

GROUP BY FirstName, LastName

ORDER BY count(*) DESC
  使用以上查詢所需要的是必須建立和傳遞@employeeIDs參數。這個參數將是用逗號隔開的IDs列表。為了建立該字串,為了弄明白行是否被使用者選擇,我們需要使用一個迴圈,這一迴圈以行數迴圈次數,並且檢查每一個checkbox控制項。如果使用者選擇了行,通過從表的DataKeys屬性中(它被建立在ASPX檔案中來指向EmployeeID欄位)提取檢驗人,將關鍵字儲存在employee中。

private string GetCheckedEmployeeIDs()
{
 String delimiter = String.Empty;
 StringBuilder employeeIDs = new StringBuilder();
 for(int i = 0; i < DataGrid1.Items.Count; i++)
 {
  CheckBox checkbox;
  checkbox = DataGrid1.Items[i].FindControl("EmployeeCheckBox") as CheckBox;
  if(checkbox != null && checkbox.Checked == true)
  {
   employeeIDs.Append(delimiter + DataGrid1.DataKeys[i].ToString()) ;
   delimiter = ",";
  }
 }

 return employeeIDs.ToString();
}
  以上方法返回一個字串,像“10,7,20”。對Orders按鈕單擊事件處理器將涉及這樣一個方法,將資訊傳遞至SQL以得到employees和orders的列表,並且將其結果綁定在第二個DataGrid對象中。

private void Orders_Click(object sender, System.EventArgs e)
{
 string employeeIDs = GetCheckedEmployeeIDs();
 Database db = DatabaseFactory.CreateDatabase();
 DBCommandWrapper dbCommandWrapper;

 using(dbCommandWrapper = db.GetSqlStringCommandWrapper(SELECT_ORDERS))
 {
  dbCommandWrapper.AddInParameter("@employeeIDs", DbType.String, employeeIDs);
  using (IDataReader dataReader = db.ExecuteReader(dbCommandWrapper))
  {
   DataGrid2.DataSource = dataReader;
   DataGrid2.DataBind();
  }
 }
}


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.