我用的是sql server数据库,在程序运行时用代码创建了一个ODBC连接。。。。(250分)

  • 主题发起人 主题发起人 飞沙
  • 开始时间 开始时间

飞沙

Unregistered / Unconfirmed
GUEST, unregistred user!
我用的是sql server数据库,在程序运行时用代码创建了一个ODBC连接,
ODBC 在Client configuration中的NetWork libraries默认的是Named Pipes(管道)
而我要用TCP/IP 连接,用代码怎么实现(200)

另外我的ODBC的system DNS不能配置(50分)
 
最好你还是在安装程序里做这个工作!很方便的
 
to 飞沙
你的ODBC的system DNS不能配置,你可以升级"MDAC2.7",网上搜一下,很多的. 至于动态创建ODBC我也试过但没有成功.
 
你自己首先手工在odbc里设置一遍,然后查看一下注册表里的选项,导出来,在delphi里写进去不就行了吗?
不过你用ado不行吗?只要在程序里做连接字串就可以了,下面是我用bde时,做的关于access的odbc联接,你换成sqlserver的试试
registry1:=tregistry.Create;
registry1.RootKey:=HKEY_CURRENT_USER;
if registry1.OpenKey('software/odbc/odbc.ini/odbc data sources',true) then
begin
registry1.WriteString('KQ1','Microsoft Access Driver (*.mdb)');
registry1.CloseKey;
end;
AppPath:=ExtractFilePath(Application.ExeName); //取得应用程序的当前路径
GetMem(SysDir,255);
GetSystemDirectory(SysDir,255); //取得WINDOWS系统目录
Path:=String(SysDir)

if registry1.OpenKey('software/odbc/odbc.ini/KQ1',true) then
begin
registry1.WriteString('DBQ',apppath+'KQ1.mdb');
registry1.WriteString('Driver',path+'/odbcjt32.dll');
registry1.Writeinteger('DriverId',25);
registry1.writestring('FIL','MS Access;');
registry1.WriteInteger('SafeTransactions',0);
registry1.WriteString('UID','');
registry1.CloseKey;
end;

if registry1.OpenKey('software/odbc/odbc.ini/KQ1/Engines/Jet',true) then
begin
registry1.writestring('ImplicitCommitSync','Yes');
registry1.writeinteger('MaxBufferSize',512);
registry1.WriteInteger('PageTimeout',10);
registry1.writeinteger('Threads',3);
registry1.WriteString('UserCommitSync','Yes');
end;
registry1.CloseKey ;
registry1.Free;
 
to lt_wxy:
我下载了之后还是不行,只是把我ODBC从英文变为了中文
 
to app2001 :
配了ODBC后注册表里没有使用协议数据项
 
为什么非要用odbc,用ado不是很方便的吗?
 
以下是在程序中动态创建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;
 
to spymaster:
不需要动态创建的代码, 我只要用代码改配sql server数据源时的默认协议
 
我的以前vfp代码,调用api,delphi的自己改一改:

注意这句 network=DBMSSOCN ,就是指定tcp/ip方式

Func ConfigDSN
Para lcODBCName,lcODBCServer,lcODBCDatabase
Declare INTEGER SQLConfigDataSource IN odbccp32.dll ;
INTEGER nHwndParent, ;
INTEGER nRequest, ;
STRING cDriver, ;
STRING cAttributes
lnWindowHandle=0
lcODBCDriver='SQL Server' &&DRIVER类型
*lcODBCName='try' &&数据源名字
lcODBCDesc=lcODBCName &&数据源描述
*lcODBCServer='168.6.8.2' &&SQL SERVER名字
*lcODBCDatabase='systemargument' &&要连接的数据库名字

**先试图修改已有的ODBC,如果不存在,返回0。
lreturn=SQLConfigDataSource(lnWindowHandle, 2, lcODBCDriver, ;
'DSN=' + lcODBCName + CHR(0) ;
+ 'Description=' + lcODBCDesc + CHR(0) ;
+ 'Server=' + lcODBCServer + CHR(0) ;
+" network=DBMSSOCN" + CHR(0) ;
+" AutoTranslate=No"+CHR(0) ;
+ 'Database=' + lcODBCDatabase + CHR(0))
If lreturn=0 &&不存在
**添加新的ODBC
lreturn=SQLConfigDataSource(lnWindowHandle, 1, lcODBCDriver, ;
'DSN=' + lcODBCName + CHR(0) ;
+ 'Description=' + lcODBCDesc + CHR(0) ;
+ 'Server=' + lcODBCServer + CHR(0) ;
+" network=DBMSSOCN" + CHR(0) ;
+" AutoTranslate=No"+CHR(0) ;
+ 'Database=' + lcODBCDatabase + CHR(0))
If lreturn=0 &&失败
* MESSAGEBOX('添加ODBC数据源失败',16,'BUFFER')
Retu -1
Else
* MESSAGEBOX('添加ODBC数据源OK',64,'BUFFER')
Retu 1
Endif
Else
* MESSAGEBOX('修改ODBC数据源OK',64,'BUFFER')
Retu 2
Endif
*!* ?sqlgetprop(lreturn,"DataSource")
*!* ?sqlgetprop(lreturn,"userid")
*!* ?sqlgetprop(lreturn,"password")
*!* ?sqlgetprop(lreturn,"connectstring")
Retu -1
 
to tt8:
能不能指出你哪一句是解决我下面这个问题的
不需要动态创建的代码, 我只要用代码改配sql server数据源时的默认协议
 
下面的代码在客户端没有启用 TCP/IP 时增加 TCP/IP 协议,只是修改了注册表,没有测试是否能够立刻启用。。。

var
Str: String[255];
dwType: Integer;
Size: DWORD;
begin
with TRegistry.Create do
begin
try
FillChar(Str,256,#0);
RootKey:=HKEY_LOCAL_MACHINE;

if OpenKey('/SOFTWARE/Microsoft/MSSQLServer/Client/SuperSocketNetLib',True) then
begin
if RegQueryValueEx(CurrentKey,'ProtocolOrder',Nil,@dwType,@Str[0],@Size) = ERROR_SUCCESS then
begin
if Pos('tcp',Str)=0 then
begin
Move('tcp'#0#0,Str[Size-1],5);
RegSetValueEx(CurrentKey,'ProtocolOrder',0,REG_MULTI_SZ,@Str[0],Size+4);
end;
end;
end;
finally
Free;
end;
end;
end;
 
还是没解决,谢谢大家
 
后退
顶部