Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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.01 c
11-61994
FOZi
2003-04-05 07:39
2003.12.19
Многопоточное приложение


4-62335
Narayan
2003-10-25 19:00
2003.12.19
PopupMenu


3-61917
mOOx_
2003-11-26 13:41
2003.12.19
Что такое со вставкой во View?


7-62309
Nikk
2003-10-13 19:06
2003.12.19
Передача данных


14-62190
Kinder
2003-11-27 19:27
2003.12.19
Соединения ABC





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский