Опубликован: 29.07.2008 | Доступ: свободный | Студентов: 1265 / 145 | Оценка: 4.49 / 4.15 | Длительность: 17:53:00
Лекция 3:

Динамическое построение запросов

< Лекция 2 || Лекция 3: 1234 || Лекция 4 >
Запускаем пример приложения Dynamic Queries
  1. Дважды щелкните файл Ch07.sln в папке Chapter07\Filter, чтобы открыть проект в Visual Studio.
  2. Выберите команду Start Debugging (Начать отладку) из меню Debug (Отладка). Выберите сервер и нажмите кнопку ОК, Visual Studio построит и запустит проект, отобразив начальную форму, как показано ниже.
  3. В форме frmPpal щелкните раскрывающийся список Data в панели инструментов, а затем выберите Table Sales, Customer.
  4. Выберите элементы CustomerID, TerritoryID и AccountNumber в поле со списком и нажмите кнопку "Стрелка вправо" в центре формы.
  5. Нажмите кнопку Build Query на панели инструментов. Теперь окно программы вверху справа отображает поля, которые вы выбрали, а внизу справа - соответствующий запрос SQL, как показано на рисунке.
  6. Щелкните правой кнопкой мыши в строке CustomerID и выберите из контекстного меню команды Order, Ascending.
  7. Щелкните правой кнопкой мыши в строке CustomerID и выберите из контекстного меню команды Order, Ascending. В диалоговом окне Filter выберите в раскрывающемся списке Less_Than и введите в текстовое поле 20. Нажмите кнопку ОК.
  8. Снова нажмите кнопку Build Query на панели инструментов. Теперь динамический запрос выглядит следующим образом:
    SELECT [CustomerID],[TerritoryID],[AccountNumber] 
       FROM Sales.Customer WHERE [CustomerID] < 20 
       ORDER BY [Customer].[CustomerID]
  9. Нажмите кнопку Execute Query, чтобы выполнить этот динамический запрос. В окне программы отобразятся следующие результаты:
Как пример приложения строит строку фильтрации

Это приложение хранит различные значения, показанные в правой верхней части формы, в элементе управления ListView с именем lvUseFields, показанном в табл. 3.1.

Таблица 3.1. Поля в элементе управления ListView lvUseFields
Свойство Содержит
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
< Лекция 2 || Лекция 3: 1234 || Лекция 4 >