Получение набора данных

Материал из K3-Macro
Макро | Унифицированная работа с базами данных | Подключение к базе данных | Получение набора данных | Информация о наборе данных | Навигация по набору данных | Получение данных из набора | Модификация данных | Транзакции | Вспомогательные функции | Заполнения массива набором записей

Для получения набора данных необходимо использовать строку в формате SQL. Синтаксис и правила использования запросов SQL определяется выбранным Вами поставщиком данных.

adbOpen[править | править код]

INT adbOpen(INT <idConn>, STRING <SQLString>|string ARRAY <SQLArray> [,INT <N1>[, INT <N2>]])

Функция adbOpen открывает набор записей из базы данных с номером <idConn> в соответствии с параметрами, заданными строкой <SQLString>. Однако, поскольку в системе K3 строка не может содержать больше 255 символов, а строка с SQL запросом может быть и длиннее, то можно воспользоваться альтернативным синтаксисом функции и использовать строковый массив <SQLArray>.

Функция возвращает номер, однозначно идентифицирующий набор записей. В случае ошибки, функция возвращает ноль. На одном соединении можно получить несколько наборов.

В случае использования массива <SQLArray> есть варианты:

1. Есть только массив – (параметры <N1> и <N2> отсутствуют). Из всего массива будет формироваться единая строка запроса.

2. Есть массив и только один <N1> – из массива, начиная с первого элемента до <N1>–го элемента будет формироваться единая строка запроса.

3. Есть массив и заданы <N1> и <N2> — из массива, начиная с элемента <N1> и до элемента <N2> будет формироваться единая строка запроса.

Например:

Defarr SQLArray[4];
SQLArray[1]="SELECT ";
SQLArray[2]="* FROM ";
SQLArray[3]="Orders";
SQLArray[4]="Что–то другое”;
szSrc="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\\NWIND.MDB";
Condcon=adbCon(szSrc);
idRS=adbOpen(Condcon,SQLArray,3);
aaa=adbRecCount(idRS);  // получаем количество записей
=aaa;
5
idRs=adbClose(idRs);

После завершения работы с набором данных, необходимо закрыть набор. Это освободит ресурсы системы.

adbClose[править | править код]

INT adbClose(INT <idRs>);

Функция adbClose закрывает набор записей с номером <idRs>. Функция возвращает ноль в случае успешного завершения и <idRs> в случае ошибки.

Пример:

ConStr="Provider=Microsoft.Jet.OLEDB.4.0";
ConStr=ConStr+"Data Source=d:\\nwind.mdb";
MyConn=adbConn(ConStr);
=MyConn;
2624536
SQLStr="SELECT * FROM Customers WHERE CompanyName='Ernst Handel'";
MyRs=adbOpen(MyConn,SQLStr);
=MyRs
8415146
MyRs=adbClose(MyRs); 
=MyRs
0
MyConn=adbdiscon(aaa);
=MyConn;
0

В K3 есть возможность использования хранимых процедур. Хранимые процедуры являются важным элементом в организации клиент–серверных баз данных. Определение хранимой процедуры зависит от конкретного поставщика базы данных. Поскольку провайдеры баз данных могут быть разными, то под термином «хранимая процедура» будет пониматься так же и параметризированный запрос (MSAccess).

adbStored[править | править код]

INT adbStored(INT <idConn>, STRING <ProcName>[, string ARRAY <SQLArray>,INT <N1>,INT <N2>])

Функция adbStored осуществляет выполнение хранимых процедур. Хранимые процедуры являются важным элементом в организации клиент – серверных баз данных. Входными параметрами функции adbStored являются:

<idConn> — номер подключения
<ProcName> — имя хранимой процедуры
<SQLArray> — массив, содержащий параметры процедуры
<N1> — номер элемента массива, в котором находится первый параметр
<N2> — число параметров

Если не задан массив – выполняется процедура, не имеющая параметров.

Массив параметров должен иметь фиксированную структуру. Это последовательные пары, где первый элемент определяет тип параметра, второй значение. Например:

SQLArray[1]=3;
SQLArray[2]=100;
SQLArray[4]=202;
SQLArray[5]="Hello";

Возможные типы параметров указаны в таблице (см. ниже).

Функцией можно пользоваться при наличии K3Ado30.dll, созданной не ранее апреля 2006г.

Вот несколько моментов, определяющих необходимость использования хранимых процедур:

  • Модульное проектирование. Все приложения, имеющие доступ к одной базе данных совместно используют одни и те же модули, что сокращает размер кода на стороне клиента.
  • Централизованная поддержка. Когда процедура модифицируется, изменения автоматически распространяются на все приложения без необходимости перекомпиляции клиентов.
  • Дополнительная функциональность. Доступ к данным, который не может быть достигнут средствами самого SQL, может осуществиться одной или несколькими хранимыми процедурами. (Наличие условных переходов, циклов и других языковых средств)

Примеры хранимых процедур для различных СУБД:

Access:

PARAMETERS a Long;
SELECT aaa.qqq*a
FROM aaa;

Здесь каждое поле выборки умножается на число, заданное как параметр.


MS SQL Server 2000

 CREATE PROCEDURE CustOrdersDetail @OrderID int
 AS
 SELECT ProductName,
     UnitPrice=ROUND(Od.UnitPrice, 2),
     Quantity,
     Discount=CONVERT(int, Discount * 100), 
     ExtendedPrice=ROUND(CONVERT(money, Quantity * _
       (1 - Discount) * Od.UnitPrice), 2)
 FROM Products P, [Order Details] Od
 WHERE Od.ProductID = P.ProductID and Od.OrderID = @OrderID
 GO

Здесь выполняются некоторая выборка с расчётом, зависящая от идентификатора OrderID.


FireBird (InterBase)

 BEGIN
   i = 1;
   WHILE (i &lt;= 5) DO
   BEGIN
   SELECT language_req[:i] FROM joB</nowiki>
      WHERE ((job_code = :code) AND (job_grade = :grade) AND _
        (job_country = :cty)
             AND (language_req IS NOT NULL))
      INTO :languages;
      IF (languages = ' ') THEN  /* Prints 'NULL' instead of blanks */
        languages = 'NULL';         
     i = i +1;
     SUSPEND;
  END
 END

Здесь в зависимости от CODE, GRADE и CTY осуществляется выборка в цикле.

Несмотря на различный синтаксис, можно выполнить процедуры, задавая имя процедуры и сформировав набор параметров.

Типы параметров унифицированы. Их численное значение можно найти в MSDN.

Выдержка для некоторых типов представлена в таблице. (В таблице представлено оригинальное английское описание типа и упрощенный перевод.)


Некоторые типы параметров для хранимых процедур
Название типа
Значение
Описание
adEmpty
0

Значение не задано – пустое значение

This data type indicates that no value was specified (DBTYPE_EMPTY).

adSmallInt
2

Двухбайтное целое число со знаком

This data type indicates a two-byte (16-bit) signed integer (DBTYPE_I2).

adInteger
3

Четырехбайтное целое число со знаком

This data type indicates a four-byte (32-bit) signed integer (DBTYPE_I4).

adSingle
4

Четырехбайтное число с плавающей точкой одинарной точности

This data type indicates a four-byte (32-bit) single precision IEEE floating point number (DBTYPE_R4).

adDouble
5

Восьмибайтное число с плавающей точкой двойной точности

This data type indicates an eight-byte (64-bit) double precision IEEE floating point number (DBTYPE_R8).

adCurrency
6

Денежная единица. Денежная единица – тип данных с фиксированной точкой и четырьмя знаками после точки. Представляет собой восьмибайтное знаковое целое, умноженное на 1000. Этот тип данных не поддерживается провайдером OLE DB.

A data type indicates a currency value (DBTYPE_CY). Currency is a fixed-point number with 4 digits to the right of the decimal point. It is stored in an 8-byte signed integer scaled by 10000. This data type is not supported by the OLE DB Provider.

adDate
7

Дата и время. Хранится, как число двойной точности, целая часть которого – число дней от 30 декабря 1899 года, а дробная часть – пошедшая часть дня. Этот тип данных не поддерживается провайдером OLE DB.

This data type indicates a date value stored as a Double, the whole part of which is the number of days since December 30, 1899, and the fractional part of which is the fraction of a day. This data type is not supported by the OLE DB Provider.

adBSTR
8

Строка Unicode, заканчивающаяся символом с кодом 0. Этот тип данных не поддерживается провайдером OLE DB.

This data type indicate a null-terminated Unicode character string (DBTYPE_BSTR). This data type is not supported by the OLE DB Provider.

adIDispatch
9

Указатель на интерфейс IDispatch OLE объекта. Этот тип данных не поддерживается провайдером OLE DB.

This data type indicates a pointer to an IDispatch interface on an OLE object (DBTYPE_IDISPATCH). This data type is not supported by the OLE DB Provider.

adError
10

32-х битный код ошибки. Этот тип данных не поддерживается провайдером OLE DB.

This data type indicates a 32-bit error code (DBTYPE_ERROR). This data type is not supported by the OLE DB Provider.

adBoolean
11

Булево значение. Этот тип данных не поддерживается провайдером OLE DB.

This data type indicates a Boolean value (DBTYPE_BOOL). This data type is not supported by the OLE DB Provider.

adVariant
12

Автоматический произвольный тип. Этот тип данных не поддерживается провайдером OLE DB.

This data type indicates an automation variant (DBTYPE_VARIANT). This data type is not supported by the OLE DB Provider.

adIUnknown
13

Указатель на интерфейс IUnknown OLE объекта. Этот тип данных не поддерживается провайдером OLE DB.

This data type indicates a pointer to an IUnknown interface on an OLE object (DBTYPE_IUNKNOWN). This data type is not supported by the OLE DB Provider.

adDecimal
14

Число с заданной точностью.

This data type indicates numeric data with a fixed precision and scale (DBTYPE_DECIMAL).

adTinyInt
16

Однобайтное целое число со знаком. Этот тип данных не поддерживается провайдером OLE DB.

This data type indicates a single -byte (8-bit) signed integer (DBTYPE_I1). This data type is not supported by the OLE DB Provider.

adUnsignedTinyInt
17

Однобайтное целое число без знака. Этот тип данных не поддерживается провайдером OLE DB.

This data type indicates a single-byte (8-bit) unsigned integer (DBTYPE_UI1). This data type is not supported by the OLE DB Provider.

adUnsignedSmallInt
18

Двухбайтное целое число без знака. Этот тип данных не поддерживается провайдером OLE DB.

This data type indicates a two-byte (16-bit) unsigned integer (DBTYPE_UI2). This data type is not supported by the OLE DB Provider.

adUnsignedInt
19

Четырехбайтное целое число без знака. Этот тип данных не поддерживается провайдером OLE DB.

This data type indicates a four-byte (32-bit) unsigned integer (DBTYPE_UI4). This data type is not supported by the OLE DB Provider.

adBigInt
20

Восьмибайтовое целое число со знаком. Этот тип данных не поддерживается провайдером OLE DB.

This data type indicates an eight-byte (64-bit) signed integer (DBTYPE_I8). This data type is not supported by the OLE DB Provider.

adUnsignedBigInt
21

Восьмибайтное целое число без знака. Этот тип данных не поддерживается провайдером OLE DB.

This data type indicates an eight-byte (64-bit) unsigned integer (DBTYPE_UI8). This data type is not supported by the OLE DB Provider.

adGUID
72

Глобальный уникальный идентификатор GUID. Этот тип данных не поддерживается провайдером OLE DB.

This data type indicates a globally unique identifier or GUID (DBTYPE_GUID). This data type is not supported by the OLE DB Provider.

adBinary
128

Двоичные данные фиксированной длины.

This data type indicates fixed-length binary data (DBTYPE_BYTES).

adChar
129

Строка символов.

This data type indicates a character string value (DBTYPE_STR).

adWChar
130

Строка символов Unicode, заканчивающаяся символом с кодом 0. Этот тип данных не поддерживается провайдером OLE DB.

This data type indicates a null-terminated Unicode character string (DBTYPE_WSTR). This data type is not supported by the OLE DB Provider.

adNumeric
131

Число, у которого точность и диапазон величин жестко заданы.

This data type indicates numeric data where the precision and scale are exactly as specified (DBTYPE_NUMERIC).

adUserDefined
132

Пользовательский тип данных. Этот тип данных не поддерживается провайдером OLE DB.

This data type indicates user-defined data (DBTYPE_UDT). This data type is not supported by the OLE DB Provider.

adDBDate
133

Дата в формате OLE DB.

This data type indicates an OLE DB date structure (DBTYPE_DATE).

adDBTime
134

Время в формате OLE DB.

This data type indicates an OLE DB time structure (DBTYPE_TIME).

adDBTimeStamp
135

Тип данных для указания интервала времени в формате OLE DB.

This data type indicates an OLE DB timestamp structure (DBTYPE_TIMESTAMP).

adVarChar
200

Строка символов произвольной длины.

This data type indicates variable-length character data (DBTYPE_STR).

adLongVarChar
201

Длинная строка символов.

This data type indicates a long string value.

adVarWChar
202

Строка символов в формате Unicode. Этот тип данных не поддерживается провайдером OLE DB.

This data type indicates a Unicode string value. This data type is not supported by the OLE DB Provider.

adLongVarWChar
203

Длинная строка символов в формате Unicode. Этот тип данных не поддерживается провайдером OLE DB.

This data type indicates a long Unicode string value. This data type is not supported by the OLE DB Provider.

adVarBinary
204

Двоичные данные произвольной длины.

This data type indicates variable-length binary data (DBTYPE_BYTES).

adLongVarBinary
205

Длинные двоичные данные.

This data type indicates a long binary value.

Примеры выполнения рассмотрим на примере параметризованных запросов в MSAccess.

Пусть в какой-либо базе данных 3.mdb есть таблица:

aaa
qqq
sss
1231
aaaa
45
bbbb
77
cccc
89
dddd

Формируем запросы:


«Запрос1» – без параметров:

SELECT aaa.qqq

FROM aaa;

Выполним:

szSrc="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\\3.MDB";
Condcon=adbCon(szSrc);
idRS=adbStored(Condcon,"Запрос1");
=idRS;
9511432
aaa=adbRecCount(idRS); // Определяем количество записей
=aaa;
4
adbMoveFirst(idRS); // Идем на первую запись
=adbGetValue(idRS,0); // Читаем значение нулевого поля
1231
adbMoveNext(idRS); // Идем на следующую запись 
=adbGetValue(idRS,0); // Читаем значение нулевого поля
45
adbMoveNext(idRS); // Идем на следующую запись
=adbGetValue(idRS,); // Читаем значение нулевого поля0
77
idRs=adbClose(idRs); // Закрываем набор записей 
adbDisCon(Condcon); // Закрываем соединение


«Запрос3» – С параметром, на который умножается результат выборки в каждом элементе:

PARAMETERS a Long; 
SELECT aaa.qqq*a
FROM aaa;

Выполним:

Defarr SQLArray[8];
SQLArray[1]=3;
SQLArray[2]=100;
szSrc="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\\3.MDB";
Condcon=adbCon(szSrc);
idRS=adbStored(Condcon,"Запрос3",SQLArray,1,1);
=idRS;
9511432
aaa=adbRecCount(idRS); // Определяем количество записей
=aaa;
4
adbMoveFirst(idRS); // Идем на первую запись
=adbGetValue(idRS,0); // Читаем значение нулевого поля
123100
adbMoveNext(idRS); // Идем на следующую запись
=adbGetValue(idRS,0); // Читаем значение нулевого поля
4500
adbMoveNext(idRS); // Идем на следующую запись 
=adbGetValue(idRS,); // Читаем значение нулевого поля0
7700
idRs=adbClose(idRs); // Закрываем набор записей 
adbDisCon(Condcon); // Закрываем соединение


«Запрос4» – С текстовым параметром, который конкатенируется с результатом выборки в каждом элементе:

PARAMETERS InStr Text (255);
SELECT aaa.sss+InStr
FROM aaa;

Выполним:

Defarr SQLArray[8];
SQLArray[4]=202;
SQLArray[5]="Hello";

szSrc="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\\3.MDB";
Condcon=adbCon(szSrc);
idRS=adbStored(Condcon,"Запрос4",SQLArray,4,1);
=idRS;
9511432
aaa=adbRecCount(idRS); // Определяем количество записей
=aaa;
4
adbMoveFirst(idRS); // Идем на первую запись
=adbGetValue(idRS,0); // Читаем значение нулевого поля
“aaaaHello”
adbMoveNext(idRS); // Идем на следующую запись
=adbGetValue(idRS,0); // Читаем значение нулевого поля
“bbbbHello”
adbMoveNext(idRS); // Идем на следующую запись
=adbGetValue(idRS,); // Читаем значение нулевого поля
“ccccHello”
idRs=adbClose(idRs); // Закрываем набор записей
adbDisCon(Condcon); // Закрываем соединение

Примеры работы с другими типами систем управления базами данных (СУБД) выглядят аналогично. Единственное, что необходимо помнить – это о специфике конкретной СУБД не только в контексте языковых средств, но так же и в контексте используемых типов данных (особенно это касается типов параметров).

В качестве помощи определения поддерживаемых типов данных можно порекомендовать использование редактора «K3Talk». Первые две колонки дают название типа и его числовое значение (см [ рисунки]).

Типы данных для InterBase(FireBird)
Типы данных для MS SQL Server 2000
Типы данных для MS Access

Макро | Унифицированная работа с базами данных | Подключение к базе данных | Получение набора данных | Информация о наборе данных | Навигация по набору данных | Получение данных из набора | Модификация данных | Транзакции | Вспомогательные функции | Заполнения массива набором записей