收藏 分享(赏)

microsoft sql 2000 tms配置说明.doc

上传人:天天快乐 文档编号:1144991 上传时间:2018-06-15 格式:DOC 页数:8 大小:122KB
下载 相关 举报
microsoft sql 2000 tms配置说明.doc_第1页
第1页 / 共8页
microsoft sql 2000 tms配置说明.doc_第2页
第2页 / 共8页
microsoft sql 2000 tms配置说明.doc_第3页
第3页 / 共8页
microsoft sql 2000 tms配置说明.doc_第4页
第4页 / 共8页
microsoft sql 2000 tms配置说明.doc_第5页
第5页 / 共8页
点击查看更多>>
资源描述

1、Microsoft SQL 2000 TMS配置说明2005年 5月 2日晚联系方式: MSN: QQ:29327700在网上看到很多对经乾大侠的关于 TUXEDO开发 SQL SERVER2000的文章,碰到很多问题。我根据原文修改了一下。把容易出错的步骤详细写出来。由于水平和时间问题,有误的地方请大家指正。需要修改的地方,与原文不同的地方或需要注意的地方我都用红色标识。1、 RM文件有可能不对2、 服务源程序有问题(大部分是这里编译不过)3、 编译环境不对。 (INCLUDE 和 LIB)4、 运行时环境(DLL 文件)1 修改 RM 在%TUXDIR%udataobjRM 文件中加入下面

2、的入口: SQL_SERVER;msqlsrvxa1;%TUXDIR%libxaswitch.obj xaswitch.obj文件可以从 Microsoft Visual Studio 6.0或 Microsoft Visual Studio.NET的安装目录是找到,安装 SQL SERVER 2000后并不会安装这个文件,最好在磁盘上 search一下,并把它复制到%TUXDIR%lib目录。注意:msqlsrvxa1 最后一个是字符“1” ,我看到网上好多帖,由于这个不对,所以后面不能成功编译成功TMS。2 创建 TMS buildtms -o %TUXDIR%binTMS_SQL2000

3、 -r SQL_SERVER 创建 TMS是会产生两个警告: Warning 1: LINK : warning LNK4098: defaultlib “LIBC“ conflicts with other libs; use /NODEFAULTLIB:library Warning 2: LINK : warning LNK4049: locally defined symbol “_msqlsrvxa1“ imported 说明: buildtms 认为 XA switch是一个 DLL,比如/SQL,/D,/Q,但却把 SQL2000的 XA switch放到一个obj模块中,因此

4、buildtms给出 defined symbol “_msqlsrvxa1“ imported“的警告,可以忽略它。3 修改 UBB文件 在*GROUPS 段中创建一个组: *GROUPS APPGRP LMID=SITE1 GRPNO=1 TMSNAME=TMS_SQL2000 TMSCOUNT=3 OPENINFO =“SQL_SERVER:Tm=TUXEDO,RmRecoveryGuid=66AC3AB4-7AC2-4724-8A15-4C409BDF40AA“ CLOSEINFO=“SQL_SERVER:Tm=TUXEDO,RmRecoveryGuid=66AC3AB4-7AC2-4

5、724-8A15-4C409BDF40AA“ *SERVERS FETCH SRVID=1 SRVGRP=APPGRP CLOPT=“-A“ *SERVICES FETCH注意: TMSNAME=TMS_SQL2000 OPENINFO= CLOSEINFO= 这三个参数都是必须的。对于 OPENINFO和 CLOSEINFO,第一部分 SQL_SERVER是 RM文件入口,第二部分是 TP Monitor的名字,这里,我们使用 TUXEDO作为 TM,所以 Tm=TUXEDO,第三部分是一个 GUID,它是一个全局唯一标识码,没什么意义,可以由 Visual Studio的 guidgen生

6、成,也可以由 TUXEDO的 uuidgen生成,Microsoft Distributed Transaction Coordinator用它来作 SQL2000的事务协调。 如使用 guidgen来生成,界面如下: 点击“Copy”把 UUID拷贝出来,PASTE 到我们的 RM文件中。注意:OPENINFO 和 CLOSEINFO中的RmRecoveryGuid 应该保持一致。 4 编写 SQC程序 注意:服务器程序有问题,很多人编译通不过,我改了其中有问题的,删掉了一些,都用红色标出来了。这里提供了一个小例子,用于从 SQL2000的 Northwind数据库中 FETCH员工信息,下

7、面是服务进程代码,文件名为 FETCH.sqc: #include “atmi.h“ #include “fml32.h“ #include “userlog.h“ #include “employee.h“ #include “empflds.h“ #include #include long SQLCODE; EXEC SQL INCLUDE sqlca; EXEC SQL BEGIN DECLARE SECTION; char szServerDatabase20; char szLoginPassword20; EXEC SQL END DECLARE SECTION; tpsvrin

8、it(int argc, char *argv) argc = argc; argv = argv; userlog(“*tpsvcinit()*n“); if (tpopen() = -1) userlog(“tpopen failed“); return -1; strcpy(szServerDatabase, “JQ.Northwind“);/格式为:服务器名.数据库名 strcpy(szLoginPassword, “sa.sa“);/格式为:用户.密码 EXEC SQL CONNECT TO :szServerDatabase USER :szLoginPassword; if (S

9、QLCODE = 0) userlog(“Connection to SQL Server establishedn“); else userlog(“ERROR: Connection to SQL Server failedn“); return (-1); return(0);void tpsvrdone()userlog(“*tpsvrdone()*n“);EXEC SQL DISCONNECT ALL; if(tpclose()=-1) userlog(“tpdone()failure:%sn“,tpstrerror(tperrno);void FETCH(TPSVCINFO *tr

10、ansb) int i=0;EXEC SQL BEGIN DECLARE SECTION; struct employee short EmployeeID; char LastName20; char FirstName10; char Title30; emp; EXEC SQL END DECLARE SECTION;EXEC SQL SET OPTION LOGINTIME 10; EXEC SQL SET OPTION QUERYTIME 100; EXEC SQL SET CURSORTYPE CUR_BROWSE;EXEC SQL DECLARE C1 CURSOR FOR SE

11、LECT EmployeeID, LastName, FirstName, Title FROM Employees;EXEC SQL OPEN C1; while( SQLCODE = 0 ) EXEC SQL FETCH C1 INTO :emp; if(SQLCODE=0)userlog(“%d %s %s %sn“, emp.EmployeeID, emp.LastName, emp.FirstName, emp.Title ); if(Fchg32(transb-data, EMPLOYEEID,i, (char*)5 编写客户程序 客户程序用于请求 FETCH服务,显示返回的员工信

12、息,它用到了一个 VIEW32和 FML32。VIEW32 定义如下:VIEW employee short EmployeeID EMPLOYEEID 1 - 0 - string LastName LASTNAME 1 - 20 “ string FirstName FIRSTNAME 1 - 10 “ string Title TITLE 1 - 30 “ END FML32字义如下: *base 100 EMPLOYEEID 1 short - LASTNAME 2 string - FIRSTNAME 3 string - TITLE 4 string 生成的 employee.h为

13、: struct employee short EmployeeID; /* null=1 */ char LastName20; /* null=“0“ */ char FirstName10; /* null=“0“ */ char Title30; /* null=“0“ */ ; 生成的 empflds.h为 #define EMPLOYEEID (FLDID32)101) /* number: 101 type: short */ #define LASTNAME (FLDID32)167772262) /* number: 102 type: string */ #define F

14、IRSTNAME (FLDID32)167772263) /* number: 103 type: string */ #define TITLE (FLDID32)167772264) /* number: 104 type: string */ 客户程序如下: #include #include “atmi.h“ /* TUXEDO Header File */ #include “FML32.h“ #include “empflds.h“ #if defined(_STDC_) | defined(_cplusplus) main(int argc, char *argv) #else

15、main(argc, argv) int argc; char *argv; #endif char *sendbuf, *rcvbuf, *ptr; char *msg = “Tuxedo is powerful!“; long sendlen, rcvlen; int ret; FLDOCC32 oc = 0; int rowcount=0; short EmployeeID; char LastName20; char FirstName10; char Title30; /* Attach to System/T as a Client Process */ if (tpinit(TP

16、INIT *) NULL) = -1) (void) fprintf(stderr, “Tpinit failedn“); exit(1); /* Allocate STRING buffers for the request and the reply */ if(sendbuf = (char *) tpalloc(“FML32“, NULL, 2048L) = NULL) (void) fprintf(stderr,“Error allocating send buffern“); tpterm();exit(1);if(rcvbuf = (char *) tpalloc(“FML32“

17、, NULL, 2048L) = NULL) (void) fprintf(stderr,“Error allocating receive buffern“); tpfree(sendbuf);tpterm();exit(1);/* Request the service TOUPPER, waiting for a reply */ ret = tpcall(“FETCH“, (char *)sendbuf, 0, (char *) if(ret = -1) (void) fprintf(stderr, “Cant send request to service TOUPPERn“); (

18、void) fprintf(stderr, “Tperrno = %dn“, tperrno); tpfree(sendbuf); tpfree(rcvbuf);tpterm(); exit(1); oc = Foccur32(FBFR32 *)rcvbuf, EMPLOYEEID);printf(“EmployeeIDtLastNamettFirstNametTitlen“); while(rowcountoc) (void)Fget32(FBFR32 *)rcvbuf,EMPLOYEEID,rowcount,(char *) (void)Fget32(FBFR32 *)rcvbuf,LAS

19、TNAME,rowcount,(char *) (void)Fget32(FBFR32 *)rcvbuf,FIRSTNAME,rowcount,(char *) (void)Fget32(FBFR32 *)rcvbuf,TITLE,rowcount,(char *) rowcount+;printf(“%dtt%st%st%sn“,EmployeeID,LastName,FirstName,Title); /* Free Buffers tpfree(rcvbuf); tpterm(); return(0);6 编译客户机和服务器 编译客户机: buildclient -o simpcl -f

20、 simpcl.c 编译服务器: nsqlprep FETCH.sqc /NOSQLACCESS注意:nsqlprep 可以在 SQL SERVER安装目录 X86BINN下找到,相应的 DLL的是在这目录下可以找到buildserver -f FETCH.c -o FETCH -s FETCH -r SQL_SERVER -l sqlakw32.lib -l caw32.lib -l ntwdblib.lib 7 设置环境变量 echo off set TUXDIR=G:beatuxedo set SQL_HOME=C:Program FilesMicrosoft SQL Server se

21、t PATH=%TUXDIR%bin;.;%PATH%;C:SQL2000MSSQLBinn;%SQL_HOME%80ToolsBinn 注意:C:SQL2000MSSQLBinn(为 SQL SERVER安装目录的 X86BINN)set APPDIR=C:TuxDAPsolutionsdbmssql2000 set TLOGDEVICE=C:TuxDAPsolutionsdbmssql2000TLOG set TUXCONFIG=%APPDIR%tuxconfig set VIEWFILES32=employee.VV set VIEWDIR32=%APPDIR% set FIELDTBL

22、S32=empflds set FLDTBLDIR32=%APPDIR% SET include=%SQL_HOME%80ToolsDevToolsInclude;%include% 注意:%SQL_HOME%80ToolsDevToolsInclude(一般安装 SQL SERVER时没有装这个。这就要包括 SQL SERVER的安装目录下的 DEVTOOLSINCLUDE)set include=G:beatuxedoinclude;%include% SET lib=%SQL_HOME%80ToolsDevToolsLib;%lib% 注意:%SQL_HOME%80ToolsDevToo

23、lsLib(为 SQL SERVER安装目录下的 DEVTOOLSX86LIB)注意:%TUXDIR%include 目录下的几个头文件全部要改名,分别为 sqlca.h, sqlcode.h, sqlda.h8 启动 WINDOWS的 Distributed transaction coordinate服务 在 Microsoft的 DNA体系中,使用 MSDTC来作全局事务协调,TUXEDO 只有通过 MSDTC才能管理 SQL2000的事务,因此要先启动 MSDTC,方法和界面如下:注意:如果 MSDTC没有启动,在启动 TMS_SQL2000时,TUXEDO 系统会试着去启动 MSDTC,如果 MSDTC不能正常启动,TMS_SQL2000 将会启动失败,不信你就把 MSDTC服务设置为禁用试试看! 9 加载配置文件,启动 tmloadcf y ubbconfignt tmboot -y 成功启动后界面如下: 执行客户程序测试,结果如下: 欢迎大家联系交流,谢谢你的支持!

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 实用文档 > 说明文书

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报