SqlDataSource 執行資料篩選
使用 SqlDataSource 控件可以很方便的与 UI 控件 (如 GridView、FormView) 系结来呈现数据,若需要针对 SqlDataSource 做数据筛选时,最直觉的方式就是去修改 SqlDataSoruce.SelectCommand 的 SQL 命令来执行数据筛选,这样设定的呈现结果感觉是正确的,数据真得依设定的条件来筛选过滤。可以当 UI 控件重新做 DataBind 时,如 GridView 换页的动作,会发生数据又全部跑出来了。为何会有这样异常的结果呢?本文就是来说明发生这种情形的原因及正确的程序撰写方式。
SqlDataSource 执行数据筛选
在页面上放置 SqlDataSource 及 GridView 来呈现数据,并将 GridView 设定分页,页面控件的配置如下所示,当按下 [Filter] 按钮时,会依选取的字段名称及输入的筛选值来过滤数据。
在 [Filter] 按钮的 Click 事件撰写如下程序代码,主要是依设定的字段及筛选值产生 SQL 语法,并设定给 SqlDataSource.SelectCommand 属性。
Dim sSQL As String
Dim sFilter As String
Select Case ddlFile.SelectedValue.ToUpper
Case "EmployeeID".ToUpper
sFilter = "[EmployeeID]=" & txtValue.Text
Case Else
sFilter = "[" & ddlFile.SelectedValue & "] Like '%" & txtValue.Text & "%'"
End Select
sSQL = "SELECT [EmployeeID], [LastName], [FirstName], [Title], [City] FROM [Employees] Where " & sFilter
SqlDataSource1.SelectCommand = sSQL
End Sub
在 [DataBind] 按钮的 Click 事件撰写如下程序代码,主要是在显示 SqlDataSource.SelectCommand 属性值及执行 GridView.DataBind,使 GridView 重新系结数据。
Response.Write("SelectCommand: " & SqlDataSource1.SelectCommand)
GridView1.DataBind()
End Sub
执行程序,选择 EmployeeID 字段,输入筛选值为 "3",按下 [Filter] 按钮来执行筛选,执行结果可以正确筛选资料。
可是这时我们按下 [DataBind] 按钮,让 GridView 重新做数据系结。这时发生了奇怪的现象,资料怎么全又跑出来了呢?仔细看一下输出的 SqlDataSource.SelectCommand 属性值,它怎么不是我们刚刚设定的筛选 SQL 语法呢?若筛选的数据可以分页,你会发现按换页的结果,也会发生同样的情形,因为 换页也需要 DataBind,所以跟自行去设定 DataBind 的结果是一样的。
为什么设定的 SelectCommand 属性值不见了呢?主要原因就是 SelectCommand 属性并没有被保留在 ViewState 中,所以每次 PostBack 时,它的值就会还原为设计阶段的初始值。
SqlDataSource 执行数据筛选正确作法
即然我们知道原因是「SelectCommand 属性并没有被保留在 ViewState 中」,那最简单的方式就是我们自行撰写程序将其保留在 ViewState 中,故页面覆写 LoadViewState 及 SaveViewState 方法来保留 SelectCommand 属性。
''' 由 ViewState 还原控件的状态。
''' </summary>
''' <param name="savedState">要还原的控件状态。</param>
Protected Overrides Sub LoadViewState()Sub LoadViewState(ByVal savedState As Object)
If Not (savedState Is Nothing) Then
' Load State from the array of objects that was saved at ;
' SavedViewState.
Dim myState As Object() = CType(savedState, Object())
If Not (myState(0) Is Nothing) Then
MyBase.LoadViewState(myState(0))
End If
If Not (myState(1) Is Nothing) Then
SqlDataSource1.SelectCommand = CType(myState(1), String)
End If
End If
End Sub
/**/''' <summary>
''' 控件的状态储存至 ViewState。
''' </summary>
''' <returns>含有控件之目前检视状态的对象。</returns>
Protected Overrides Function SaveViewState()Function SaveViewState() As Object
Dim baseState As Object = MyBase.SaveViewState()
Dim myState(1) As Object
myState(0) = baseState
myState(1) = SqlDataSource1.SelectCommand
Return myState
End Function
重新执行程序,与之前的做法一样来筛选数据,最后按下 [DataBind] 按钮重新做数据系结,可以发现结果正确了,而输出的 SelectCommand 属性值也是我们最后设定的值。
SqlDataSource 執行資料篩選相关推荐
- mysql hammerdb,[料理佳餚] 用 HammerDB 來執行資料庫 TPC-C 效能量測
TPC-C 模擬的情境 TPC-C 模擬的情境是一個大型的商品批發商,擁有若干個倉庫,每個倉庫擁有 100000 件商品庫存.負責為 10 個地區供貨,每個地區服務 3000 名客戶,每名客戶平均一筆 ...
- [心得] 如何利用liquibase進行資料庫版本控制 - 實際練習
透過上一篇的基本觀念介紹,希望大家應該有一點點感覺了! 這篇我們就來做個簡單的版本演練,加深印象吧! 我使用的環境如下 System : Windows 7 Database : SQL Server ...
- 實戰案例 - 微信平台與自有產品資料對接 (2)
前面瞭解過程式的背景需求和基本架構之後,接著就來看整個開發工作是靠哪些原始碼兜起來的.因為兩個 WinForm 的原始碼骨架都差不多,所以這邊就拿 SybaseUtility 專案當範例. Servi ...
- [SQL SERVER][Memo]篩選索引
SQL2008 在索引類型中新增了一個名為篩選索引的新成員,線上叢書說明篩選索引是最佳化的非叢集索引, 特別適合從已定義的資料子集進行查詢篩選. 簡單來說就是在建立非叢集索引時可加上簡單的 WHERE ...
- SQL Server 的分散式資料複寫技術
作者:楊先民 本頁內容 前言 資料庫複寫(Replication)的介紹與使用時機 如何建置資料庫複寫 複寫代理程式 (Replication Agent) 的功能 複寫的種類與使用的時機 設計一個安 ...
- Python程式與數據資料分析1
"Talk is cheap. Show me the code." ― Linus Torvalds 老子第41章 上德若谷 大白若辱 大方無隅 大器晚成 大音希聲 大象無形 道 ...
- 數據移動時發生***識別欄位其外顯值只有當使用了資料行清單且 IDENTITY_INSERT 為 ON 時才能指定...
當數據在兩個相同結構的表中移動并且發生: ***識別欄位其外顯值只有當使用了資料行清單且 IDENTITY_INSERT 為 ON 時才能指定的錯誤時 用以下方法解決: SET IDENTITY_IN ...
- flask html下拉列表,在Flask框架中,在html做下拉式選單,選完顯示連結MySQL資料庫的資料...
順便寫了ajax版的,主要是javascript的操作. code要寫的稍微多一點,不過這樣可以分離html,而且更靈活. index.py from flask import Flask, rend ...
- LabelImg 影像標註工具使用教學,製作深度學習用的資料集
本篇介紹如何使用 LabelImg 這個免費的影像標註工具,標示照片中的物體,製作成可用來訓練深度學習引擎的輸入資料集. 在使用深度學習來實作影像的物件偵測時,都會需要有大量的已知資料集,也就是照片加 ...
最新文章
- 官宣!VS Code Python 全新功能在 PyCon China 全球首发!
- 微软面试题目(一) 计算两个日期之间的天数
- 什么是HTML5?HTML5发展前景如何?
- LeetCode 1259. 不相交的握手(DP)
- Postgresql - MATERIALIZED VIEW
- origin如何将多个曲线放在一张图_Origin入门教程(十二):误差棒棒棒棒儿
- ajax success function_【java 基础】java-回调函数(结合jquery.ajax)
- axure rp9是什么软件?如何在Mac中安装使用?
- 《痞子衡嵌入式半月刊》 第 2 期
- 断电oracle 01033,电脑非法关机 导致ORA-01033:解决方法
- 刷卡机显示服务器连接失败,pos密码错误_POS机常见故障代码解释
- ITIL学习笔记——核心流程之:服务台
- 亚马逊aws认证是什么?亚马逊aws认证证书含金量怎么样?
- PDF格式的“在线阅读”和“下载”
- 微软官方知识:了解 Office 二进制文件格式
- 1.4 裸机实验GPIO与LED DNW驱动无法安装问题解决
- 微信小打卡,微信小打卡上打卡方法,被微信推荐的打卡小程序CSS margin(外边距)
- Delphi Tmail2000
- uniapp使用第三方文字,本地文字
- 毫米波雷达攻“芯”为上,行业巨头挑战传统供应链合作模式
热门文章
- jupyter notebook上完美运行tensorflow、keras
- 思科发力虚拟化和云服务 推出多款新品
- 多态指针访问虚函数不能被继承的类快速排序N皇后问题插入排序堆排序merge归并排序栈上生成对象两个栈实现一个队列...
- CentOS 6.7安装ZooKeeper 3.4.9
- 洛谷 P1008 三连击 Label:水
- linux下如何查看文件大小 快速找到最大文件的方法
- kvm虚拟化技术下虚拟机磁盘的数据保护
- 1.1.1 概念、组成、功能和分类
- DSP学习初阶的一些笔记
- Matlab和Modelsim联合仿真的配置