Руководство по работе с БД Firebird с использованием библиотеки ADO .Net 2.0

       

Управляющие последовательности ODBC


Управляющие последовательности позволяют преобразовывать текст запроса в процессе выполнения. Последовательность включается в текст запроса в фигурных скобках. Например {fn CURDATE} – выражение будет преобразовано в значение серверного времени.

В ODBC определены управляющие последовательности для следующих характеристик:

  • Работа со временем и датами
  • Функции преобразования типов
  • Предикат LIKE
  • OUTER JOIN
  • Вызовы хранимых процедур
  • Данное расширение активно используется такими инструментами, как MS SQL Server, Crystal Reports, различные OLAP средства и их поддержка со стороны Ole Db провайдера обеспечивает возможность их совместного использования.

    Для того, чтобы включить поддержку ODBC расширений в IBProvider, необходимо установить свойство инициализации support_odbc_call = true. По умолчанию поддержка отключена.

    IBProvider умеет вызывать хранимые процедуры в ODBC стиле, а также поддерживает следующие функции, которые могут быть использованы внутри управляющих последовательностей:

    • Функции для работы с датами и временем: CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURDATE, CURTIME, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, EXTRACT, HOUR, MINUTE, MONTH, MONTHNAME, NOW, QUARTER, SECOND, WEEK, YEAR.
    • Конвертирование данных: CONVERT
    • Системные функции: USER
    • Строковые функции: UCASE
    • Следующий пример демонстрирует применение управляющих последовательностей в тексте SQL запросов:

      public void ODBCQueriesTest() { OleDbConnectionStringBuilder builder = ConnectionProvider.GetConnectionStringBuilderFromUDL(); builder.Provider = "LCPI.IBProvider.2"; builder.Add("support_odbc_query","true");

      OleDbConnection con = new OleDbConnection(builder.ToString()); con.Open(); OleDbTransaction trans = con.BeginTransaction();

      //select current day name OleDbCommand cmd = new OleDbCommand( "select " + "{fn dayname({fn now()})} as DAY_NAME," + "{fn dayofweek({fn now()})} as DAY_OF_WEEK," + "{fn dayofmonth({fn now()})} as DAY_OF_MONTH," + "{fn dayofyear({fn now()})} as DAY_OF_YEAR " + "from RDB$DATABASE", con, trans);

      using (OleDbDataReader rdr = cmd.ExecuteReader()) if (rdr.Read()) for (int i = 0; i < rdr.FieldCount; i++) Console.WriteLine(rdr.GetName(i) + ": " + rdr[i].ToString());

      trans.Commit(); con.Close(); }

      На момент написания статьи ODBC запросы поддерживались в 1-й и 2-й версии IBProvider и ещё не были реализованы в третьей. Так что для использования этой возможности необходимо указывать в строке подключения Provider = "LCPI.IBProvider.2"

      За более подробной информацией по использованию управляющих последовательностей ODBC советую вам обратиться к документу «ODBC Programmer’s Reference» и изучить раздел «Escape Characters in ODBC».



      Содержание раздела