熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> ASP編程 >> 正文

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

2013-11-15 12:54:21  來源: ASP編程 

  這篇文章將建立一列包含CheckBox控件的DataGrid這個控件允許用戶對明細浏覽進行多列選擇如果沒有恢復對於動態SQL獲得該功能的一種方法那麼必須使用IN操作
  
  在文章的結尾我們寫了一個SQL Server用戶自定義函數(UDF)為了將一個字符串分解成帶分隔符的子字符串在這篇文章中我們能看到這樣一個UDF如何派得上用場我們將建立一個web表單在此用戶可以通過選擇checkbox控件而選擇一些在DataGrid中的記錄對這些被檢查的記錄的明細將會出現在表單中的另一個DataGrid中這個表單像來如圖所示
  
  在下面顯示了我們用來建立表單的ASPX注意如何使用TemplateColumn和Checkbox控件增加DataGrid列我們也使用DataGrid的DataKeyField屬性來告訴對象在數據庫記錄的哪一個字段將會包含第一行的關鍵字標示符
  
  <form id=Form method=post runat=server
  <asp:DataGrid id=DataGrid runat=server
  AutoGenerateColumns=False DataKeyField=EmployeeID
  <Columns>
  <asp:TemplateColumn>
  <ItemTemplate>
  <asp:CheckBox runat=server ID=EmployeeCheckBox />
  </ItemTemplate>
  </asp:TemplateColumn>
  <asp:TemplateColumn>
  <ItemTemplate>
  <%# DataBinderEval(ContainerDataItem LastName) %>
  <%# DataBinderEval(ContainerDataItem FirstName) %>
  </ItemTemplate>
  </asp:TemplateColumn>
  </Columns>
  </asp:DataGrid>
  
  <hr>
  
  <asp:Button id=Orders runat=server Text=View Orders></asp:Button>
  <hr>
  <asp:DataGrid ID=DataGrid Runat=server AutoGenerateColumns=True />
  </form>
  
  當表單加載初始化時需要組裝頂端的DataGrid代碼使用Enterprise Library來存取SQL Sever Northwind例子數據庫並且執行SELECT EmployeeIDFirstNameLastName FROM Employees這一語句加載事件的代碼如下
  
  private void Page_Load(object sender SystemEventArgs e)
  {
  if(!PageIsPostBack)
  {
  Database db = DatabaseFactoryCreateDatabase();
  DBCommandWrapper dbCommandWrapper;
  
  using(dbCommandWrapper = dbGetSqlStringCommandWrapper(SELECT_EMPLOYEES))
  {
  using (IDataReader dataReader = dbExecuteReader(dbCommandWrapper))
  {
  DataGridDataSource = dataReader;
  DataGridDataBind();
  }
  }
  }
  }
  
  當用戶單擊Orders按鈕時我們想顯示與數據庫中的那些與Employees相配並與Orders數據相關的第二個數據表格這樣做的一種方法是建立動態的SQL並且使用所有EmployeeIDs所需的WHERE語句的OR條件
  
  第二個方法是使用WHERE語句的IN操作IN操作將會一列表達式進行比較例如下列語句返回employee中IDS 之間的信息
  
  SELECT EmployeeID FirstName LastName FROM Employees WHERE EmployeeID IN ( )
  
  在觀念上說我願意使用一個單一字符串參數來查詢所傳遞的IDs然而也許作為一個單字符串不能對IN操作使用一個單一字符串參數如果那樣SQL語句會這樣WHERE Employee IN (並且數據庫因為EmployeeID屬於類型int—不屬於varchar類型而返回一個錯誤消息
  
  不過我們使用文章中構造的split函數將字符串分離成不同的值向split函數傳遞字符串並且我們會得到與值相對應的兩條記錄選擇employees並且計算它們的定單總數的SQL查詢將會如下
  
  SELECT count(*) AS Orders EFirstName ELastName
  
  FROM Orders O
  
  INNER JOIN Employees E ON OEmployeeID = EEmployeeID
  
  WHERE EEmployeeID 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 = StringEmpty;
  StringBuilder employeeIDs = new StringBuilder();
  for(int i = ; i < DataGridItemsCount; i++)
  {
  CheckBox checkbox;
  checkbox = DataGridItems[i]FindControl(EmployeeCheckBox) as CheckBox;
  if(checkbox != null && checkboxChecked == true)
  {
  employeeIDsAppend(delimiter + DataGridDataKeys[i]ToString()) ;
  delimiter = ;
  }
  }
  
  return employeeIDsToString();
  }
  
  以上方法返回一個字符串對Orders按鈕單擊事件處理器將涉及這樣一個方法將信息傳遞至SQL以得到employees和orders的列表並且將其結果綁定在第二個DataGrid對象中
  
  private void Orders_Click(object sender SystemEventArgs e)
  {
  string employeeIDs = GetCheckedEmployeeIDs();
  Database db = DatabaseFactoryCreateDatabase();
  DBCommandWrapper dbCommandWrapper;
  
  using(dbCommandWrapper = dbGetSqlStringCommandWrapper(SELECT_ORDERS))
  {
  dbCommandWrapperAddInParameter(@employeeIDs DbTypeString employeeIDs);
  using (IDataReader dataReader = dbExecuteReader(dbCommandWrapper))
  {
  DataGridDataSource = dataReader;
  DataGridDataBind();
  }
  }
  }
From:http://tw.wingwit.com/Article/program/ASP/201311/21852.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.