Опубликован: 29.07.2008 | Доступ: свободный | Студентов: 1265 / 145 | Оценка: 4.49 / 4.15 | Длительность: 17:53:00
Тема: Базы данных
Специальности: Администратор баз данных
Теги:
Лекция 3:
Динамическое построение запросов
Запускаем пример приложения Dynamic Queries
- Дважды щелкните файл Ch07.sln в папке Chapter07\Filter, чтобы открыть проект в Visual Studio.
- Выберите команду Start Debugging (Начать отладку) из меню Debug (Отладка). Выберите сервер и нажмите кнопку ОК, Visual Studio построит и запустит проект, отобразив начальную форму, как показано ниже.
- В форме frmPpal щелкните раскрывающийся список Data в панели инструментов, а затем выберите Table Sales, Customer.
- Выберите элементы CustomerID, TerritoryID и AccountNumber в поле со списком и нажмите кнопку "Стрелка вправо" в центре формы.
- Нажмите кнопку Build Query на панели инструментов. Теперь окно программы вверху справа отображает поля, которые вы выбрали, а внизу справа - соответствующий запрос SQL, как показано на рисунке.
- Щелкните правой кнопкой мыши в строке CustomerID и выберите из контекстного меню команды Order, Ascending.
- Щелкните правой кнопкой мыши в строке CustomerID и выберите из контекстного меню команды Order, Ascending. В диалоговом окне Filter выберите в раскрывающемся списке Less_Than и введите в текстовое поле 20. Нажмите кнопку ОК.
- Снова нажмите кнопку Build Query на панели инструментов. Теперь динамический запрос выглядит следующим образом:
SELECT [CustomerID],[TerritoryID],[AccountNumber] FROM Sales.Customer WHERE [CustomerID] < 20 ORDER BY [Customer].[CustomerID]
- Нажмите кнопку Execute Query, чтобы выполнить этот динамический запрос. В окне программы отобразятся следующие результаты:
Как пример приложения строит строку фильтрации
Это приложение хранит различные значения, показанные в правой верхней части формы, в элементе управления ListView с именем lvUseFields, показанном в табл. 3.1.
Свойство | Содержит |
---|---|
Text | Имя схемы |
SubItems(1) | Имя таблицы |
SubItems(2) | Имя поля |
SubItems(3) | Имя (Псевдоним для результирующего столбца) |
SubItems(4) | Состояние сортировки |
SubItems(5) | Оператор фильтрации |
SubItems(6) | Значение фильтра |
Когда вы нажимаете кнопку Build Query на панели инструментов, следующий код выполняет построение динамического запроса, используя содержимое элемента управления ListView lvUseFields. Обратите особое внимание на ту часть кода, которая показана полужирным шрифтом и демонстрирует построение предложения WHERE для фильтрации динамического запроса.
Private Sub tsbGen_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles tsbGen.Click Dim baseSQL As String = "SELECT {0} from {1}" "Список отображаемых полей Dim sbFields As New System.Text.StringBuilder "Порядок списка столбцов Dim sbOrderBy As New System.Text.StringBuilder("") "Фильтры Dim sbFilter As New System.Text.StringBuilder("") With sbFields For Each el As ListViewItem In lvUseFields.Items If .Length <> 0 Then .Append(",") End If "Добавляем в список полей Column .AppendFormat("[{0}]", _ el.SubItems(UseFieldsColumnsEnum.Field).Text) "Если Name не совпадает с именем столбца, добавляем Alias If el.SubItems(UseFieldsColumnsEnum.Name).Text <> _ el.SubItems(UseFieldsColumnsEnum.Field).Text Then .AppendFormat(" AS [{0}]", _ el.SubItems(UseFieldsColumnsEnum.Name).Text) End If "Если существует фильтр... If el.SubItems(UseFieldsColumnsEnum.Filter).Text <> "" Then With sbFilter If .Length > 0 Then .Append(" AND ") End If "Добавляем имя столбца в список фильтров .AppendFormat("[{0}]", el.SubItems( _ UseFieldsColumnsEnum.Field).Text) "Добавляем оператор Select Case CType([Enum].Parse( _ GetType(FilterTypeEnum), _ el.SubItems(UseFieldsColumnsEnum.Filter _ ).Text.Replace(" ", "_")), FilterTypeEnum) Case FilterTypeEnum.Equal .Append(" = ") Case FilterTypeEnum.Not_Equal .Append(" <> ") Case FilterTypeEnum.Greather_Than .Append(" >") Case FilterTypeEnum.Less_Than .Append(" < ") Case FilterTypeEnum.Like .Append(" LIKE ") Case FilterTypeEnum.Between .Append(" BETWEEN ") End Select "Получаем тип данных из определений столбцов Dim Typename As String = _ tableColumns.Select(String.Format("COLUMN_NAME='{0}'", _ el.SubItems(UseFieldsColumnsEnum.Field).Text))(0).Item( _ "DATA_TYPE").ToString "Если тип данных принадлежит к типам с символьными значениями, "значение следует заключить в апострофы If Typename.ToUpper.IndexOf("CHAR") > -1 _ OrElse Typename.ToUpper.IndexOf("TEXT") > -1 Then .Append(""") End If .Append(el.SubItems(UseFieldsColumnsEnum.Filter_Value).Text) "Если оператор с Like, добавляем групповой символ "%" If CType([Enum].Parse(GetType(FilterTypeEnum), _ el.SubItems(UseFieldsColumnsEnum.Filter).Text.Replace( _ " ", "_")), FilterTypeEnum) = FilterTypeEnum.Like Then .Append("%") End If If Typename.ToUpper.IndexOf("CHAR") > -1 _ OrElse Typename.ToUpper.IndexOf("TEXT") > -1 Then .Append(""") End If End With End If Next End With "Добавляем порядок For Each o As System.Collections.Generic.KeyValuePair( _ Of Integer, SortInfo) In OrderList With sbOrderBy If .Length <> 0 Then .Append(",") End If .AppendFormat("[{0}].[{1}]", o.Value.TableName, o.Value.ColumnName) If o.Value.SortOrder = SortOrder.Descending Then .Append(" DESC") End If End With Next If sbOrderBy.Length > 0 Then sbOrderBy.Insert(0, " ORDER BY ") End If If sbFilter.Length > 0 Then sbFilter.Insert(0, " WHERE ") End If "Строка запроса должна выглядеть так: SELECT columns FROM table, "затем WHERE и в завершение ORDER txtsql.Text = _ String.Format(baseSQL, _ sbFields.ToString, _ String.Format("{0}.{1}", SchemaName, TableName)) & _ sbFilter.ToString & " " & sbOrderBy.ToString End Sub