有关delphi的odbc编程

zwk_9 2009-07-13 10:59:20
加精
想设计这样一个软件:系统中只对ODBC编程,
当在用户机器上安装的时候,自动判断其操作系统中安装了何种数据库,并在相应的数据库引擎中创建数据库
我只知道delphi注册ODBC的方法,但是对整个思路很迷茫,知道的或有相应经验的提供一下思路啊~~~
...全文
417 29 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
29 条回复
切换为时间正序
请发表友善的回复…
发表回复
maxinglu1 2010-09-25
  • 打赏
  • 举报
回复
学习了
qq363985833 2010-05-20
  • 打赏
  • 举报
回复
ODBC不是直接在系统配置就可以了么
叁宝 2010-04-13
  • 打赏
  • 举报
回复
学习了
ZZTea 2010-01-15
  • 打赏
  • 举报
回复
强!!
jackiexzx 2009-08-07
  • 打赏
  • 举报
回复
好像没有检测到*.mdf
天才OR努力 2009-07-30
  • 打赏
  • 举报
回复
进来学习一下!
meizizh 2009-07-23
  • 打赏
  • 举报
回复
来学习了,谢谢
wfl568 2009-07-14
  • 打赏
  • 举报
回复
Mark
超维电脑科技 2009-07-14
  • 打赏
  • 举报
回复
关注。
Tomzzu 2009-07-14
  • 打赏
  • 举报
回复
好贴, 边学边顶
sushou2009 2009-07-14
  • 打赏
  • 举报
回复
进来学习~
zouyx317 2009-07-14
  • 打赏
  • 举报
回复
学习了
1楼很强大.
liupanpan 2009-07-14
  • 打赏
  • 举报
回复
提供一下思路
sparklerl 2009-07-14
  • 打赏
  • 举报
回复
Mark

好东西

thx
b330225 2009-07-14
  • 打赏
  • 举报
回复
见识了。学习
faguan 2009-07-14
  • 打赏
  • 举报
回复
顶一下,学习学习!
tnwsh 2009-07-13
  • 打赏
  • 举报
回复
强烈关注!
dinoalex 2009-07-13
  • 打赏
  • 举报
回复
不错不错
winstonbonaparte 2009-07-13
  • 打赏
  • 举报
回复
上面的程序在我电脑上的运行结果:
Button1Click:
SQL Server
Microsoft Access Driver (*.mdb)
Microsoft Text Driver (*.txt; *.csv)
Microsoft Excel Driver (*.xls)
Microsoft dBase Driver (*.dbf)
Microsoft Paradox Driver (*.db )
Microsoft Visual FoxPro Driver
Microsoft FoxPro VFP Driver (*.dbf)
Microsoft dBase VFP Driver (*.dbf)
Microsoft Access-Treiber (*.mdb)
Microsoft Text-Treiber (*.txt; *.csv)
Microsoft Excel-Treiber (*.xls)
Microsoft dBase-Treiber (*.dbf)
Microsoft Paradox-Treiber (*.db )
Microsoft Visual FoxPro-Treiber
Driver do Microsoft Access (*.mdb)
Driver da Microsoft para arquivos texto (*.txt; *.csv)
Driver do Microsoft Excel(*.xls)
Driver do Microsoft dBase (*.dbf)
Driver do Microsoft Paradox (*.db )
Driver para o Microsoft Visual FoxPro
Microsoft ODBC for Oracle
MySQL ODBC 3.51 Driver

Button2Click:
MS Access Database/Microsoft Access Driver (*.mdb)
Excel Files/Microsoft Excel Driver (*.xls)
dBASE Files/Microsoft dBase Driver (*.dbf)
_iamp/MySQL ODBC 3.51 Driver
Xtreme Sample Database 2005 CHS/Microsoft Access Driver (*.mdb)
QT_Flight32/Microsoft Access Driver (*.mdb)
LocalServer/SQL Server
winstonbonaparte 2009-07-13
  • 打赏
  • 举报
回复
再给你看个例子吧

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.
加载更多回复(9)

2,507

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 数据库相关
社区管理员
  • 数据库相关社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧