国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > .NET > 正文

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

2024-07-10 12:55:16
字體:
來源:轉載
供稿:網友
這篇文章將建立一列包含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();
  }
 }
}
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 常宁市| 磴口县| 习水县| 云浮市| 都安| 石河子市| 萨嘎县| 辽中县| 扶绥县| 北宁市| 晋宁县| 宁河县| 扎兰屯市| 武宁县| 杨浦区| 普兰店市| 晋城| 观塘区| 什邡市| 内黄县| 泰州市| 弋阳县| 广平县| 武夷山市| 江华| 涞水县| 新乐市| 天祝| 桐庐县| 无为县| 长泰县| 集安市| 新津县| 信阳市| 醴陵市| 平湖市| 台北县| 建湖县| 丁青县| 大厂| 宁武县|