精华区 [关闭][返回]

当前位置:网易精华区>>讨论区精华>>编程开发>>● VFP>>〖多层应用〗>>自动服务程序框架

主题:自动服务程序框架
发信人: 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 

[关闭][返回]