开发者社区> 杰克.陈> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

asp.net学习之再论sqlDataSource

简介: 原文:asp.net学习之再论sqlDataSource     本节从上一节没有阐述的几个方面,再讨论一下SqlDataSource的用法及注意的事项。     上一节的链接地址如下:http://www.cnblogs.com/shipfi/archive/2009/10/15/1584093.html 1. SqlDataSource的参数方向(Parameters Direction)     SqlDataSource的参数可以设置方向,默认值为INPUT。
+关注继续查看
原文: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 MVC (第三回)实战篇
本系列文章导航 学习 ASP.NET MVC (第一回)理论篇 学习 ASP.NET MVC (第二回)实战篇 学习 ASP.NET MVC (第三回)实战篇 学习 ASP.NET MVC (第四回)实战篇 学习 ASP.NET MVC (第五回)理论篇 创建Controllers和Views我们再次回顾下ASP.NET MVC的基本工作流程:URL-->Controller(会执行一个方法Action)-->从数据库中获取一个Model对象-->将Model作为ViewData传递给View(Detail.aspx)。
782 0
艾伟_转载:学习 ASP.NET MVC (第四回)实战篇
本系列文章导航 学习 ASP.NET MVC (第一回)理论篇 学习 ASP.NET MVC (第二回)实战篇 学习 ASP.NET MVC (第三回)实战篇 学习 ASP.NET MVC (第四回)实战篇 学习 ASP.NET MVC (第五回)理论篇 我们继续ASP.NET MVC之旅。
812 0
ASP.NET自定义控件组件开发 第一章 第三篇
原文:ASP.NET自定义控件组件开发 第一章 第三篇                                             第三篇:第一章的完结篇     系列文章链接: ASP.
887 0
ASP.NET自定义控件组件开发 第一章 第二篇 接着待续
原文:ASP.NET自定义控件组件开发 第一章 第二篇 接着待续      ASP.NET自定义控件组件开发 第一章 第二篇 接着待续     很感谢大家给我的第一篇ASP.NET控件开发的支持!在写这些之前,我也看了一些例子,想选中一些好上手的例子,这样,可能一些例子大家以前都见过,但是我想说:同样是弹钢琴,同样一首“命运交响曲”,有的人弹的让人荡气回肠,有的人弹的就很一般。
911 0
一起谈.NET技术,asp.net控件开发基础(10)
  集合属性相信大家都很熟悉也很常用,如DropDownList,ListBox等控件             测试1            测试2            测试3           1.实现集合属性效果   经过前面几篇的学习,相信这一篇看起来已经相对简单了.我们要做的就是,先定义一个复杂属性,然后用迭代语句获取数组数据即可。
766 0
+关注
杰克.陈
一个安静的程序猿~
文章
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载