English version Russian version

Подключение базы данных 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". Отметьте элементы
    • Dynamic Parameters
    • Allow InProcess
    Закройте диалог, нажав "OK".
  8. Перейдите на вкладку "Server Options". Отметьте элементы
    • Data Access
    • RPC
    • RPC Out
    • Use Remote Collation
    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. И выяснили следующее:

  • Не удалось выполнить запрос к хранимой процедуре с использованием параметров в тексте запроса. Значения IN-параметров нужно подставлять прямо в текст.
  • Как следствие предыдущего пункта - единственным способом получения результатов из хранимой процедуры является результирующее множество ( odbc_call_sp=0). То есть хранимая процедура должна иметь ключевой слово 'SUSPEND'.


Забобрить эту страницу! Добавить на Memori.ru Mr Wong Добавить в закладки МоёМесто.ru Добавить на Rumarkz Добавить на Rucity Digg It Reddit Technorati Del.icio.us Google Bookmarks Slashdot StumbleUpon Yahoo MyWeb Все


Назад Вперед