这篇文章将建立一列包含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><%# 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= DataGrid 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)){DataGrid DataSource = dataReader;DataGrid DataBind();}}}}当用户单击 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 E FirstName E LastNameFROM Orders OINNER JOIN Employees E ON O EmployeeID = E EmployeeIDWHERE E EmployeeID IN(SELECT Value FROM fn_Split(@employeeIDs ))GROUP BY FirstName LastNameORDER BY count() DESC使用以上查询所需要的是必须建立和传递@employeeIDs参数 这个参数将是用逗号隔开的IDs列表 为了建立该字符串 为了弄明白行是否被用户选择 我们需要使用一个循环 这一循环以行数循环次数 并且检查每一个checkbox控件 如果用户选择了行 通过从表的DataKeys属性中(它被建立在ASPX文件中来指向EmployeeID字段)提取检验人 将关键字保存在employee中 private string GetCheckedEmployeeIDs(){String delimiter = String Empty;StringBuilder employeeIDs = new StringBuilder();for(int i = ; i < DataGrid Items Count; i++){CheckBox checkbox;checkbox = DataGrid Items[i] FindControl( EmployeeCheckBox ) as CheckBox;if(checkbox != null && checkbox Checked == true){employeeIDs Append(delimiter + DataGrid DataKeys[i] ToString()) ;delimiter = ;}}return employeeIDs ToString();}以上方法返回一个字符串 像 对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)){DataGrid DataSource = dataReader;DataGrid DataBind();}}} lishixinzhi/Article/program/ASP/201311/21852
in 在sql语句冲,都是写在where条件中。不一定是update语句。update情况的为你举个例子:
update table_a set col_1 = '2' where col_2 in (1,2,3);
语句是:当table_a表中col_2为 1或2或3的时候,将col_1更新为2。in作为查询条件,一般典型有两种用法:
一是IN常量,例如下面语句查询一、三年级的学生:
SELECT FROM student WHERE grade IN ('一','三');
二是使用子查询,也就是IN(SQL语句),例如下面的语句查询不及格的班级的所有学生:
SELECT FROM student WHERE classno IN (
select classno from scores where score<60
);
评论列表(0条)