摘要
使用 SqlDataSource 控件可以很方便的与 UI 控件 (如 GridView、FormView) 系结来呈现数据,若需要针对 SqlDataSource 做数据筛选时,最直觉的方式就是去修改 SqlDataSoruce.SelectCommand 的 SQL 命令来执行数据筛选,这样设定的呈现结果感觉是正确的,数据真得依设定的条件来筛选过滤。可以当 UI 控件重新做 DataBind 时,如 GridView 换页的动作,会发生数据又全部跑出来了。为何会有这样异常的结果呢?本文就是来说明发生这种情形的原因及正确的程序撰写方式。

SqlDataSource 执行数据筛选
在页面上放置 SqlDataSource 及 GridView 来呈现数据,并将 GridView 设定分页,页面控件的配置如下所示,当按下 [Filter] 按钮时,会依选取的字段名称及输入的筛选值来过滤数据。

在 [Filter] 按钮的 Click 事件撰写如下程序代码,主要是依设定的字段及筛选值产生 SQL 语法,并设定给  SqlDataSource.SelectCommand 属性。

    Protected Sub btnFilter_Click()Sub btnFilter_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnFilter.Click
        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 重新系结数据。

    Protected Sub btnDataBind_Click()Sub btnDataBind_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnDataBind.Click
        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 属性。

    /**/''' <summary>
    ''' 由 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 執行資料篩選相关推荐

  1. mysql hammerdb,[料理佳餚] 用 HammerDB 來執行資料庫 TPC-C 效能量測

    TPC-C 模擬的情境 TPC-C 模擬的情境是一個大型的商品批發商,擁有若干個倉庫,每個倉庫擁有 100000 件商品庫存.負責為 10 個地區供貨,每個地區服務 3000 名客戶,每名客戶平均一筆 ...

  2. [心得] 如何利用liquibase進行資料庫版本控制 - 實際練習

    透過上一篇的基本觀念介紹,希望大家應該有一點點感覺了! 這篇我們就來做個簡單的版本演練,加深印象吧! 我使用的環境如下 System : Windows 7 Database : SQL Server ...

  3. 實戰案例 - 微信平台與自有產品資料對接 (2)

    前面瞭解過程式的背景需求和基本架構之後,接著就來看整個開發工作是靠哪些原始碼兜起來的.因為兩個 WinForm 的原始碼骨架都差不多,所以這邊就拿 SybaseUtility 專案當範例. Servi ...

  4. [SQL SERVER][Memo]篩選索引

    SQL2008 在索引類型中新增了一個名為篩選索引的新成員,線上叢書說明篩選索引是最佳化的非叢集索引, 特別適合從已定義的資料子集進行查詢篩選. 簡單來說就是在建立非叢集索引時可加上簡單的 WHERE ...

  5. SQL Server 的分散式資料複寫技術

    作者:楊先民 本頁內容 前言 資料庫複寫(Replication)的介紹與使用時機 如何建置資料庫複寫 複寫代理程式 (Replication Agent) 的功能 複寫的種類與使用的時機 設計一個安 ...

  6. Python程式與數據資料分析1

    "Talk is cheap. Show me the code." ― Linus Torvalds 老子第41章 上德若谷 大白若辱 大方無隅 大器晚成 大音希聲 大象無形 道 ...

  7. 數據移動時發生***識別欄位其外顯值只有當使用了資料行清單且 IDENTITY_INSERT 為 ON 時才能指定...

    當數據在兩個相同結構的表中移動并且發生: ***識別欄位其外顯值只有當使用了資料行清單且 IDENTITY_INSERT 為 ON 時才能指定的錯誤時 用以下方法解決: SET IDENTITY_IN ...

  8. flask html下拉列表,在Flask框架中,在html做下拉式選單,選完顯示連結MySQL資料庫的資料...

    順便寫了ajax版的,主要是javascript的操作. code要寫的稍微多一點,不過這樣可以分離html,而且更靈活. index.py from flask import Flask, rend ...

  9. LabelImg 影像標註工具使用教學,製作深度學習用的資料集

    本篇介紹如何使用 LabelImg 這個免費的影像標註工具,標示照片中的物體,製作成可用來訓練深度學習引擎的輸入資料集. 在使用深度學習來實作影像的物件偵測時,都會需要有大量的已知資料集,也就是照片加 ...

最新文章

  1. 官宣!VS Code Python 全新功能在 PyCon China 全球首发!
  2. 微软面试题目(一) 计算两个日期之间的天数
  3. 什么是HTML5?HTML5发展前景如何?
  4. LeetCode 1259. 不相交的握手(DP)
  5. Postgresql - MATERIALIZED VIEW
  6. origin如何将多个曲线放在一张图_Origin入门教程(十二):误差棒棒棒棒儿
  7. ajax success function_【java 基础】java-回调函数(结合jquery.ajax)
  8. axure rp9是什么软件?如何在Mac中安装使用?
  9. 《痞子衡嵌入式半月刊》 第 2 期
  10. 断电oracle 01033,电脑非法关机 导致ORA-01033:解决方法
  11. 刷卡机显示服务器连接失败,pos密码错误_POS机常见故障代码解释
  12. ITIL学习笔记——核心流程之:服务台
  13. 亚马逊aws认证是什么?亚马逊aws认证证书含金量怎么样?
  14. PDF格式的“在线阅读”和“下载”
  15. 微软官方知识:了解 Office 二进制文件格式
  16. 1.4 裸机实验GPIO与LED DNW驱动无法安装问题解决
  17. 微信小打卡,微信小打卡上打卡方法,被微信推荐的打卡小程序CSS margin(外边距)
  18. Delphi Tmail2000
  19. uniapp使用第三方文字,本地文字
  20. 毫米波雷达攻“芯”为上,行业巨头挑战传统供应链合作模式

热门文章

  1. jupyter notebook上完美运行tensorflow、keras
  2. 思科发力虚拟化和云服务 推出多款新品
  3. 多态指针访问虚函数不能被继承的类快速排序N皇后问题插入排序堆排序merge归并排序栈上生成对象两个栈实现一个队列...
  4. CentOS 6.7安装ZooKeeper 3.4.9
  5. 洛谷 P1008 三连击 Label:水
  6. linux下如何查看文件大小 快速找到最大文件的方法
  7. kvm虚拟化技术下虚拟机磁盘的数据保护
  8. 1.1.1 概念、组成、功能和分类
  9. DSP学习初阶的一些笔记
  10. Matlab和Modelsim联合仿真的配置