Управляющие последовательности ODBC
Управляющие последовательности позволяют преобразовывать текст запроса в процессе выполнения. Последовательность включается в текст запроса в фигурных скобках. Например {fn CURDATE} – выражение будет преобразовано в значение серверного времени.
В ODBC определены управляющие последовательности для следующих характеристик:
- Работа со временем и датами
- Функции преобразования типов
- Предикат LIKE
- OUTER JOIN
- Вызовы хранимых процедур
- Функции для работы с датами и временем: 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
Данное расширение активно используется такими инструментами, как MS SQL Server, Crystal Reports, различные OLAP средства и их поддержка со стороны Ole Db провайдера обеспечивает возможность их совместного использования.
Для того, чтобы включить поддержку ODBC расширений в IBProvider, необходимо установить свойство инициализации support_odbc_call = true. По умолчанию поддержка отключена.
IBProvider умеет вызывать хранимые процедуры в ODBC стиле, а также поддерживает следующие функции, которые могут быть использованы внутри управляющих последовательностей:
Следующий пример демонстрирует применение управляющих последовательностей в тексте 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».