当前位置: 首页 > 图文教程 > 网络编程 > ASP.NET > 在ASP.NET中使用SQL的IN操作

ASP.NET
如何在ASP.NET中使用SmtpMail发送邮件
在VB.NET中利用Split和Replace函数计算字数
Attribute应用:简化ANF自定义控件初始化过程
ASP.NET 2.0移动开发入门之使用样式
ASP.NET 2.0中使用OWC生成图表
ASP.NET 2.0中控件的简单异步回调
一个无法捕获ADO.NET Dataset的内存错误
深入解读ADO.NET2.0的十大最新特性
.Net平台下的分布式缓存设计
ASP.NET全局异常处理浅析
ASP.NET 2.0中文验证码的实现
浅析.NET平台编程语言的未来走向
.net 框架程序设计收藏
使用ASP.NET MVC Futures 中的异步Action
详解.NET中的XmlReader与XmlWriter
关于.NET中的Server push技术
asp.net页面执行机制
对比JSP和ASP.NET的存储过程
.NET 4.0不会包含System.Shell.CommandLine
ASP.NET十个有效性能优化的方法

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


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-08-14   浏览: 118 ::
收藏到网摘: n/a

这篇文章将建立一列包含CheckBox控件的DataGrid,这个控件允许用户对明细浏览进行多列选择。如果没有恢复对于动态SQL获得该功能的一种方法,那么必须使用IN操作。

在文章的结尾,我们写了一个SQLServer用户自定义函数(UDF),为了将一个字符串分解成带分隔符的子字符串。在这篇文章中,我们能看到这样一个UDF如何派得上用场。我们将建立一个web表单,在此用户可以通过选择checkbox控件而选择一些在DataGrid中的记录。对这些被检查的记录的明细将会出现在表单中的另一个DataGrid中。这个表单像来如图所示。

在下面显示了我们用来建立表单的ASPX。注意:如何使用TemplateColumn和Checkbox控件增加DataGrid列。我们也使用DataGrid的DataKeyField属性来告诉对象,在数据库记录的哪一个字段将会包含第一行的关键字标示符。 

<formid="Form1"method="post"runat="server">
<asp:DataGridid="DataGrid1"runat="server"
 AutoGenerateColumns="False"DataKeyField="EmployeeID">
 <Columns>
<asp:TemplateColumn>
 <ItemTemplate>
<asp:CheckBoxrunat="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:Buttonid="Orders"runat="server"Text="ViewOrders"></asp:Button>
<hr>
<asp:DataGridID="DataGrid2"Runat="server"AutoGenerateColumns="True"/>
</form>

当表单加载初始化时,需要组装顶端的DataGrid。代码使用EnterpriseLibrary来存取SQLSeverNorthwind例子数据库并且执行“SELECTEmployeeID,FirstName,LastNameFROMEmployees”这一语句。加载事件的代码如下:

privatevoidPage_Load(objectsender,System.EventArgse)
{
 if(!Page.IsPostBack)
 {
Databasedb=DatabaseFactory.CreateDatabase();
DBCommandWrapperdbCommandWrapper;

using(dbCommandWrapper=db.GetSqlStringCommandWrapper(SELECT_EMPLOYEES))
{
 using(IDataReaderdataReader=db.ExecuteReader(dbCommandWrapper))
 {
DataGrid1.DataSource=dataReader;
DataGrid1.DataBind();
 }
}
 }
}

当用户单击“Orders”按钮时,我们想显示与数据库中的那些与Employees相配并与Orders数据相关的第二个数据表格。这样做的一种方法是建立动态的SQL并且使用所有EmployeeIDs所需的WHERE语句的OR条件。

第二个方法是使用WHERE语句的IN操作。IN操作将会一列表达式进行比较。例如,下列语句返回employee中IDS7和4之间的信息。

SELECTEmployeeID,FirstName,LastNameFROMEmployeesWHEREEmployeeIDIN(7,4)

在观念上说,我愿意使用一个单一字符串参数来查询所传递的IDs,然而,也许作为一个单字符串,不能对IN操作使用一个单一字符串参数。如果那样,SQL语句会这样“WHEREEmployeeIN(‘7,4’)”,并且数据库因为EmployeeID属于类型int—不属于varchar类型而返回一个错误消息。

不过,我们使用文章中构造的split函数将字符串分离成不同的值。向split函数传递字符串‘7,4’,并且我们会得到与值4和7相对应的两条记录。选择employees并且计算它们的定单总数的SQL查询,将会如下:

SELECTcount(*)ASOrders,E.FirstName,E.LastName

FROMOrdersO

INNERJOINEmployeesEONO.EmployeeID=E.EmployeeID

WHEREE.EmployeeIDIN(SELECTValueFROMfn_Split(@employeeIDs,','))

GROUPBYFirstName,LastName

ORDERBYcount(*)DESC

使用以上查询所需要的是必须建立和传递@employeeIDs参数。这个参数将是用逗号隔开的IDs列表。为了建立该字符串,为了弄明白行是否被用户选择,我们需要使用一个循环,这一循环以行数循环次数,并且检查每一个checkbox控件。如果用户选择了行,通过从表的DataKeys属性中(它被建立在ASPX文件中来指向EmployeeID字段)提取检验人,将关键字保存在employee中。

privatestringGetCheckedEmployeeIDs()
{
 Stringdelimiter=String.Empty;
 StringBuilderemployeeIDs=newStringBuilder();
 for(inti=0;i<DataGrid1.Items.Count;i++)
 {
CheckBoxcheckbox;
checkbox=DataGrid1.Items[i].FindControl("EmployeeCheckBox")asCheckBox;
if(checkbox!=null&&checkbox.Checked==true)
{
 employeeIDs.Append(delimiter+DataGrid1.DataKeys[i].ToString());
 delimiter=",";
}
 }

 returnemployeeIDs.ToString();
}

以上方法返回一个字符串,像“10,7,20”。对Orders按钮单击事件处理器将涉及这样一个方法,将信息传递至SQL以得到employees和orders的列表,并且将其结果绑定在第二个DataGrid对象中。

privatevoidOrders_Click(objectsender,System.EventArgse)
{
 stringemployeeIDs=GetCheckedEmployeeIDs();
 Databasedb=DatabaseFactory.CreateDatabase();
 DBCommandWrapperdbCommandWrapper;

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