Получение набора данных
Для получения набора данных необходимо использовать строку в формате 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 <= 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.
Выдержка для некоторых типов представлена в таблице. (В таблице представлено оригинальное английское описание типа и упрощенный перевод.)
|
|
|
---|---|---|
|
|
Значение не задано – пустое значение This data type indicates that no value was specified (DBTYPE_EMPTY). |
|
|
Двухбайтное целое число со знаком This data type indicates a two-byte (16-bit) signed integer (DBTYPE_I2). |
|
|
Четырехбайтное целое число со знаком This data type indicates a four-byte (32-bit) signed integer (DBTYPE_I4). |
|
|
Четырехбайтное число с плавающей точкой одинарной точности This data type indicates a four-byte (32-bit) single precision IEEE floating point number (DBTYPE_R4). |
|
|
Восьмибайтное число с плавающей точкой двойной точности This data type indicates an eight-byte (64-bit) double precision IEEE floating point number (DBTYPE_R8). |
|
|
Денежная единица. Денежная единица – тип данных с фиксированной точкой и четырьмя знаками после точки. Представляет собой восьмибайтное знаковое целое, умноженное на 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. |
|
|
Дата и время. Хранится, как число двойной точности, целая часть которого – число дней от 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. |
|
|
Строка 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. |
|
|
Указатель на интерфейс 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. |
|
|
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. |
|
|
Булево значение. Этот тип данных не поддерживается провайдером OLE DB. This data type indicates a Boolean value (DBTYPE_BOOL). This data type is not supported by the OLE DB Provider. |
|
|
Автоматический произвольный тип. Этот тип данных не поддерживается провайдером OLE DB. This data type indicates an automation variant (DBTYPE_VARIANT). This data type is not supported by the OLE DB Provider. |
|
|
Указатель на интерфейс 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. |
|
|
Число с заданной точностью. This data type indicates numeric data with a fixed precision and scale (DBTYPE_DECIMAL). |
|
|
Однобайтное целое число со знаком. Этот тип данных не поддерживается провайдером 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. |
|
|
Однобайтное целое число без знака. Этот тип данных не поддерживается провайдером 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. |
|
|
Двухбайтное целое число без знака. Этот тип данных не поддерживается провайдером 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. |
|
|
Четырехбайтное целое число без знака. Этот тип данных не поддерживается провайдером 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. |
|
|
Восьмибайтовое целое число со знаком. Этот тип данных не поддерживается провайдером 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. |
|
|
Восьмибайтное целое число без знака. Этот тип данных не поддерживается провайдером 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. |
|
|
Глобальный уникальный идентификатор 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. |
|
|
Двоичные данные фиксированной длины. This data type indicates fixed-length binary data (DBTYPE_BYTES). |
|
|
Строка символов. This data type indicates a character string value (DBTYPE_STR). |
|
|
Строка символов 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. |
|
|
Число, у которого точность и диапазон величин жестко заданы. This data type indicates numeric data where the precision and scale are exactly as specified (DBTYPE_NUMERIC). |
|
|
Пользовательский тип данных. Этот тип данных не поддерживается провайдером OLE DB. This data type indicates user-defined data (DBTYPE_UDT). This data type is not supported by the OLE DB Provider. |
|
|
Дата в формате OLE DB. This data type indicates an OLE DB date structure (DBTYPE_DATE). |
|
|
Время в формате OLE DB. This data type indicates an OLE DB time structure (DBTYPE_TIME). |
|
|
Тип данных для указания интервала времени в формате OLE DB. This data type indicates an OLE DB timestamp structure (DBTYPE_TIMESTAMP). |
|
|
Строка символов произвольной длины. This data type indicates variable-length character data (DBTYPE_STR). |
|
|
Длинная строка символов. This data type indicates a long string value. |
|
|
Строка символов в формате Unicode. Этот тип данных не поддерживается провайдером OLE DB. This data type indicates a Unicode string value. This data type is not supported by the OLE DB Provider. |
|
|
Длинная строка символов в формате Unicode. Этот тип данных не поддерживается провайдером OLE DB. This data type indicates a long Unicode string value. This data type is not supported by the OLE DB Provider. |
|
|
Двоичные данные произвольной длины. This data type indicates variable-length binary data (DBTYPE_BYTES). |
|
|
Длинные двоичные данные. This data type indicates a long binary value. |
Примеры выполнения рассмотрим на примере параметризованных запросов в MSAccess.
Пусть в какой-либо базе данных 3.mdb есть таблица:
| |
---|---|
|
|
|
|
|
|
|
|
|
|
Формируем запросы:
«Запрос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». Первые две колонки дают название типа и его числовое значение (см [ рисунки]).