关于数据库路径的问题(50分)

  • 主题发起人 主题发起人 x7421
  • 开始时间 开始时间
X

x7421

Unregistered / Unconfirmed
GUEST, unregistred user!
我连了一个vf的数据库,在控制面板里的odbc设的路径,可是这只是在本机上好使,要是把
程序放到别人的机器上,就会找不到数据库。我想问问怎么样设定相对路径,还有怎么样在
别人机器上直接进行自动的odbc设置呢?请赐教,不好意思我分不够一百了,只好给50了
 
用注册表,程序运行创建ODBC连接
那里面可以设置路径,设置路径时取的你程序所用数据库的路径。
我的Access连接,希望对你有帮助
unit main;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls,Registry;

type
TFrmMain = class(TForm)
Button1: TButton;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
procedure ODBCReg;
end;

var
FrmMain: TFrmMain;

implementation

{$R *.DFM}
//****************************************************************************
// ODBC自动注册演示,本演示自动创建了一个名为MYACCESS的
// Microsoft Access Driver (*.mdb) ODBC数据源
// 数据库路径为程序运行路径下DATABASE目录下的BIBLIO.mdb数据库
// 编写自己的程序时改变一下数据库名即可。若是其他数据库只要作
// 相应的修改即可。
// BY 沈阳大猫
// 2002/01/16
//****************************************************************************

procedure TFrmMain.ODBCReg ;
var
RegODBC : TRegistry;
RegDriver:TRegistry;
bData : array[ 0..0 ] of byte;
DataPath:string; //数据库路径
DataDriver:string; //Microsoft Access Driver (*.mdb)数据库ODBC驱动路径
begin
DataPath:=ExtractFilePath(ParamStr(0));
RegDriver:=TRegistry.Create ;
Try
RegDriver.RootKey:=HKEY_LOCAL_MACHINE;
if RegDriver.KeyExists('Software/ODBC/ODBCINST.INI/Microsoft Access Driver (*.mdb)') then
begin
RegDriver.OpenKey('Software/ODBC/ODBCINST.INI/Microsoft Access Driver (*.mdb)',true);
DataDriver:=RegDriver.ReadString('Driver');
end;
RegDriver.CloseKey;
RegDriver.Free;
inherited;
except
showmessage('没有发现MS ACCESS的ODBC驱动,请先安装MS OFFICE 2000!!!!');
end;
//*****************************************************************************
//*****************************************************************************
//*****************************************************************************

RegODBC := TRegistry.Create;
//建立一个Registry实例
with RegODBC do
begin
try
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( 'FSLDAGL', '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/FSLDAGL',True) then
begin
WriteString( 'DBQ', DataPath+'DATABASE/myDB.mdb' );//数据库目录定为程序运行目录下的DATABASE目录
WriteString( 'Description','XXX档案管理系统' );//数据源描述
WriteString( 'Driver', DataDriver );//驱动程序DLL文件由注册表取得已经安装的access数据库驱动路径
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/FSLDAGL/Engines/Jet',True) then
begin
WriteString( 'ImplicitCommitSync', 'Yes' );
WriteInteger( 'MaxBufferSize',2048);//缓冲区大小
WriteInteger( 'PageTimeout', 5 );//页超时
WriteInteger( 'Threads', 3 );//支持的线程数目
WriteString( 'UserCommitSync', 'Yes' );
end
else//创建键值失败
begin
memo1.lines.add('增加ODBC数据源失败');
exit;
end;
finally
CloseKey;
memo1.lines.add('增加新ODBC数据源成功');
Free;
end;
end;
end;

procedure TFrmMain.Button1Click(Sender: TObject);
begin
ODBCReg;
end;
procedure TFrmMain.FormCreate(Sender: TObject);
var
RegODBC : TRegistry;
begin
RegODBC:=TRegistry.Create ;
try
RegODBC.RootKey := HKEY_LOCAL_MACHINE;
if RegODBC.KeyExists('Software/ODBC/ODBC.INI/FSLDAGL')=false then
begin
ODBCReg;
end;
//finally
except
RegODBC.CloseKey;
RegODBC.Free;
inherited;
showmessage('数据库配置失败!');
end;

end;

end.
 
因为在网络环境下数据库连接稍微麻烦一些,所以你大概得在安装程序当中让用户设置 ODBC。
或者,在用户手册中指明配置 ODBC 中的 DSN。
以上是指通用的 ODBC 配置方式。不过,对 Visual Foxpro 的库,它的配置方式好像很简单,
(只需要制定目录就行了)所以没有这么麻烦。因我没有做过这方面的工作,所以不知道如何
做,但我觉得你可以在安装程序里边(或者软件运行的第一次)让用户指定库目录。你试试看
能不能实现。
 
以下是在程序中动态创建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;

从中您应该可以学会如何更改需要的数据库
 
hbezwwl的方法太复杂,我告诉你一个很简单的办法:

你使用ODBC随便在注册一个数据库,连接名就用“AAAA”好了,然后执行regedit,在注册
表中查找AAAA,将找到的所有的有关AAAA的注册信息记录下来(或将其导出后在记事本中打开)
,然后用InstallShield制作安装盘时,按照记录下来的信息,进行注册设置便OK了。
要了解详细操作步骤,可以发给你一篇我写的关于BDE注册的文章看一下,定会获益非浅。
 
不用建联接串,如下:
var
myaccess:string;
const
mystr1='Provider=Microsoft.Jet.OLEDB.4.0;Data Source=%s';
begin
//myaccess取得可招行程序所在路径
myaccess:=ExtractFilePath(ParamStr(0))+'db1.mdb';
adoTABLE3.ConnectionString:=format(mystr1,[myaccess]);
adotable3.TableName:='表2';
ADOTable3.Open;
 
把你的地址给我我告诉你。
 
多人接受答案了。
 
后退
顶部