RDO: извлечение данных из временных таблиц, созданных хранимой процедурой


Аннотация


Обычно хранимые процедуры используют временные таблицы для построения результирующего набора. При использовании RDO (удаленный объект данных) для вызова такого типа хранимой процедуры оно будет выглядеть так, как если бы RDO не возвращал никаких результатов, но только для пустого результирующего набора без ошибок. Проверка такого же запроса с помощью программы Microsoft SQL Server версии 6,0 ISQL выдает ожидаемые результаты, что приводит к помнению RDO от чтения этих временных таблиц. Это не ограничение RDO, и RDO может получать данные из временной таблицы, созданной в хранимой процедуре. Однако библиотека доступа к данным не может создать ПРОКРУЧИВАЕМый курсор во временной таблице, созданной в хранимой процедуре. Временные таблицы, созданные в хранимой процедуре, УНИЧТОЖАются, когда завершается Эта хранимая процедура. Если таблица отсутствует, Библиотека доступа к данным не может открыть прокручиваемый курсор и вернуться к нему, если требуется следующий набор строк или когда пользователь попытается обновить, вставить или удалить его. ISQL не открывает указатель мыши и не использует библиотеку курсоров, поэтому она просто считывает данные из канала, по одной строке, только для чтения, а также по умолчанию (это стандартный режим для dblib, так что многие люди используются для работы таким образом). Хорошая новость в том, что RDO также может сделать это. Просто нужно сообщить SQL Server о том, что во временной таблице не будет открываться курсор на стороне сервера. Для этого нужно задать для свойства RowsetSize значение 1 и открыть результирующий набор как переадресованный только для чтения (как и в случае с ISQL). В RDO используется 100 по умолчанию для RowsetSize, так как это оптимальный параметр для большинства операций с курсором, а если задано значение "больше 1", драйвер ODBC SQL Server "может попытаться создать серверный курсор, так как в наборах строк для файловой системы FAT требуется возможность прокрутки и, возможно, обновления. Следует помнить, что использование курсоров сильно отличается от значения только для чтения, а размер набора строк, равный 1, приближается к тому, что позволяет получить данные обратно клиенту. Для поддержки операций, выполняемых курсорами (например, прокрутки в обратном направлении, выполнения позиционированных обновлений и т. д.), источник данных будет находиться в течение всего времени, когда курсор будет открыт. RDO может работать в режиме курсора или в режиме "Fire шланга", что позволяет вам выполнять любые необходимые функции.

Дополнительная информация


Пример программы

Действие 1: создание хранимой процедуры

Эта хранимая процедура просто создает временную таблицу с именем "#temptest, заполняя ее всеми строками из таблицы authors в базе данных Pubs.
  1. Откройте программу SQL Server 6,0 ISQL и измените базу данных по умолчанию на Pubs.
  2. Вставьте следующий код в окно запроса и нажмите кнопку выполнить запрос или нажмите клавиши CTRL + E, чтобы выполнить код Transact-SQL.
       create proc TempTableTest as   select * into #testtemp from authors   select * from #testtemp
  3. В приведенном ниже сообщении с подтверждением отображается сообщение "Эта команда не возвернула данные, но не вернула строки", указывающий на то, что код Transact-SQL правильно создал сохраненную процедуру.

Действие 2: создание кода Visual Basic

Следующий код Visual Basic открывает подключение к серверу, создает подготовленную инструкцию для хранимой процедуры, задает для результирующего набора значение 1 и открывает результирующий набор как переадресованный только для чтения. Когда вы запускаете этот код, в окне отладки отображаются все идентификаторы и фамилии автора. В этом примере кода используется подключение ODBC без данных, поэтому вам не нужно настраивать DSN (имя источника данных) с помощью средства администрирования ODBC.
  1. Начните новый проект в Visual Basic. По умолчанию создается форма Form1.
  2. Добавление кнопки (Command1) и списка (list1) в форму Form1.
  3. Вставьте следующий код в раздел общих объявлений на Form1:
       Private Sub Command1_Click()     Dim cn As rdoConnection     Dim ps As rdoPreparedStatement     Dim rs As rdoResultset     Dim strConnect As String     strConnect = "driver={SQL Server};server=myserver;" & _       "database=pubs;uid=<username>;pwd=<strong password>"     rdoEnvironments(0).CursorDriver = rdUseOdbc     Set cn = rdoEnvironments(0).OpenConnection( _       dsName:="", _       Prompt:=rdDriverNoPrompt, _       ReadOnly:=False, _       Connect:=strConnect)     Set ps = cn.CreatePreparedStatement( _       Name:="ps1", _       SqlString:="{call TempTableTest }")     ps.RowsetSize = 1     Set rs = ps.OpenResultset( _       Type:=rdOpenForwardOnly, _       LockType:=rdConcurReadOnly)     While Not rs.EOF       list1.AddItem rs(0) & ", " & rs(1)       rs.MoveNext     Wend   End Sub
  4. Обратите внимание, что в методе OpenConnection необходимо изменить параметры базы данных, UID и PWD.
  5. Запустите программу или нажмите клавишу F5.
  6. Нажмите кнопку Command1, чтобы выполнить сохраненную процедуру и отобразить результаты в элементе управления списком.

Ссылки


Полную документацию можно найти в разделе "Microsoft ODBC 2,0
Справочные материалы и руководство по SDK для программистов. Руководство по Hitchhiker на Visual Basic и SQL Server, Microsoft Press. ISBN: 1-55615-906-4.).