动态配置ODBC(100分相送)

yangming_ok 2001-07-28 06:32:22
服务器端Windows 2000,SQL Server 7.0
要求在客户端不要手工配置odbc,在程序中自动配置odbc
好象修改注册表和用WinApi可以实现。
解决了一定给60分!
...全文
206 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
yangming_ok 2001-08-10
  • 打赏
  • 举报
回复
//读写文件
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;
yangming_ok 2001-08-09
  • 打赏
  • 举报
回复
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 2001-08-07
  • 打赏
  • 举报
回复
请各位大虾关注
yangming_ok 2001-08-07
  • 打赏
  • 举报
回复
zhujunfeng(ericss) ,你运行成功没有啊?

如果成功,一定给你加分
ZhuJunfeng 2001-08-07
  • 打赏
  • 举报
回复
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 2001-07-31
  • 打赏
  • 举报
回复
请高手关注
kylix2001 2001-07-31
  • 打赏
  • 举报
回复
好东西,收藏!
cobi 2001-07-31
  • 打赏
  • 举报
回复
gz
yangming_ok 2001-07-31
  • 打赏
  • 举报
回复
请关注
smile_and_smile 2001-07-31
  • 打赏
  • 举报
回复
见http://www.csdn.net/develop/read_article.asp?id=9315
shawnguo 2001-07-29
  • 打赏
  • 举报
回复
学习
dqzgw 2001-07-29
  • 打赏
  • 举报
回复
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地址
(你可以从你的服务器注册表中导出该分支,再导入到客户端注册表,然后添加以上项;)
如此,大公告成
copy_paste 2001-07-28
  • 打赏
  • 举报
回复
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;

要走了,你试试吧,
copy_paste 2001-07-28
  • 打赏
  • 举报
回复
今天是忙里合偷闲,做那死报表啊,55555~~~~~,我已经做了一个星期了,还是没完没了的.
DBEngine是Dao97.dcu
uses dao97;
SQLServer还在试,
为什么要注册,我用BDE,ADO,从来不用ODBC
aningstar 2001-07-28
  • 打赏
  • 举报
回复
添加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; // 删除系统DSN

type
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;

从中您应该可以学会如何更改需要的数据库
yangming_ok 2001-07-28
  • 打赏
  • 举报
回复
copy_paste(木石三) ,我要SQL Server的并且是在网络环境下的客户端
一定要帮我一定给你分.
还有能给出你的icq 吗?
DBEngine的头文件是什么呢,也就是要在uses里加什么文件?
copy_paste 2001-07-28
  • 打赏
  • 举报
回复
这是注册一个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 2001-07-28
  • 打赏
  • 举报
回复
copy_paste(木石三) ,谢谢你,各位请继续关注。
copy_paste 2001-07-28
  • 打赏
  • 举报
回复
要注册什么驱动的,
老兄已经很详细了,就知道这些,或去写注册表.
yangming_ok 2001-07-28
  • 打赏
  • 举报
回复
copy_paste(木石三),具体一点把,我真的要的很急的啊
各位请帮帮忙呀!
加载更多回复(2)

5,392

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧