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” />

你可能感兴趣的:(dataSource)