Подключение базы данных InterBase к MS SQL серверу

  1. Установите IBProvider на сервер с MSSQL.
  2. Запустите "SQL Server Enterprise Manager".
  3. Подключитесь к серверу MSSQL, к которому будет подключена база данных InterBase.
  4. Перейдите на элемент дерева "Sequrity\Linked Servers".

    Sequrity\Linked Servers

  5. Выполните пункт меню "New Linked Server".
  6. Заполните поля:

    Linked Server Имя связанного сервера, которое будет использоваться в тексте SQL запросов.
    Provider Name LCPI OLE DB Provider for InterBase [v2]
    Data Source Полный путь к базе данных InterBase.
    Provider String Строка подключения к базе данных. Обязательные параметры:


    Linked Server Properties

  7. Нажмите кнопку "Provider Options". Отметьте элементы Закройте диалог, нажав "OK".
  8. Перейдите на вкладку "Server Options". Отметьте элементы RPC метки указывают, что провайдер поддерживает вызов хранимых процедур. Проверьте, что в строке подключения вы не забыли указать "support_odbc_query=true".
  9. Закройте диалог "Linked Server Properties - New Linked Server", нажав "OK".

Если вы правильно заполнили параметры подключения, то вы можете просмотреть таблицы и виды(views) в подключенной базе данных.

SQL Server Enterprise Manager

Выполнение запросов к базе данных из "SQL Query Analyzer"

Запустите "SQL Query Analyzer" и подключитесь к MSSQL серверу, на котором вы зарегистрировали связанный сервер InterBase.

Запрос на выборку данных

begin distributed transaction;

select * from IB_EMPL...EMPLOYEE;

commit;

Параметризованный запрос на выборку данных

begin distributed transaction;

declare @first_name as varchar(32);

set @first_name='Scott';

select * from IB_EMPL...EMPLOYEE empl where empl.FIRST_NAME=@first_name;

commit;

Модификация данных

При выполнении SQL-запросов INSERT, UPDATE и DELETE, MSSQL пытается стартовать вложенную транзакцию. Если транзакция уже активна, то провайдер вернет ошибку. Поэтому, перед выполнением таких запросов нужно выполнить команду "SET XACT_ABORT ON", или вообще отказаться от явного управления транзакциями - определив в строке подключения "auto_commit=true".

Вставка нового ряда

set xact_abort on;

begin distributed transaction;

insert into IB_EMPL...COUNTRY (COUNTRY,CURRENCY) values ('Mars','Snickers');

commit transaction;

Изменение ряда

set xact_abort on;

begin distributed transaction;

declare @country varchar(32);

set @country='Mars';

update IB_EMPL...COUNTRY set CURRENCY='Beer' where COUNTRY=@country

commit;

Удаление ряда

set xact_abort on;

begin distributed transaction;

declare @country varchar(32);

set @country='Mars';

delete from IB_EMPL...COUNTRY where COUNTRY=@country commit;

Вызов хранимой процедуры

Внимание. MS SQL для вызова хранимых процедур всегда использует квотированные имена. Используйте gfix для перевода базы данных employee.gdb в третий диалект.

Получение результата работы хранимой процедуры в виде множества (odbc_call_sp=0)

begin distributed transaction;

declare @dept_head char(3);

set @dept_head='100';

exec IB_EMPL...SUB_TOT_BUDGET @dept_head

{call IB_EMPL...SUB_TOT_BUDGET(@dept_head)};

commit;

Получение результата работы хранимой процедуры через OUT-параметры. Использовался отдельный linked-server IB_EMPL_1, у которого установлен параметр odbc_call_sp=1

begin distributed transaction;

declare @dept_head char(3);
declare @tot_b numeric(15,2);
declare @avg_b numeric(15,2);
declare @min_b numeric(15,2);
declare @max_b numeric(15,2);

set @dept_head='100';

exec IB_EMPL_1...SUB_TOT_BUDGET @dept_head,@tot_b output,@avg_b output,@min_b output, @max_b output
print 'tot_b='+convert(varchar(32),@tot_b);
print 'avg_b='+convert(varchar(32),@avg_b);
print 'min_b='+convert(varchar(32),@min_b);
print 'max_b='+convert(varchar(32),@max_b);

{call IB_EMPL_1...SUB_TOT_BUDGET(@dept_head,@tot_b output,@avg_b output,@min_b output, @max_b output)};
print 'tot_b='+convert(varchar(32),@tot_b);
print 'avg_b='+convert(varchar(32),@avg_b);
print 'min_b='+convert(varchar(32),@min_b);
print 'max_b='+convert(varchar(32),@max_b);

commit;

На заметку. При использовании IBProvider v3, вы можете использовать автоматическое определение способа получения результатов хранимой процедуры. Для этого нужно установить odbc_call_sp=2.

Выполнение запросов к связанному серверу через ADO

Выполнение запросов из "SQL Query Analyzer" если и представляет какой-либо интерес, то только из разряда теоретических. Реальную пользу можно получить только, если мы сможем работать с данными InterBase через MSSQL из реальных приложений.

Для проведения экспериментов мы использовали компоненты ADO и Windows Script Host. И выяснили следующее: