Форум: "Базы";
Текущий архив: 2003.12.19;
Скачать: [xml.tar.bz2];
ВнизКак узнать список драйверов ODBC с помощью SQLDrivers Найти похожие ветки
← →
alex-ran (2003-11-20 16:42) [0]Мастера! Вот собственно и вопрос, пробовал сам использовать эту функцию - но не знаю ни значений констант SQL_FETCH_NEXT, SQL_FETCH_FIRST, ни SQL_SUCCESS, SQL_SUCCESS_WITH_INFO, SQL_NO_DATA, SQL_ERROR, or SQL_INVALID_HANDLE, и не могу понять где искать их описания.
Ну и как получить EnvironmentHandle?
Помогите плиз.
← →
alex-ran (2003-11-26 15:34) [1]Мастера, подскажите, плиз, где ошибка в приведенном коде (результат выполнения SQL_ERROR), уже неделю по-всякому пробую и никак, думаю я неправильно описываю ф-цию SQLDrivers, опыта маловато, да и синтаксис Си мне незнаком
чтоб ее правильно описать из хелпа.
const
SQL_FETCH_FIRST = 2;
SQL_FETCH_NEXT = 1;
SQL_HANDLE_ENV=1;
SQL_NULL_HANDLE=0;
type
PByte=^Byte;
TSQLDrivers=function(EnvironmentHandle : LongWord; Direction : Word;
DriverDescription : PChar; BufferLength1 : Byte; var DescriptionLengthPtr : PByte;
DriverAttributes : PChar; BufferLength2 : Byte; var AttributesLengthPtr : PByte) : SmallInt ; stdcall;
TSQLAllocHandle=function(HandleType: Byte; InputHandle: LongWord;
var OutputHandlePtr: LongWord): SmallInt; stdcall;
procedure TForm1.Button1Click(Sender: TObject);
var
fnDrv: TSQLDrivers; //ф-ция нахождения драйверов ODBC
fnHnd: TSQLAllocHandle; //ф-ция нахождения EnvironmentHandle
hLib : LongWord; //адрес библиотеки ф-ций
fResult: Short; //результат выполнения SQLDrivers
DscDrivers, attrDrivers: PChar; //указатель на буфер для возврата описания и атрибутов драйвера
lDesc, lAttr : PByte; //число байтов возвращаемых в DscDrivers, attrDrivers
hEnvironment: LongWord; //значение EnvironmentHandle возвращаемое SQLAllocHandle
Direction : Word; //определяет где ищется следующее описание драйвера
begin
hLib:=LoadLibrary("odbc32.dll");
if (hLib<>NULL) then
begin
GetMem(DscDrivers, 51); GetMem(attrDrivers, 256);
@fnDrv := GetProcAddress(hLib, "SQLDrivers");
@fnHnd := GetProcAddress(hLib, "SQLAllocHandle");
fnHnd(SQL_HANDLE_ENV, SQL_NULL_HANDLE, hEnvironment);
Direction:=SQL_FETCH_FIRST;
fResult:=fnDrv(hEnvironment, Direction, DscDrivers, 51, lDesc, attrDrivers, 255, lAttr);
ShowMessage(IntToStr(fResult));
while fnDrv(hEnvironment, Direction, DscDrivers, 51, lDesc, attrDrivers, 255, lAttr)=0 do
begin
Memo1.Lines.Add(DscDrivers);
Direction:=SQL_FETCH_NEXT;
end
end;
FreeLibrary(hLib);
FreeMem(DscDrivers);
FreeMem(attrDrivers);
end;
← →
alex-ran (2003-11-27 14:32) [2]Если кого заинтересует вот решение проблемы:
Вызов SQLGetDiagRec сразу после SQLDrivers в поле SqlState возвратил значение HY010. Вот его расшифровка:
Function sequence error
(DM) The HandleType argument was SQL_HANDLE_DBC, and SQLSetEnvAttr has not been called to set the SQL_ODBC_VERSION environment attribute.
что в нашем случае говорит о неустановленном значении SQL_ODBC_VERSION в атрибутах окружения, что и приводило к неправильной отработке ф-ции SQLDrivers.
это можно посмотреть, отключив в проге
fResult:=fnSetA(hEnvironment, SQL_ATTR_ODBC_VERSION, Pointer(SQL_OV_ODBC3), 1);
и включив все вызовы fnDiag и fnDrv и посмотрев в отладчике значение sqlSt после первого вызова fnDrv
А вот собственно и окончательный вариант: (конечно можно многое оптимизировать, мусор еще не убрал :) )
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Memo1: TMemo;
Button2: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
const
SQL_FETCH_FIRST = 2;
SQL_FETCH_NEXT = 1;
SQL_HANDLE_ENV=1;
SQL_NULL_HANDLE=0;
SQL_HANDLE_DBC=2;
SQL_HANDLE_DESC=4;
SQL_HANDLE_STMT=3;
SQL_ATTR_ODBC_VERSION = 200;
SQL_OV_ODBC3 = 3;
SQL_OV_ODBC2 = 2;
type
SQLPOINTER=Pointer;
SQLHANDLE=LongInt;
SQLHENV=SQLHANDLE;
SQLPHENV=^SQLPHENV;
SQLUSMALLINT=Word;
SQLINTEGER=LongInt;
PSQLCHAR=PChar;
SQLSMALLINT=SmallInt;
PSQLSMALLINT=^SQLSMALLINT;
SQLRETURN=SQLSMALLINT;
PByte=^Byte;
{ TSQLDrivers=function(EnvironmentHandle : LongWord; Direction : Word;
DriverDescription : PChar; BufferLength1 : Byte; DescriptionLengthPtr : PByte;
DriverAttributes : PChar; BufferLength2 : Byte; AttributesLengthPtr : PByte) : SmallInt ; stdcall;}
{ TSQLAllocHandle=function(HandleType: Byte; InputHandle: LongWord;
var OutputHandlePtr: LongWord): SmallInt; stdcall;}
TSQLDrivers=function(EnvironmentHandle: SQLHENV; Direction: SQLUSMALLINT;
DriverDescription: PSQLCHAR; BufferLength1: SQLSMALLINT;
DescriptionLength1: PSQLSMALLINT; DriverAttributes: PSQLCHAR;
BufferLength2: SQLSMALLINT; AttributesLength2: PSQLSMALLINT): SQLRETURN; stdcall;
TSQLAllocHandle=function(HandleType: SQLSMALLINT; InputHandle: SQLHANDLE;
var OutputHandlePtr: SQLHANDLE): SQLRETURN; stdcall;
TSQLGetDiagRec=function(HandleType: SQLSMALLINT; Handle: SQLHANDLE; RecNumber: SQLSMALLINT;
Sqlstate: PSQLCHAR; var NativeError: SQLINTEGER; MessageText: PSQLCHAR;
BufferLength: SQLSMALLINT; var TextLength: SQLSMALLINT):SQLRETURN; stdcall;
TSQLSetEnvAttr=function(EnvironmentHandle: SQLHENV; Attribute: SQLINTEGER; Value: SQLPOINTER;
StringLength: SQLINTEGER): SQLRETURN; stdcall;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
fnDrv: TSQLDrivers; //ф-ция нахождения драйверов ODBC
fnHnd: TSQLAllocHandle; //ф-ция нахождения EnvironmentHandle
fnDiag: TSQLGetDiagRec;
fnSetA: TSQLSetEnvAttr;
hLib : LongWord; //адрес библиотеки ф-ций
fResult: SQLRETURN; //результат выполнения SQLDrivers
DscDrivers, attrDrivers, sqlSt, msgText : PSQLCHAR; //указатель на буфер для возврата описания и атрибутов драйвера
lDesc, lAttr : PSQLSMALLINT; //число байтов возвращаемых в DscDrivers, attrDrivers
hEnvironment: SQLHENV; //значение EnvironmentHandle возвращаемое SQLAllocHandle
Direction : SQLUSMALLINT; //определяет где ищется следующее описание драйвера
TLP : SQLSMALLINT;
NEP :SQLINTEGER;
begin
Memo1.Lines.Clear;
hLib:=LoadLibrary("odbc32.dll");
if (hLib<>NULL) then
begin
GetMem(DscDrivers, 51); GetMem(attrDrivers, 256); GetMem(sqlSt, 256); GetMem(msgText, 256);
New(lDesc); New(lAttr);
@fnDrv :=GetProcAddress(hLib, "SQLDrivers");
@fnHnd :=GetProcAddress(hLib, "SQLAllocHandle");
@fnDiag:=GetProcAddress(hLib, "SQLGetDiagRec");
@fnSetA:=GetProcAddress(hLib, "SQLSetEnvAttr");
fResult:=fnHnd(SQL_HANDLE_ENV, SQL_NULL_HANDLE, hEnvironment);
fResult:=fnSetA(hEnvironment, SQL_ATTR_ODBC_VERSION, Pointer(SQL_OV_ODBC3), 4);
// fResult:=fnDiag(SQL_HANDLE_ENV, hEnvironment, 1, sqlSt, NEP, msgText, 256, TLP);
Direction:=SQL_FETCH_FIRST;
// fResult:=fnDrv(hEnvironment, Direction, DscDrivers, 51, lDesc, attrDrivers, 255, lAttr);
// fResult:=fnDiag(SQL_HANDLE_ENV, hEnvironment, 1, sqlSt, NEP, msgText, 256, TLP);
// ShowMessage(IntToStr(fResult));
while fnDrv(hEnvironment, Direction, DscDrivers, 51, lDesc, attrDrivers, 255, lAttr)=0 do
begin
Memo1.Lines.Add(DscDrivers);
Direction:=SQL_FETCH_NEXT;
end
end;
FreeLibrary(hLib);
FreeMem(DscDrivers); FreeMem(attrDrivers);
FreeMem(sqlSt); FreeMem(msgText);
Dispose(lDesc); Dispose(lAttr);
end;
end.
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2003.12.19;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.008 c