发信人: hunter__fox(雁回西楼)
整理人: foxzz(2004-10-12 09:38:33), 站内信件
|
这是一个自动服务程序的框架,建立一个工程,将之加入工程中,编译,然后将工程-->选项里将Description里选为Server类.再次编译.
生成EXE后,即可建立服务.
&& 此类的DoSQL返回的是一个XML文件
&& 如果服务出错,可能是因为超出了变量字符串长度限制,应当限制查询返回的数量.
&& 默认情况下,并不限制查询的返回数量
&& 如果需要,可以将 lReturnCount 属性置为.T.启用这一限制
&& 通过 nReturnCount 可以重新指定默认返回的记录数量,初始情况,它是 100
&& hunter 2004-09-28
&& hunter 2004-09-29
Define Class Server As Custom OlePublic
cDriverType = "SQL Server" && 数据服务器类型
cServer = "mycomputer" && 服务器名
cUid = "sa" && 登录帐号
cPwd = "12345678" && 口令
cDatabase = "apetest" && 数据库名
nHand = 0 && 连接句柄,为0表示没有连接
lReturnCount = .F. && 是否限定返回记录的数量
nReturnCount = 0 && 返回记录最大数量
lConnected = .F. && 是否连接到一个可用的数据服务
&&===========================================================================
&& 代码部分
&&===================================
Procedure Init
&& 这里可以加入读取设置的代码,如,
&& 从一个表中读取SQLStringConnect所用的server,uid等信息
&& 初始化建立连接
This.ConnectDatabase()
EndProc
&&===================================
Procedure Unload
&& 退出时关闭连接
This.DisConnectDatabase()
EndProc
&&===================================
&& lConnected 属性只读
Procedure lConnected_Assign(eConnected)
&& lConnected 对外只读
Return This.Connected
EndProc
&&===================================
&& GetConnectInfo 用于查看关于数据连接的信息
&& 如果需要知道连接是否可用,请使用 Conneced 属性
Procedure GetConnectInfo
&& 返回关于连接的信息
If nHand > 0
Return "[" + This.cUid + "] connection to " + ;
"[" + This.cServer + "]." + ;
"[" + This.cDriverType + "]." + ;
"[" + This.cDatabase + "]"
Else
Return "Don't connect any database server."
EndIf
EndProc
&&===================================
&& 连接到数据服务
Procedure ConnectDatabase
&& 如果有连接,则先关闭
&& 确保同一时间只使用一个连接套接字
If This.nHand > 0
This.DisConnectDatabase()
EndIf
This.nHand = SQLStringConnect("driver={" + This.cDriverType + "};" ;
+ "server=" + This.cServer + ";" ;
+ "uid=" + This.cUid + ";" ;
+ "pwd=" + This.cPwd + ";" ;
+ "database="+ This.cDatabase + ";")
This.Conneced = .T.
EndProc
&&===================================
&& 关闭连接
Procedure DisConnectDatabase()
If This.nHand > 0
SQLDisconnect(This.nHand)
This.nHand = 0
This.Conneced = .F.
EndIf
EndProc
&&===================================
&& 执行传入的 TSQL ,返回 XML 可指定返回的记录量
Function DoSQL(cTSQL As String ,nStart As Integer, nTotal As Integer)
If This.nHand = 0&& 没有建立连接
Return ""
EndIf
Local cXml
&& 查询执行成行则转成XML
If SQLExec(This.nHand, cTSQL,"curTmp") > 0
cXml = RetXML("curTmp",nStart,nTotal)
Use In curTmp
Else
cXml = ""
EndIf
Return cXml
EndProc
&&===================================隐含函数
&& 将指定区作区中的数据转换XML格式字串
&& 可指定范围.不改变源表数据.
Protected Function RetXML(cAlias As String,nStrat As Integer, nCount As Integer)
&& 别名检查
If Not(Type("cAlias") = "C")
Return ""
EndIf
If Not Used(cAlias)
Return ""
EndIf
&& 起点检验
If Not(Type("nStrat") = "N") Or (nStart < 0)
nStart = 1
Else
If nStart > Reccount(cAlias)
nStart = Reccount(cAlias)
EndIf
EndIf
&& 结束点检验
If Not(Type("nCount") = "N")
nCount = Reccount(cAlias)
EndIf
If nStart + nCount > Reccount(cAlias) + 1
nCount = Reccount(cAlias) - nStart + 1
EndIf
If (This.lReturnCount) And (nCount > This.nReturnCount)
nCount = This.nReturnCount
EndIf
If nCount < 0
nCount = 0
EndIf
&& 计算结束点
Local nEnd,cRet
nEnd = nStart + nCount - 1
&& 重生成临时表
If Not((nStart = 1) And (nEnd = Reccount(cAlias)))
Select * From (cAlias) ;
Where Between(Recno(),nStart,nEnd) ;
Into Cursor (cAlias +"1")
EndIf
&& 转成XML
cRet = MyXML(cAlias)
Use In (cAlias +"1")
Return cRet
EndFunc
&&===================================隐含函数
&& 对 CursorToXML 函数的包装 ,如果要更改输入格式,修改此函数即可
Protected Function MyXML(cAlias As String)
Local cRet
CursorToXML(cAlias,"cRet",2,2+4+16,0,"1")
Return cRet
EndFunc
EndDefine
---- 作者:hunter__fox【雁回西楼】
来源:网易虚拟社区广州站 VFP版 |
|