安装后自动在ODBC下建立数据库别名,并且连起来!请问怎么在安装程序中制作???(100分)

  • 主题发起人 主题发起人 chensoft
  • 开始时间 开始时间
C

chensoft

Unregistered / Unconfirmed
GUEST, unregistred user!
请问:怎样才可以在做安装打包时,配置数据库程序,让他们在安装后自动在ODBC下
建立数据库别名,直接运行安装后的程序就可以运行了,我现在是安装完程序后,还要继
续重新在ODBC下配置数据库,请问怎么做?我一定给分!
 
手工配置安装:
用注册表可以实现:
参考
[HKEY_CURRENT_USER/Software/ODBC/ODBC.INI]
//配置数据库的驱动程序
[HKEY_LOCAL_MACHINE/SOFTWARE/ODBC/ODBC.INI]
//配置你的别名数据库
[HKEY_LOCAL_MACHINE/SOFTWARE/ODBC/ODBCINST.INI]
//配置数据库的驱动
打包前可以将你机器上的注册表环境打包至安装程序中,打包时注意配置时别名数据库时的数
据文件路径与注册表中填写的一致
安装工具:
DELPHI自带的打包工具可以直接将别名打包进去,你可以试试
 
同意上面的看法,但要在Windows的系统目录中找到相关的.Dll文件,如果不明白,可以手工建一个
ODBC,看注册表的相关目录中有什么变化,再在打包时作什么方面的修改就是了.
 
请问:打包前可以将你机器上的注册表环境打包至安装程序中,打包时注意配置时别名数据库时的数
据文件路径与注册表中填写的一致,这个怎么做啊
 
[8D][red][/red]
你最好自己制作程序分发包,在程序中直接修改HKEY_LOCAL_MACHINE下的ODBC.INI 添加
你需要设置的别名并且根据你要连接的数据库属性进行串值编辑。OKEY?!
你仍不明白可以e_mail :ZP025@BZ-PUBLIC.SD.CNINFO.NET
 
楼上的同志们:如果手工配置的话,还要安装程序干什么用?干脆写一本安装手册算了。再说用户懂这些东东吗?
chensoft 不知你用什么安装工具制作的安装程序?我一直用InstallShield Developer 7,所有的BDE和ODBC配置只要添几张表就OK了。
 
我是用InstallShield for delphi 4,麻烦大家帮我了,还是不行啊
 
换工具把
InstallShield for delphi 4不支持ODBC
 
把代码写在程序里,每次启动时都配置一下ODBC ,就是有人把它删除了也没关系了。
 
同意楼上的说法:
1.在HKEY_LOCAL_MACHINE/Software/ODBC/ODBC.INI/ODBC Data Sources中增加一个字符串键值,为MyAccess = Microsoft Access Driver(*.mdb),其中分别为数据源名称和数据库类型.这是在注册表中注册一个系统DSN名称.
  2.在HKEY_LOCAL_MACHINE/Software/ODBC/ODBC.INI中创建一个子键(SubKey)MyAccess,即创建一个键为HKEY_LOCAL_MACHINE/Software/ODBC/ODBC.INI/MyAccess,然后在其下创建一些键值,详细描述一个系统DSN的配置信息,主要信息有([]中的内容为笔者注释):
DBQ=C:/Inetpub/wwwroot/Test.mdb [字符串,表示数据库路径]
Description=我的ACCESS [字符串,表示数据库描述]
Driver=C:/PWIN98/System/odbcjt32.dll [字符串,表示驱动程序,可见ODBCINST.INI]
DriverId=0x00000019(25) [数字,表示驱动程序标识,不能改变]
FIL=Ms Access;
[字符串,可能与过滤Filter有关]
SafeTransaction=0x00000000 [数字,可能表示支持事务性操作的个数]
UID=”” [字符串,表示用户名称,此处为空字符串]
  3.在HKEY_LOCAL_MACHINE/Software/ODBC/ODBC.INI/MyAccess中创建一个子键(SubKey)Engines,再在其下创建子键(SubKey)Jet,即创建一个键为
HKEY_LOCAL_MACHINE/Software/ODBC/ODBC.INI/MyAccess/Engines/Jet,然后在其下创建一些键值,详细描述一个系统DSN的数据库引擎配置信息,主要信息有([]中的内容为笔者注释):
ImplicitCommitSync=Yes [字符串,可能表示是否立即反映数据修改]
MaxBufferSize=0x00000200(512) [数字,表示缓冲区大小]
PageTimeout=0x00000005(5) [数字,表示页超时]
Threads=0x00000003(3) [数字,可能表示支持的最大线程数目]
UserCommitSync=Yes [字符串,可能表示是否立即将数据修改反映到用户
 
昨天刚装了InstallShield Profesional6.22(不是Borland的), 里面居然支持BDE配置, 当
然包括ODBC, 不过我突然冒出一个问题来, 如果建立SQL别名的话, 需要指定SQL的实例名,
如果用户安装SQL Sever用的实例名不同, 那么这些ODBC配置岂不白费了? 也不可能要求用
户安装SQL Sever时千篇一律使用你规定的实例名吧?
 
各位,还是不行啊,能不能给得详细点啊,或者给我发个邮件给我,我的
chensoft@nbip.net
麻烦大家了
 
参见下面的代码,其中有个bitbtn的代码我删了。你要的东西还在。
unit Unitlogin;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Buttons, DB, ADODB, DBCtrls;
var ConnStrFile:string;
const
ODBC_ADD_DSN = 1;
// 添加数据源
ODBC_CONFIG_DSN = 2;
// 配置数据源
ODBC_REMOVE_DSN = 3;
// 删除数据源
ODBC_ADD_SYS_DSN = 4;
// 添加系统DSN
ODBC_CONFIG_SYS_DSN = 5;
// 配置系统DSN
ODBC_REMOVE_SYS_DSN = 6;
// 删除系统DSN
type
TSQLConfigDataSource = function( hwndParent: HWND;
fRequest: WORD;
lpszDriver: LPCSTR;
lpszAttributes: LPCSTR ) : BOOL;
stdcall;
TFormlogin = class(TForm)
ADOTable1: TADOTable;
DataSource1: TDataSource;
Edit1: TEdit;
Label1: TLabel;
Label2: TLabel;
BitBtn1: TBitBtn;
BitBtn2: TBitBtn;
ComboBox1: TComboBox;
procedure BitBtn1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure BitBtn2Click(Sender: TObject);
procedure Edit1KeyPress(Sender: TObject;
var Key: Char);
procedure FormClose(Sender: TObject;
var Action: TCloseAction);
procedure ComboBox1Change(Sender: TObject);
private
public
end;

var
Formlogin: TFormlogin;
implementation
{$R *.dfm}
function LoadConnStr: string;
var
sltConn:TStringlist;
begin
sltConn := TStringList.Create;
if FileExists(ConnStrFile) then
sltConn.LoadFromFile(ConnStrFile)
else
sltConn.Text := '';
Result := sltConn.Text;
sltConn.free;
end;
procedure SaveConnStr ;
var
stronn:string;
sltConn:TStringlist;
begin
stronn := PromptDataSource(Application.Handle, formlogin.ADOTable1.ConnectionString);
sltConn := TStringList.Create;
sltConn.Text := stronn;
sltConn.SaveToFile(ConnStrFile);
sltConn.free;
end;
function getCurPath: string;
begin
Result := ExtractFilePath(Application.ExeName);
end;

procedure TFormlogin.FormCreate(Sender: TObject);
var
pFn: TSQLConfigDataSource;
hLib: LongWord;
strDriver: string;
strHome: string;
strAttr: string;
strFile: string;
ConnStr: string;
fResult: BOOL;
ModName: array[0..MAX_PATH] of Char;
srInfo : TSearchRec;
create_odbc:boolean;
begin
//建立ODBC数据
create_odbc:=true;
Windows.GetModuleFileName( HInstance, ModName, SizeOf(ModName) );
strHome := ModName;
while ( strHome[length(strHome)] <> '/' )do
Delete( strHome, length(strHome), 1 );
strFile := strHome + 'wxd.MDB';
// 检查Access权限(Axes = Access)
hLib := LoadLibrary('ODBCCP32');
if( hLib <> NULL ) then
begin
@pFn := GetProcAddress( hLib, 'SQLConfigDataSource' );
if( @pFn <> nil ) then
begin
// 强迫重建DSN
strDriver := 'Microsoft Access Driver (*.mdb)';
strAttr := Format( 'DSN=wxd'+#0+
'DBQ=%s'+#0+
'Exclusive=1'+#0+
'Description=wxd Data'+#0+#0,
[strFile] );
fResult := pFn( 0, ODBC_ADD_SYS_DSN, @strDriver[1], @strAttr[1] );
if( fResult = false ) then
begin
ShowMessage( '创建DSN (Datasource)失败!' );create_odbc:=false;
end;

// 检测/创建同DSN关联的 MDB 文件
if( FindFirst( strFile, 0, srInfo ) <> 0 ) then
begin
strDriver := 'Microsoft Access Driver (*.mdb)';
strAttr := Format( 'DSN=wxd'+#0+
'DBQ=%s'+#0+
'Exclusive=1'+#0+
'Description=wxd Data'+#0+
'CREATE_DB="%s"'#0+#0,
[strFile,strFile] );
fResult := pFn( 0, ODBC_ADD_SYS_DSN, @strDriver[1], @strAttr[1] );
if( fResult = false ) then
begin
ShowMessage( '创建MDB文件失败!' );create_odbc:=false;
end;
FindClose( srInfo );
end;
FreeLibrary( hLib );
end
else
begin
ShowMessage( '无法加载ODBCCP32.DLL' );
create_odbc:=false;
end;

if create_odbc then
begin
USER:='';
ConnStr:=getCurPath + 'wxd.mdb';
Connstr:='Provider=MSDASQL.1;Password=wanguojun_user;'
+'Persist Security Info=True;Data Source=wxd;'
+'Initial Catalog='+Connstr;
try
with self.ADOTable1do
begin
ConnectionString :=ConnStr;
open;
first;
while not eofdo
begin
self.ComboBox1.AddItem(fieldbyname('bzmc').AsString,self);
next;
end;
end;
except
messagebox(0,'数据源定义错误,请与管理员联系!','提示', mb_ok+mb_iconinformation);
application.Terminate
end
end;
end;
end;

procedure TFormlogin.BitBtn2Click(Sender: TObject);
begin
application.Terminate;
end;
end.
 
判断程序第一次运行,填加注册表项
注册ODBC
 
再请大家帮忙!
 
多人接受答案了。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部