原文: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的更多相关文章

  1. asp.net学习之SqlDataSource

    原文:asp.net学习之SqlDataSource 通过 SqlDataSource 控件,可以使用 Web 服务器控件访问位于关系数据库中的数据.其中可以包括 Microsoft SQL Serv ...

  2. asp.net学习之GridView事件、GridViewRow对象

    原文:asp.net学习之GridView事件.GridViewRow对象 1. GridView控件的事件 GridView有很多事件,事件可以定制控件的外观或者行为.事件分为三类     1.1 ...

  3. asp.net学习之Repeater控件

    asp.net学习之Repeater控件 文章摘自:http://www.cnblogs.com/shipfi/archive/2009/10/19/1585703.html Repeater控件和D ...

  4. asp.net学习资源汇总

    名称:快速入门地址:http://chs.gotdotnet.com/quickstart/描述:本站点是微软.NET技术的快速入门网站,我们不必再安装.NET Framework中的快速入门示例程序 ...

  5. asp.net学习之DataList控件

    asp.net学习之DataList控件   DataList控件与Repeater控件一样由模板驱动,与Repeater控件不同的是: DataList控件默认输出是一个HTML表格.DataLis ...

  6. asp.net学习之 数据绑定控件--List数据绑定控件

    原文:asp.net学习之 数据绑定控件--List数据绑定控件 List控件(如 CheckBoxList.DropDownList.ListBox 和 RadioButtonList 类)继承自L ...

  7. asp.net学习之数据绑定控件、数据源控件概述

    原文:asp.net学习之数据绑定控件.数据源控件概述 1.asp.net数据绑定控件分为三大类,每个类分别进行详细:      ● 列表式数据绑定控件: 列表式数据绑定控件常用来在一个表格内的一个字 ...

  8. asp.net学习之GridView七种字段

    原文:asp.net学习之GridView七种字段 asp.net中GridView绑定到数据源时,可以自动显示数据源的各个字段.只要设定其AutoGenerateColumns为TRUE即可.但这, ...

  9. asp.net学习之ado.net(连接模式访问)

    原文:asp.net学习之ado.net(连接模式访问)    ado.net框架支持两种模式的数据访问: 连接模式(Connected)和非连接模式(disconnected).这一节介绍如何使用连 ...

随机推荐

  1. WPF中对三维模型的控制

    原文:WPF中对三维模型的控制 (以下选自南开大学出版社出版的<WPF和Silverlight教程>) 3Dmax中的建模模型可以导出为obj文件格式,将此文件导入WPF项目中,由WPF完 ...

  2. 小米2S twrp 中文,支持双系统

    更新日志: 更新日志: 汉化了要使用的功能 修改语言选择方式,修改为下拉方式 TDB(TrueDualBoot) 功能完美实现 **adb**功能,完美实现,无需特别操作(比CWM强大) 修改双系统切 ...

  3. 重新想象 Windows 8 Store Apps (25) - 选取器: 文件选取窗口, 文件夹选取窗口, 文件保存窗口

    原文:重新想象 Windows 8 Store Apps (25) - 选取器: 文件选取窗口, 文件夹选取窗口, 文件保存窗口 [源码下载] 重新想象 Windows 8 Store Apps (2 ...

  4. Android的ViewAnimator而它的子类ViewSwitcher-android学习之旅(三十三)

    ViewAnimator遗传FrameLayout,重合使用多个组件.可以增加部件数量,然后会有时间切换动画. ViewAnimator及其子类的继承关系 ViewAnimator经常使用属性 Vie ...

  5. Caching-缓存架构与源码分析

    Caching-缓存架构与源码分析 首先奉献caching的开源地址[微软源码] 1.工程架构 为了提高程序效率,我们经常将一些不频繁修改,但是使用了还很大的数据进行缓存.尤其是互联网产品,缓存可以说 ...

  6. POJ 3177 Redundant Paths POJ 3352 Road Construction(双连接)

    POJ 3177 Redundant Paths POJ 3352 Road Construction 题目链接 题意:两题一样的.一份代码能交.给定一个连通无向图,问加几条边能使得图变成一个双连通图 ...

  7. [LeetCode290]Word Pattern

    题目: Given a pattern and a string str, find if str follows the same pattern. Here follow means a full ...

  8. HDFS 上传文件的不平衡,Balancer问题是过慢

    至HDFS上传文件.假定从datanode开始上传文件,上传的数据将导致目前的当务之急是全datanode圆盘.这是一个分布式程序的执行是非常不利. 解决方案: 1.从其他非datanode节点上传 ...

  9. NYOJ 14 场地安排

    /* 中国标题的含义: 中国的翻译: 标题效果:寻求预定场地的最大数量,只有一个活动可以安排时间 解决问题的思路:然后使用结构数.之后再构建一个排序,排序结束时间活动.然后基于开始时间为大于一个事件的 ...

  10. UVa11488-Hyper Prefix Sets(trie树)

    H Hyper Prefix Sets Prefix goodness of a set string is length of longest common prefix*number of str ...