主  题:动态配置ODBC(100分相送)
作  者:yangming_ok(小山羊)
所属论坛:Delphi
问题点数:60
回复次数:22
发表时间:01-7-28 18:32:22
 
服务器端Windows 2000,SQL Server 7.0
要求在客户端不要手工配置odbc,在程序中自动配置odbc
好象修改注册表和用WinApi可以实现。
解决了一定给60分!
 回复贴子:  
回复人: copy_paste(木石三) 得0分 
uses dao97;
button1click
var
Engine: DBEngine;
begin
Engine := CoDBEngine.Create;
Engine.ReisterDatabase('ODBC name', '驱动程序的名称', True, '相应驱动配置信息'); 
end;
忘了许多参数,你试试吧要不然玩注册表了.
 回复贴子:  
回复人: copy_paste(木石三) 得0分 
在HKEY_CURRENT_USER\Software\ODBC\ODBC.INI
RegisterDatabase
Param1:ODBC的名称
param2:哪个驱动程序('SQL Server', 'Microsft Access Driver (*.mdb)'),注意,空格不能多,不能少不然找不出错误...
Param3:是否弹出配置ODBC的对话框
Param4:信息,从注册表参考一个吧,记不了那么多,
一个SQL ODBC('database=master;server=192.168.0.1;description=test')
 回复贴子:  
回复人: yangming_ok(小山羊) 得0分 
copy_paste(木石三),具体一点把,我真的要的很急的啊
各位请帮帮忙呀!
 回复贴子:  
回复人: copy_paste(木石三) 得0分 
要注册什么驱动的,
老兄已经很详细了,就知道这些,或去写注册表.
 回复贴子:  
回复人: yangming_ok(小山羊) 得0分 
copy_paste(木石三) ,谢谢你,各位请继续关注。
 回复贴子:  
回复人: copy_paste(木石三) 得10分 
这是注册一个Access的
procedure RegisterODBC;
var
Engine: DBEngine;
begin
Engine := CoDBEngine.Create;
Engine.RegisterDatabase('test', 'Microsoft Access Driver (*.mdb)', True, 'dbq=c:\test.mdb;uid=admin;pwd=mypassword');
end;procedure TForm1.Button1Click(Sender: TObject);
begin
RegisterODBC;
end;
 回复贴子:  
回复人: yangming_ok(小山羊) 得0分 
copy_paste(木石三) ,我要SQL Server的并且是在网络环境下的客户端
一定要帮我一定给你分.
还有能给出你的icq 吗?
DBEngine的头文件是什么呢,也就是要在uses里加什么文件?
 回复贴子:  
回复人: aningstar(乘风破浪终有时) 得10分 
添加ODBC System DSN
下面这个例子显示了如何加载实现了ODBC 管理功能的DLL(odbccp32.dll)来创建一个Access MDB文件和指向它的ODBC DSN。注意:这里假设DLL和MDB都在当前目录下。
同时,"CREATE_DB"的调用是Access(MS Jet引擎)的专有调用,类似的还有COMPACT_DB和REPAIR_DB等。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; // 删除系统DSNtype
TSQLConfigDataSource = function( hwndParent: HWND;
fRequest: WORD;
lpszDriver: LPCSTR;
lpszAttributes: LPCSTR ) : BOOL; stdcall;
procedure Form1.FormCreate(Sender: TObject);
var
pFn: TSQLConfigDataSource;
hLib: LongWord;
strDriver: string;
strHome: string;
strAttr: string;
strFile: string;
fResult: BOOL;
ModName: array[0..MAX_PATH] of Char;
srInfo : TSearchRec;
begin
Windows.GetModuleFileName( HInstance, ModName, SizeOf(ModName) );
strHome := ModName;
while ( strHome[length(strHome)] <> '\' ) do
Delete( strHome, length(strHome), 1 );
strFile := strHome + 'TestData.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=TestDSN'+#0+
'DBQ=%s'+#0+
'Exclusive=1'+#0+
'Description=Test Data'+#0+#0,
[strFile] );
fResult := pFn( 0, ODBC_ADD_SYS_DSN, @strDriver[1], @strAttr[1] );
if( fResult = false ) then ShowMessage( '创建DSN (Datasource)失败!' );// 检测/创建同DSN关联的 MDB 文件
if( FindFirst( strFile, 0, srInfo ) <> 0 ) then
begin
strDriver := 'Microsoft Access Driver (*.mdb)';
strAttr := Format( 'DSN=TestDSN'+#0+
'DBQ=%s'+#0+
'Exclusive=1'+#0+
'Description=Test Data'+#0+
'CREATE_DB="%s"'#0+#0,
[strFile,strFile] );
fResult := pFn( 0, ODBC_ADD_SYS_DSN, @strDriver[1], @strAttr[1] );
if( fResult = false ) then ShowMessage( '创建MDB文件失败!' );
end;
FindClose( srInfo );end;FreeLibrary( hLib );
end
else
begin
ShowMessage( '无法加载ODBCCP32.DLL' );
end;
end;
--------------------------------------------------------------------------------以下是在程序中动态创建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;从中您应该可以学会如何更改需要的数据库 
 回复贴子:  
回复人: copy_paste(木石三) 得0分 
今天是忙里合偷闲,做那死报表啊,55555~~~~~,我已经做了一个星期了,还是没完没了的.
DBEngine是Dao97.dcu
uses dao97;
SQLServer还在试,
为什么要注册,我用BDE,ADO,从来不用ODBC
 回复贴子:  
回复人: copy_paste(木石三) 得0分 
HKEY_CURRENT_USER\Software\ODBC\ODBC.INI
写注册表吧:
with TRegistry.Create do
begin
RootKey := HKEY_CURRENT_USER;
if OpenKey('\Software\ODBC\ODBC.INI', False) then
begin 
写入四个key Vaule(:string)
"Database",连接哪个数据库
"Driver"(比较麻烦找到系统目录中的sqlsrv32.dll) 
"lastUser"(SQL 的用户名)
"Server"(SQL Server服务器名称)
end;
CloseKey;
Free;
end;要走了,你试试吧,
 回复贴子:  
回复人: dqzgw(流云) 得10分 
1。sqlserver oldb provider 在安装了DELPHI 和SQLSERVER之后便会有;
2、客户端 不许要安装SQLSERVER
只需要找到以下4个文件,将他复制到客户端机器的SYSTEM目录下,在修改注册表即可:
在你的Windows\System下面找到以下几个文件(当然你的机器必须已经安装SQLServer):Dbmssocn.dll TCP/IP 支持文件 
Dbmsspxn.dll IPX 支持文件 
Dbnmpntw.dll 命名管道支持文件 
Ntwdblib.dll SQLServer核心文件(这个文件最重要) 
然后在注册表中添见以下项:HKEY_LOCAL_MACHINE------>SOFTWARE-------->MICROSOFT------>MSSQLSERVER--->
CLIENT----->CONNECTTO
添加以下项:
SERVERNAME ‘DBMSSOCN,192。168。0。2,1433’ 
^^你要连接的服务器名称 ^^该服务器的IP地址
(你可以从你的服务器注册表中导出该分支,再导入到客户端注册表,然后添加以上项;)
如此,大公告成 
 回复贴子:  
回复人: smile_and_smile(smile) 得0分 
见http://www.csdn.net/develop/read_article.asp?id=9315
 回复贴子:  
回复人: zhujunfeng(ericss) 得30分 
with TRegistry.Create do
begin
RootKey:=HKEY_LOCAL_MACHINE;
OpenKey('\Software\ODBC\ODBC.INI\ODBC Data Sources',False);
WriteString('aliasename','SQL Server');
OpenKey('\Software\ODBC\ODBC.INI\aliasename',True);
WriteString('Driver','C:\WINDOWS\SYSTEM\SQLSRV32.dll');
WriteString('LastUser','aliasename');
WriteString('Server','202.109.10.92');
free
end
 回复贴子:  
回复人: yangming_ok(小山羊) 得0分 
zhujunfeng(ericss) ,你运行成功没有啊?如果成功,一定给你加分
 回复贴子:  
回复人: yangming_ok(小山羊) 得0分 
uses Winsock
function GetLocalAddress: string;
var
wVersionRequested : WORD;
wsaData : TWSAData;
p : PHostEnt;
s : array[0..128] of char;
p2 : pchar;
begin
{创建 WinSock}
result:='';
wVersionRequested := MAKEWORD(1, 1);
WSAStartup(wVersionRequested, wsaData);{得到计算机名称}
GetHostName(@s,128);
p:=GetHostByName(@s);{得到机器IP地址}
p2 := iNet_ntoa(PInAddr(p^.h_addr_list^)^);
result:=p2;
WSACleanup;
end;
 回复贴子:  
回复人: yangming_ok(小山羊) 得0分 
//读写文件
function TBkg_NewActFrm.ProcessCreateDBFile (const FileName:string):string;
var
szPath,szTmpFile1,szTmpFile2: string;
FTmp1,FTmp2:TextFile;
szTemp:string;
begin
szPath:=ExtractFilePath(Application.EXEName);
szTmpFile1:=szPath+FileName;
szTmpFile2:=szPath+'tmp.sql';
AssignFile(FTmp1,szTmpFile1);
AssignFile(FTmp2,szTmpFile2);
Reset(FTmp1);
ReWrite(FTmp2);
while not EOF(FTmp1) do
begin
Readln(FTmp1,szTemp);
if Pos('setuser',lowercase(szTemp))>0 then continue;
if Trim(szTemp)<>'' then szTemp:=ReplaceDataType(szTemp);
writeln(FTmp2,szTemp);
end;
CloseFile(FTmp1);
CloseFile(FTmp2); 
Result:='tmp.sql';
end;
  
(完)