各位大哥救命!ODBC、Access的发布问题(100分)

  • 主题发起人 主题发起人 versa
  • 开始时间 开始时间
V

versa

Unregistered / Unconfirmed
GUEST, unregistred user!
各位大哥好,我的程序做好了(用Delphi),
数据库用的access、设置了ODBC(为了和其他程序兼容),
可是到了最后关头,我用Installshield发布的时候,不知道怎样做,
请哪位高高手详细回复一下过程好么?
 
access不如用ADO了
 
把设置ODBC做为程序第一次运行时的一个动作.
另外,下面是设置ODBC的代码,以前的问题中回答的,后来整理过,
不过现在不在手边,先这么用吧(用ODBC查找一下,可以找到
更多相关的帖子):

从m$的msdn中找到的函数:
interface
const
ODBCCP32 = 'ODBCCP32.dll';

const
{ SQLConfigDataSource Request flags }
ODBC_ADD_DSN = 1; // Add a new user data source
ODBC_CONFIG_DSN = 2; // Configure (modify) an existing user data source
ODBC_REMOVE_DSN = 3; // Remove an existing user data source
ODBC_ADD_SYS_DSN = 4; // Add a new system data source
ODBC_CONFIG_SYS_DSN = 5; // Modify an existing system data source
ODBC_REMOVE_SYS_DSN = 6; // Remove an existing system data source
ODBC_REMOVE_DEFAULT_DSN = 7; // Remove the default data source specification
// section from the system information, same as
// the SQLRemoveDefaultDataSource function.
// Other params should be NULLS; if not, they
// will be ignored.
{ adds, modifies, or deletes data sources }
function SQLConfigDataSource(hWnd: HWND; Request: LongInt; DriverType: PChar;
Attributes: PChar): BOOL; stdcall;
implementation
{ SQLConfigDataSource }
{ 功能: adds, modifies, or deletes data sources }
{ 输入: hWnd Parent window handle. The function will not display
any dialog boxes if the handle is null.
Request Type of request
DriverType Driver description
Attributes List of attributes in the form of keyword-value pairs
输出: BOOL 类型, 操作成功为True, 否则为False

例子:
procedure TForm1.Button3Click(Sender: TObject);
const
c = 'DSN=mypubs'#0 +
'DESCRIPTION=SQLConfigDSN Sample'#0 +
'SERVER=(local)'#0 +
'ADDRESS=xyb'#0 +
'NETWORK=.'#0 +
'DATABASE=pubs'#0#0;
begin
if SQLConfigDataSource(0, ODBC_ADD_SYS_DSN, 'SQL Server', c) then
caption := 'odbc ok'
else caption := 'odbc false';
end;
}
function SQLConfigDataSource; external ODBCCP32 name 'SQLConfigDataSource';
 
用WiseInstall比较简单
 
我也遇到过这种问题,不过我用的方法是再写一个小程序,其实odbc中的信息存在注册表中,
写注册表就可以设置odbc了.在ChinaAsp中的Delphi栏中有相关的文章.
 
agree==>> springm
 
看这里:
<a href="DispQ.asp?LID=259651">如何在程序里动态改变 ODBC DSN 指向的 Access 数据库文件?</a>
 
你不如用Diamand Access呢
 
Wise install在哪里可以弄到???一直没有接触过,能帮忙介绍一下吗?
 
Wise Install 在http://www.nease.net/~tomcar/可下载
使用起来比InstallShield简单直观多了,现在共享软件的安装大部分是用它做的
比如WebZip,NetAnts,Oicq,TurboPower的全套控件等
 
update your bde to 5.1.1
www.inprise.com/bde

then use installshield,select full bde
 
如果要建一个别名为TEST的ODBC数据源,指向某个ACCESS文件,且是system dsn,注册表中
如下:
REGEDIT4

[HKEY_LOCAL_MACHINE/Software/ODBC/ODBC.INI/Test]
"Driver"="C://WINDOWS//SYSTEM//odbcjt32.dll"
"DBQ"="D://Program//VC++//Linguo//DB2.MDB"
"DriverId"=dword:00000019
"FIL"="MS Access;"
"SafeTransactions"=dword:00000000
"UID"=""

[HKEY_LOCAL_MACHINE/Software/ODBC/ODBC.INI/Test/Engines]

[HKEY_LOCAL_MACHINE/Software/ODBC/ODBC.INI/Test/Engines/Jet]
"ImplicitCommitSync"=""
"MaxBufferSize"=dword:00000800
"PageTimeout"=dword:00000005
"Threads"=dword:00000003
"UserCommitSync"="Yes"

你可以用VC的INSTALL SHEILD,可以写脚本程序来控制安装的,而且脚本结构很简单,
并且提供了一套存储注册表的函数供使用。
相信我,没错的:)
 
给你一个管用的,小弟刚刚在昨晚用它制作了一个安装程序,呵呵。

在程序中动态的生成一个ODBC数据库别名(注意,这样在制作
安装程序的时候就不用再添加alias了。
具体方法如下:
(注意:必须在uses语句中加上Registry)
procedure TFm_main.FormCreate(Sender: TObject);
var
registerTemp : TRegistry;
bData : array[ 0..0 ] of byte;
SysDir : array[0..255] of char;
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
GetSystemDirectory(SysDir,sizeof(SysDir)-1);//得到系统路径
WriteString( 'DBQ',GetCurrentdir+'/DATA/mydata.mdb' );//数据库目录
WriteString( 'Description', '我的新数据源' );//数据源描述
WriteString( 'Driver', SysDir+'/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
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
exit;
end;
CloseKey;
Free;
end;
end;
end;

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