2,497
社区成员
发帖
与我相关
我的任务
分享
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
function BreakList(const ANullTerminateText: array of Char): String;
end;
type
USHORT = Word;
SQLSMALLINT = SHORT;
SQLRETURN = SQLSMALLINT;
SQLINTEGER = Longint;
SQLHANDLE = SQLINTEGER;
SQLHENV = SQLHANDLE;
SQLUSMALLINT = USHORT;
SQLPCHAR = PChar;
const
// DLL名
odbc32 = 'odbc32.dll';
SQL_SUCCESS = 0;
SQL_SUCCESS_WITH_INFO = 1;
SQL_INVALID_HANDLE = -2;
SQL_ERROR = -1;
SQL_NO_DATA = 100;
SQL_NO_DATA_FOUND = SQL_NO_DATA;
SQL_FETCH_NEXT = 1;
SQL_FETCH_FIRST_USER = 31;
SQL_FETCH_FIRST_SYSTEM = 32;
SQL_FETCH_FIRST = 2;
SQL_MAX_DSN_LENGTH = 32;
// SQL_SUCCESS, SQL_SUCCESS_WITH_INFO, SQL_INVALID_HANDLE, SQL_ERROR
function SQLAllocEnv(var EnvironmentHandle: SQLHENV): SQLRETURN;
stdcall; external odbc32 name 'SQLAllocEnv';
function SQLFreeEnv(EnvironmentHandle: SQLHENV): SQLRETURN;
stdcall; external odbc32 name 'SQLFreeEnv';
// SQL_SUCCESS, SQL_SUCCESS_WITH_INFO, SQL_NO_DATA, SQL_ERROR, SQL_INVALID_HANDLE.
function SQLDrivers(
EnvironmentHandle: SQLHENV;
Direction: SQLUSMALLINT;
DriverDescription: SQLPCHAR;
BufferLength1: SQLSMALLINT;
var DescriptionLengthPtr: SQLSMALLINT;
DriverAttributes: SQLPCHAR;
BufferLength2: SQLSMALLINT;
var AttributesLengthPtr: SQLSMALLINT): SQLRETURN;
stdcall; external odbc32 name 'SQLDrivers';
// SQL_SUCCESS, SQL_SUCCESS_WITH_INFO, SQL_NO_DATA, SQL_ERROR, SQL_INVALID_HANDLE.
function SQLDataSources(
EnvironmentHandle: SQLHENV;
Direction: SQLUSMALLINT;
ServerName: SQLPCHAR;
BufferLength1: SQLSMALLINT;
var NameLength1Ptr: SQLSMALLINT;
Description: SQLPCHAR;
BufferLength2: SQLSMALLINT;
var NameLength2Ptr: SQLSMALLINT): SQLRETURN;
stdcall; external odbc32 name 'SQLDataSources';
var
Form1: TForm1;
implementation
{$R *.dfm}
function TForm1.BreakList(const ANullTerminateText: array of Char): String;
var
LStart: Integer;
LBuffer: array[0..255] of Char;
LText: String;
begin
LStart := 0;
LText := ANullTerminateText;
Result := LText;
Inc(LStart, Length(LText) + 1);
while (True) do
begin
FillChar(LBuffer, SizeOf(LBuffer), 0);
Move(ANullTerminateText[LStart], LBuffer, SizeOf(LBuffer));
LText := LBuffer;
Inc(LStart, Length(LText) + 1);
if (LText = '') then Break;
Result := Result + ',' + AnsiQuotedStr(LText, '"');
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
const
BUF_MAX = 1024;
var
LEnvironmentHandle: SQLHENV;
LDriverDescription: array[0..BUF_MAX] of Char;
LDescriptionLengthPtr: SQLSMALLINT;
LDriverAttributes: array[0..BUF_MAX] of Char;
AttributesLengthPtr: SQLSMALLINT;
LReturn: SQLRETURN;
LText: String;
begin
Memo1.Clear();
try
if (SQLAllocEnv(LEnvironmentHandle) = SQL_ERROR) then Exit;
try
FillChar(LDriverDescription, SizeOf(LDriverDescription), 0);
FillChar(LDriverAttributes, SizeOf(LDriverAttributes), 0);
LReturn := SQLDrivers(LEnvironmentHandle, SQL_FETCH_FIRST,
LDriverDescription, BUF_MAX + 1, LDescriptionLengthPtr,
LDriverAttributes, BUF_MAX + 1, AttributesLengthPtr);
while (LReturn <> SQL_NO_DATA_FOUND) do
begin
LText := String(LDriverDescription);// + '/' + BreakList(LDriverAttributes);
Memo1.Lines.Add(LText);
FillChar(LDriverDescription, SizeOf(LDriverDescription), 0);
FillChar(LDriverAttributes, SizeOf(LDriverAttributes), 0);
LReturn := SQLDrivers(LEnvironmentHandle, SQL_FETCH_NEXT,
LDriverDescription, BUF_MAX + 1, LDescriptionLengthPtr,
LDriverAttributes, BUF_MAX + 1, AttributesLengthPtr);
end;
finally
SQLFreeEnv(LEnvironmentHandle);
end;
except
on E:Exception do Memo1.Lines.Add(E.Message);
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
const
BUF_MAX = 1024;
var
LEnvironmentHandle: SQLHENV;
LServerName: array[0..SQL_MAX_DSN_LENGTH] of Char;
LNameLength1Ptr: SQLSMALLINT;
LDescription: array[0..BUF_MAX] of Char;
LNameLength2Ptr: SQLSMALLINT;
LReturn: SQLRETURN;
LText: String;
begin
Memo1.Clear();
try
if (SQLAllocEnv(LEnvironmentHandle) = SQL_ERROR) then Exit;
try
FillChar(LServerName, SizeOf(LServerName), 0);
FillChar(LDescription, SizeOf(LDescription), 0);
LReturn := SQLDataSources(LEnvironmentHandle, SQL_FETCH_FIRST,
LServerName, SQL_MAX_DSN_LENGTH + 1, LNameLength1Ptr,
LDescription, BUF_MAX + 1, LNameLength2Ptr);
while (LReturn <> SQL_NO_DATA_FOUND) do
begin
LText := String(LServerName) + '/' + BreakList(LDescription);
Memo1.Lines.Add(LText);
FillChar(LServerName, SizeOf(LServerName), 0);
FillChar(LDescription, SizeOf(LDescription), 0);
LReturn := SQLDataSources(LEnvironmentHandle, SQL_FETCH_NEXT,
LServerName, SQL_MAX_DSN_LENGTH + 1, LNameLength1Ptr,
LDescription, BUF_MAX + 1, LNameLength2Ptr);
end;
finally
SQLFreeEnv(LEnvironmentHandle);
end;
except
on E:Exception do Memo1.Lines.Add(E.Message);
end;
end;
end.