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