原文:
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” />