asp.net学习之再论sqlDataSource
本节从上一节没有阐述的几个方面,再讨论一下SqlDataSource的用法及注意的事项。
上一节的链接地址如下:http://www.cnblogs.com/shipfi/archive/2009/10/15/1584093.html
1. SqlDataSource的参数方向(Parameters Direction)
SqlDataSource的参数可以设置方向,默认值为INPUT。如果参数为INPUT,是无法从参数取回任何返回值的,如果要调用的存储过程有返回值时,必须设置参数具有Output方向。
参数包括了四个方向:
● Input : 参数仅能输入
● InputOutput:参数可同时输入或输出
● Output:参数仅能输出
● ReturenValue:表示参数为存储过程、内置功能或使用定义函数等返回的操作。[注意是返回值]
参数方向在aspx页面中的设定就不讲了,设定相应的Direction属性就行了,比较简单,如果在程序中动态设定的话,使用以下代码就可以了:
sqlDatasource.SelectCommand = "select * from Porducts where ProductName=@productName"; QueryStringParameter paramProduct = new QueryStringParameter("ProductName",TypeCode.String,"ProductName"); paramProduct.Direction = ParameterDirection.Input;
例1: 演示如何使用存储过程,并且带Output参数的使用
create proc dawnSP_SelectPClass ( @return_row int output, --返回行数 @pclass_parent_id int = –1 --父目录id ) as begin if @pclass_parent_id=-1 select * from product_class; else select * from product_class where product_class_parent=@pclass_parent_id; set @return_row = @@rowcount; return 0; end --测试一下存储过程是否OK declare @ret_row int exec dawnSP_SelectPClass @ret_row output,-1; --@ret_row后面一定要加output关键字 select @ret_row;
1 <!-- 在页面中使用存储过程 –> 2 <script runat=”server”> 3 protected void SqlDataSource1_Selected(object sender, SqlDataSourceStatusEventArgs e) 4 { 5 // 存储过程中的第一个参数就是Output参数,所以取e.Command.Parameters[0] 6 TextBox1.Text = e.Command.Parameters[0].Value.ToString(); 7 } 8 </script> 9 10 <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox> <!-- 存储过程返回的return_row将显示在这个TextBox中 --> 11 <asp:SqlDataSource ID="SqlDataSource1" runat="server" 12 ConnectionString="<%$ ConnectionStrings:DawnEnterpriseDBConnectionString %>" 13 SelectCommand="dawnSP_SelectPClass" SelectCommandType="StoredProcedure" 14 onselected="SqlDataSource1_Selected"> <!-- 需要通过OnSelected事件、把return_row参数的值取出来 --> 15 <SelectParameters> 16 <asp:Parameter Name="return_row" DefaultValue="0" DbType="Int32" Direction="Output" /> 17 <asp:QueryStringParameter DefaultValue="-1" Name="pclass_parent_id" DbType="Int32" 18 QueryStringField="p_classid" Direction="Input" /> 19 <!-- 注:Parameter及QueryStringParameter的Name一定要和存储过程中的参数名相匹配,否则会提示参数设定不正确 --> 20 </SelectParameters> 21 </asp:SqlDataSource>
2. 利用FilterExpression筛选数据
在SqlDataSource中进行数据的筛选有两种方法,一是使用SelectCommand机制进行数据筛选,即在SQL语句中加入where子句。二是使用FilterExpression进行筛选。
使用FilterExpression机制进行筛选是使用DataView对象中的筛选机制。效率不高,但比较简便。进行数据筛选只要在SqlDataSource控件中加入FilterExpression属性就可以了。如下所示:
例2:使用FilterExpression筛选数据
<asp:TextBox ID="tb_factory" Text="道恩" runat="server"></asp:TextBox> <asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:DawnEnterpriseDBConnectionString %>" SelectCommand="SELECT [product_id], [product_code], [product_name], [product_factory] FROM [product_main]" FilterExpression="product_factory like '%{0}%'" onfiltering="SqlDataSource1_Filtering" > <FilterParameters> <asp:ControlParameter Name="fp_pro_factory" ControlID="tb_factory" PropertyName="Text" /> </FilterParameters> </asp:SqlDataSource>
以上,FilterExpression中引用的参数必须指定是{0}这样的格式,引用@paramName这样的形式我试验过,好像行不通,不知道为什么。有待解释。
以下是MSDN对FilterExpression的解释:
用于 FilterExpression 属性的语法是格式字符串样式表达式。筛选表达式语法与 Expression 属性接受的语法相同。如果将参数添加到 FilterParameters 集合中,则也可以包括格式字符串占位符。例如,可在表达式中包括 "{0}" 以替换参数值。根据 FilterParameters 集合中的参数索引替换占位符。 可以在 FilterExpression 属性中包括参数。如果参数类型为字符串类型或字符类型,则应将参数放在单引号中。如果参数是数值类型的,则不需要引号。
例3:动态取得和添加FilterExpression的参数
<script runat="server"> protected void ObjectDataSource1_Filtering(object sender, ObjectDataSourceFilteringEventArgs e) { if(e.ParameterValues.count>0) Label1.Text = e.ParameterValues[0].ToString(); if (Textbox1.Text == "") { e.ParameterValues.Clear(); e.ParameterValues.Add("FullName", "Nancy Davolio"); } } </script> <asp:objectdatasource id="ObjectDataSource1" runat="server" selectmethod="GetAllEmployeesAsDataSet" typename="Samples.AspNet.CS.EmployeeLogic" filterexpression="FullName='{0}'" OnFiltering="ObjectDataSource1_Filtering"> <filterparameters> <asp:formparameter name="FullName" formfield="Textbox1" defaultvalue="Nancy Davolio" /> </filterparameters> </asp:objectdatasource>
SqlDataSource中的FilterExpression运作的原理是通过DataView,那么,如何直接通过DataView对象进行数据的过滤呢。
例4:在程序中通过DataView进行数据的过滤
protected void Page_Load(object sender, EventArgs e){ if(!IsPostBack){ ConnectionStringSettings connSetting = WebConfigurationManager.ConnectionStrings["DawnEnterpriseDBConnectionString"]; SqlConnection sqlConn = new SqlConnection(connSetting.ConnectionString); SqlDataAdapter da = new SqlDataAdapter("select * from product_class", sqlConn); //创建DataTable DataTable dt = new DataTable(); dt.TableName = "product_class"; da.Fill(dt); //创建DataView,进行过滤 DataView dv = new DataView(dt); dv.RowFilter = "product_class_parent=1"; //指定数据源 GridView2.DataSource = dv; GridView2.DataBind(); }}
3.处理并发
SqlDataSource控件的ConficatDetection属性和OldValuesParameterFormatString属性被赋值的情况下,这两个属性会使SqlDataSource控件为每个个数据列保持此列的原始值和修改后的值,以此来解决并发的问题。
ConficatDetection可以为以下两个值之一:
● CompareAllValues: 为每一列保持修改值和原始值
● OverwritingChanges: 将会导致SqlDataSource控件直接使用新值覆盖到数据列中
OldValuesParameterFormatStrin属性用来为列的原始值提供唯一的名称。
示例如下:
<asp:SqlDataSource id=”srcMovies” ConflictDetection=”CompareAllValues” OldValuesParameterFormatString=”original_{0}” ConnectionString=”<%$ ConnectionStrings:Movies %>” SelectCommand=”SELECT Id,Title,Director FROM Movies” UpdateCommand=”UPDATE Movies SET Title=@Title, Director=@Director WHERE Id=@original_Id AND Title=@original_Title AND Director=@original_Director” Runat=”server” OnUpdated=”srcMovies_Updated” />
asp.net学习之再论sqlDataSource的更多相关文章
- asp.net学习之SqlDataSource
原文:asp.net学习之SqlDataSource 通过 SqlDataSource 控件,可以使用 Web 服务器控件访问位于关系数据库中的数据.其中可以包括 Microsoft SQL Serv ...
- asp.net学习之GridView事件、GridViewRow对象
原文:asp.net学习之GridView事件.GridViewRow对象 1. GridView控件的事件 GridView有很多事件,事件可以定制控件的外观或者行为.事件分为三类 1.1 ...
- asp.net学习之Repeater控件
asp.net学习之Repeater控件 文章摘自:http://www.cnblogs.com/shipfi/archive/2009/10/19/1585703.html Repeater控件和D ...
- asp.net学习资源汇总
名称:快速入门地址:http://chs.gotdotnet.com/quickstart/描述:本站点是微软.NET技术的快速入门网站,我们不必再安装.NET Framework中的快速入门示例程序 ...
- asp.net学习之DataList控件
asp.net学习之DataList控件 DataList控件与Repeater控件一样由模板驱动,与Repeater控件不同的是: DataList控件默认输出是一个HTML表格.DataLis ...
- asp.net学习之 数据绑定控件--List数据绑定控件
原文:asp.net学习之 数据绑定控件--List数据绑定控件 List控件(如 CheckBoxList.DropDownList.ListBox 和 RadioButtonList 类)继承自L ...
- asp.net学习之数据绑定控件、数据源控件概述
原文:asp.net学习之数据绑定控件.数据源控件概述 1.asp.net数据绑定控件分为三大类,每个类分别进行详细: ● 列表式数据绑定控件: 列表式数据绑定控件常用来在一个表格内的一个字 ...
- asp.net学习之GridView七种字段
原文:asp.net学习之GridView七种字段 asp.net中GridView绑定到数据源时,可以自动显示数据源的各个字段.只要设定其AutoGenerateColumns为TRUE即可.但这, ...
- asp.net学习之ado.net(连接模式访问)
原文:asp.net学习之ado.net(连接模式访问) ado.net框架支持两种模式的数据访问: 连接模式(Connected)和非连接模式(disconnected).这一节介绍如何使用连 ...
随机推荐
- Matlab Error (Matrix dimensions must agree)
xOld =input('Enter initial guess: '); errortmp =2; counter =0; while (errortmp>10^-10) xNew =xOld ...
- 我已提取并尝试使用启动脚本(./start navicat)来启动 Navicat Linux 版本号,但没有反应
具体的安装教程,參考这个navicat_for_mysql_10.0.11在linux下的安装,介绍的非常具体 參考这个 :我可否在 64-bit Linux 执行 Navicat? 推荐navica ...
- javascript 正则匹配 提取所有 preg_match_all matchAll方法
javascript 提取全部的的方法.javascript中没有matchAll这种方法. 用while来实现类似 PHP 中的preg_match_all() :(by default7#zbph ...
- 更新代码和工具,组织起来,提供所有博文(C++,2014.09)
为了更容易地管理各种规范和工具所涉及的资源鲍文,现在把这些资源迁移 GitHub 在,趣者可前往下载. C++ 1.<通用高性能 Windows Socket 组件 HP-Socket v3.2 ...
- client多线程
1.多线程对象 对象可以是多线程访问,线程可以在这里分为两类: 为完成内部业务逻辑的创建Thread对象,线程需要访问对象. 使用对象的线程外部对象. 进一步假设更精细的划分.业主外螺纹成线等线,. ...
- IT忍者神龟之使用 PowerDesigner
1. 启动 PowerDesigner 新建物理数据模型 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdmlweWhk/font/5a6L5L2T/fon ...
- 在Linux终端下使用代理访问网络(转)
最近,需要在linux环境下使用脚本进行一些网络访问(主要是HTTP请求与文件下载),于是查阅了一些关于代理的资料. 以下是尝试的几种代理设置方法,以供参考: 一.使用wget命令进行代理访问 wge ...
- NGUI 3.5教程(四)Atlas和Sprite(制作图片button)
Atlas是NGUI的图集.我的理解是:Atlas把你的一些零散的图片,合并成一张图.这样做的优点是,能够减少Draw Call.我不了解它的底层运作机制,我猜应该也是再行进DXT之类的纹理压缩,所以 ...
- iOS经常使用类别
我们发现,慢慢积累了很多自己写的各种类别的. .今天,无私.张贴 1.NSDateFomatter @interface NSDateFormatter (MyCategory) + (id)date ...
- 【转】MAT(Memory Analyzer Tool)工具入门介绍
1.MAT是什么? MAT(Memory Analyzer Tool),一个基于Eclipse的内存分析工具,是一个快速.功能丰富的JAVA heap分析工具,它可以帮助我们查找内存泄漏和减少内存消耗 ...