如何在程序中动态建立odbc连接的access数据库?(100分)

  • 主题发起人 主题发起人 lhy9988
  • 开始时间 开始时间
用一个TDatabase指定你的数据库即可,属性设置如下:

LogintPrompt —— False
DriverName —— 'MSACCESS'
DatabaseName —— 'MyDatabase'
Params.Clear;
Params.Add(('Database Name=DRIVE:/PATH/DATABASE.MDB');
Params.Add('User Name=XXXX');
Params.Add('Password=XXXX');
 
以下是在程序中动态创建ODBC的DSN数据源代码:
procedure TCreateODBCDSNfrm.CreateDSNBtnClick(Sender: TObject);
var
registerTemp : TRegistry;
bData : array[ 0..0 ] of byte;
begin
registerTemp := TRegistry.Create;
//建立一个Registry实例
with registerTemp do
begin
RootKey:=HKEY_LOCAL_MACHINE;
//设置根键值为HKEY_LOCAL_MACHINE
//找到Software/ODBC/ODBC.INI/ODBC Data Sources
if OpenKey('Software/ODBC/ODBC.INI
/ODBC Data Sources',True) then
begin //注册一个DSN名称
WriteString( 'MyAccess', 'Microsoft
Access Driver (*.mdb)' );
end
else
begin//创建键值失败
memo1.lines.add('增加ODBC数据源失败');
exit;
end;
CloseKey;
//找到或创建Software/ODBC/ODBC.INI
/MyAccess,写入DSN配置信息
if OpenKey('Software/ODBC/ODBC.INI
/MyAccess',True) then
begin
WriteString( 'DBQ', 'C:/inetpub/wwwroot
/test.mdb' );//数据库目录,连接您的数据库
WriteString( 'Description',
'我的新数据源' );//数据源描述
WriteString( 'Driver', 'C:/PWIN98/SYSTEM/
odbcjt32.dll' );//驱动程序DLL文件
WriteInteger( 'DriverId', 25 );
//驱动程序标识
WriteString( 'FIL', 'Ms Access;' );
//Filter依据
WriteInteger( 'SafeTransaction', 0 );
//支持的事务操作数目
WriteString( 'UID', '' );//用户名称
bData[0] := 0;
WriteBinaryData( 'Exclusive', bData, 1 );
//非独占方式
WriteBinaryData( 'ReadOnly', bData, 1 );
//非只读方式
end
else//创建键值失败
begin
memo1.lines.add('增加ODBC数据源失败');
exit;
end;
CloseKey;
//找到或创建Software/ODBC/ODBC.INI
/MyAccess/Engines/Jet
//写入DSN数据库引擎配置信息
if OpenKey('Software/ODBC/ODBC.INI
/MyAccess/Engines/Jet',True) then
begin
WriteString( 'ImplicitCommitSync', 'Yes' );
WriteInteger( 'MaxBufferSize', 512 );//缓冲区大小
WriteInteger( 'PageTimeout', 10 );//页超时
WriteInteger( 'Threads', 3 );//支持的线程数目
WriteString( 'UserCommitSync', 'Yes' );
end
else//创建键值失败
begin
memo1.lines.add('增加ODBC数据源失败');
exit;
end;
CloseKey;
memo1.lines.add('增加新ODBC数据源成功');
Free;
end;
end;

从中您应该可以学会如何更改需要的数据库。
 
今天在 BBS 上看到一篇用 VC++ 实现这个功能的方法,觉得 VC++ 在很多方面的确比 Delphi
要完善一些,难怪生命力如此旺盛。

发信人: HOTBABY (变幻之风), 信区: Visual
标 题: 用Visual C++程序实现设置ODBC数据源
发信站: 珞珈山水 (Thu Feb 15 20:35:30 2001), 转信

ODBC(Open Database Conectivity)即开放式数据库互联,作为Windows开放性结构的
一个重要部分已经为很多的Windows程序员所熟悉,ODBC的工作依赖于数据库制造商提供
的驱动程序,使用ODBC API的时候,Windows的ODBC管理程序,把数据库访问的请求传递
给正确的驱动程序,驱动程序再使用SQL语句指示DBMS完成数据库访问工作,因此,ODB
C的存在为我们开发应用数据库程序提供了非常强大的能力和灵活性。
---- 为了使ODBC能与数据库一起工作,必须把数据库注册到ODBC驱动程序管理器,这项
工作可以通过定义一个DSN或数据源名字来完成。通常,我们只能手动打开系统控制面板
,运行其中的ODBC数据源管理器,手工配置数据源,但是这项工作对用户而言过于复杂
,我们必须考虑用程序替用户完成这些配置工作。
---- 因此许多程序员在发布自己编写的数据库软件时候都希望能有一个优秀的安装程序
能够自动设置好ODBC数据源,虽然现在InstallShield等一些优秀的安装制作软件可以帮
助我们实现此类功能,但毕竟缺少灵活,程序员不能完全控制它,事实上,我们完全可
以自己编写一些程序实现此类功能,实现的方法有几种,一种办法是<font color = #ff0000><strong>用程序修改Window
s注册表,程序员可以用Windows API函数增改HKEY_LOCAL_MACHINE/Software/ODBC下的
ODBC.INI中的键值,这种方法比较烦琐</font></strong>。我现在推荐一种在程序中使用ODBC API的方法
,程序员可以在任何时候都可以用Visual C++编写的程序调用这些API函数来设置ODBC数
据源。
---- 下面我用MFC写一个程序来演示如何实现这个功能:
---- 首先,打开Visual C++,在File菜单上选New,然后选定MFC AppWizard(exe)类的
项目,Project name我们定为try,按下OK键,下一Step 1屏幕中选Dialog based,由于
不必用到后面的选项,此时即可按下Finish键,结果系统将生成一个新的项目。完成上
述工作后,在左侧Workspace窗口中,选择ResourceView,打开try resources中的Dial
og资源,选择并打开IDD_TRY_DIALOG对话窗口,在Controls菜单窗口中点选按键图标,
回到IDD_TRY_DIALOG对话窗口并点击此窗口,将生成一个名叫Button1的按键,选中此按
键再按鼠标右键,在弹出式菜单上选Properties选项,在出现的对话框中把Caption项的
Button1值改为Setup ODBC,关闭此对话框,再选中此按键按鼠标右键,选择ClassWiza
rd,在出现的对话窗口中,Object Ids选IDC_BUTTON1,Messages中双击BN_CLICKED,此
时弹出Add Member Function对话窗,Member function name是OnButton1,按OK键。在
Member functions选项中双击onButton1 ON_IDC_BUTTION1:BN_CLICKED,在出现的void
CTryDlg::OnButton1()函数中用以下ODBC API函数语句替换 //TODO: Add your contr
ol notification handler code here这条注释语句:
  SQLConfigDataSource(NULL,ODBC_ADD
_SYS_DSN,"Microsoft Access Driver (*.mdb)/0","
DSN=TryDB/0DBQ=D://Database//
try.mdb/0DEFAULTDIR=D://DATABASE/0/0");
  '
---- 您可以根据您不同的设置需要修改上面的语句,SQLConfigDataSource一般有以下
几个许可的参数:ODBC_ADD_DSN: 加入一个新的用户数据源,ODBC_CONFIG_DSN: 修改一
个存在的用户数据源,ODBC_REMOVE_DSN: 删除一个存在的用户数据源,ODBC_ADD_SYS_
DSN: 增加一个新的系统数据源,ODBC_CONFIG_SYS_DSN: 修改一个存在的系统数据源,
ODBC_REMOVE_SYS_DSN: 删除一个存在的系统数据源,ODBC_REMOVE_DEFAULT_DSN: 删除
省缺的数据源说明部分。需要注意的是,当我们使用SQLConfigDataSource ODBC API函
数时必须声明包含系统的odbcinst.h头文件,所以我们再选择workspace窗口中FileVie
w打开Header Files中try.h,在其中加入#include "odbcinst.h",如果不加入这个头文
件,系统编译时就会显示undeclared identifier错误,在完成上述步骤后,假如我们立
即编译并Link这个项目,会发现出现下面的错误:
tryDlg.obj : error LNK2001: unresolved
external symbol _SQLConfigDataSource@16
Debug/try.exe : fatal error LNK1120:
1 unresolved externals
----  有些人可能因为找不出错误而放弃了,其实这是因为当我们使用SQLConfigDat
aSource 这个API函数时候必须用到odbccp32.dll,它是Microsoft提供的32位ODBC安装
和管理的DLL,如果是16位必须用到odbcinst.dll,odbccp32.dll有一个import librar
y,所以解决的办法就是把这个odbccp32.lib加到我们的项目中,我们可以打开Project
系统菜单项,选Add to Project子菜单,在其中选Files项,打开VC安装目录下的/vc/l
ib/目录,文件类型选Library Files(.lib), 选择其中Odbccp32.lib后按OK键,然后重
新编译即可通过,运行这个程序,将弹出对话窗,按下Setup ODBC按键,之后,您就可
以通过控制面板的ODBC数据源管理器或注册表查看运行结果,您会发现,您的数据库已
经成功的注册了。
---- 以上代码均在WIN98,VC5.0上编译通过,您可以灵活应用这些办法,让您编写的软
件更易于安装维护和使用。
(转载完毕)

下面是另外一篇用 Delphi 实现的文章,可以参考一下:
<a href="DispQ.asp?LID=259651">如何在程序里动态改变 ODBC DSN 指向的 Access 数据库文件?</a>

 
多人接受答案了。
 
后退
顶部