惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Y
Y Combinator Blog
有赞技术团队
有赞技术团队
J
Java Code Geeks
H
Hackread – Cybersecurity News, Data Breaches, AI and More
美团技术团队
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Hugging Face - Blog
Hugging Face - Blog
人人都是产品经理
人人都是产品经理
酷 壳 – CoolShell
酷 壳 – CoolShell
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
C
Check Point Blog
博客园 - 【当耐特】
The GitHub Blog
The GitHub Blog
Recent Announcements
Recent Announcements
The Cloudflare Blog
Microsoft Azure Blog
Microsoft Azure Blog
腾讯CDC
Vercel News
Vercel News
IT之家
IT之家
MyScale Blog
MyScale Blog
博客园_首页
Martin Fowler
Martin Fowler
WordPress大学
WordPress大学
罗磊的独立博客

博客园 - shipfi

CMarkup的改进 - shipfi - 博客园 asp.net中的AJAX编程-异步网络调用 asp.net中的AJAX编程-Ajax服务器扩展 asp.net中的AJAX编程-Javascript语法补充 asp.net中的AJAX编程-ASP.NET AJAX框架 asp.net问题点集合 asp.net学习之ado.net(无连接模式中的DataAdapter) asp.net学习之ado.net(连接模式访问) asp.net学习之DataList控件 asp.net学习之Repeater控件 asp.net学习之扩展GridView asp.net学习之GridView事件、GridViewRow对象 asp.net学习之GridView七种字段 asp.net学习之GridView asp.net学习之SqlDataSource asp.net学习之 数据绑定控件--表格绑定控件 asp.net学习之 数据绑定控件--List数据绑定控件 asp.net学习之数据绑定控件、数据源控件概述 理解T-SQL: 存储过程 - shipfi - 博客园
asp.net学习之再论sqlDataSource
shipfi · 2009-10-16 · via 博客园 - shipfi

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