VB6.0调用WebServices的简单示例

  在.NET平台中期望值最高,广告做的最多的要算是WebServices了。WebServices是Web上的类,与Web应用程序不同的是,这个类不返回HTML页面,只以XML文档返回一个或几个值。因此,任何能够处理XML的应用程序都可以调用其方法和使用其结果。WebServices更多是Internet上的应用,不过小型企业内部系统开发使用WebServices,也有许多好处。个人认为,与COM+和DCOM相比,从布置到维护,WebServices更胜一筹。同时,从COM数据据传输转换到XML大大提高了应用程序的伸缩性和相互操作性,对不同的需求,可以用不同的语言开发相应的应用程序,并共享数据。 这里不深入探讨WebServices和XML,只示例通过VB6.0调用VS2005编译的WebServices。

  作为VB6.0的程序员和爱好者,数据库开发中的ADO 2.0是再熟悉不过的了。不过.NET平台对ADO的结构体系作了扩展,增加了组件,解决了其不足,优化了性能,也就是ADO.NET。与熟悉的ADO相比,已经有太多的不同。那么,如何在VB6.0中通过WebServices获取记录集呢?示例如下:

' ==================== WebServices的代码 ===================

' 首先要在COM组件中添加ADO

Imports  System.Web
Imports  System.Web.Services
Imports  System.Web.Services.Protocols
Imports  System.Data
Imports  System.Data.Odbc
Imports  System.Configuration.ConfigurationManager
Imports  System.Xml
Imports  ADODB

< WebService( Namespace:="http://tempuri.org/")> _
<WebServiceBinding(ConformsTo:=WsiProfiles.BasicProfile1_1)> _
<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _
Public Class TEST
    
Inherits System.Web.Services.WebService

    
'读取config中的连接字符串
    Public Function cnString() As String
        
Return ConnectionStrings("connToPgSql").ToString()
    
End Function


  
'ADO记录集转换为XML
    <WebMethod()> _
    
Public Function RecordsetToXmlTest(ByVal Uid As StringAs XmlDataDocument

        
Dim sql As String = "select * from  where uid='" & Uid & "'"
        Dim cn As New Connection
        
Dim rs As New Recordset
        
Dim st As New Stream
        
Dim xd As New XmlDataDocument

        cn.ConnectionString 
= cnString
        cn.Open()

        rs.Open(sql, cn, CursorTypeEnum.adOpenForwardOnly, LockTypeEnum.adLockReadOnly, 
1)
        rs.Save(st, PersistFormatEnum.adPersistXML)
        st.Flush()
        st.Position 
= 0
        xd.LoadXml(st.ReadText(st.Size))

        
Return xd

        st 
= Nothing
        rs 
= Nothing
        cn 
= Nothing
        xd 
= Nothing

    
End Function


End Class



''======================== VB6.0 的代码 ======================

'引用 Microsoft XML, v6.0
'
引用 Microsoft ActiveX Data objects 2.x Library

    
Dim oHTTP As XMLHTTP
    
Dim oXmlDoc As DOMDocument
    
Dim rs As ADODB.Recordset
    
Dim strURL As String, strRequest As String
    
    strURL 
= "http://localhost/BWR/TEST.asmx/RecordsetToXmlTest"
    strRequest 
= "Uid=admin"
    
    
Set oHTTP = New XMLHTTP
    oHTTP.Open 
"POST", strURL, False
    oHTTP.setRequestHeader 
"Content-Type""application/x-www-form-urlencoded"
    oHTTP.send (strRequest)
    
    
Set oXmlDoc = New DOMDocument
    oXmlDoc.Load oHTTP.responseXML
    
'oXmlDoc.Save (App.Path & " s.xml")
    
    
Set rs = New ADODB.Recordset
    rs.Open oXmlDoc
    
While Not rs.EOF
        Debug.Print rs(
"uid"& rs("username"& rs("pwd")
        rs.MoveNext
    Wend

    
Set XMLHTTP = Nohting
    
Set DOMDocument = Nothing
    
Set rs = Nothing

  其实WebServices通过紧密集成XML而提供相互操作性,从上面的代码中也可以看出,WebServices是以XML文档返回ADO记录集的。所以我们可以完全放弃ADO,而是用ADO.NET相关对象,通过WebServices返回XML文档。下面的示例就是WebServices返回ADO.NET的DataSet:

' ========================== WebServices代码 ============================

'DataSet和XmlDataDocument是同步的,可以根据情况直接返回DataSet,XML包含的信息多

< WebMethod() >  _
    
Public   Function DataSetToXmlTest() As XmlDataDocument

        
Dim sql As String = "select * from material"
        
Dim cn As OdbcConnection = New OdbcConnection(cnString.ToString())
        
Dim da As OdbcDataAdapter = New OdbcDataAdapter(sql, cn)
        
Dim ds As New DataSet

        cn.Open()
        da.Fill(ds, 
"material")
        cn.Close()

        
Dim xmlDoc As XmlDataDocument = New XmlDataDocument(ds)
        
Return xmlDoc

    
End Function



' ======================= VB6的代码 ============================

 
Dim  oHTTP  As  XMLHTTP
    
Dim  oXmlDoc  As  DOMDocument
    
Dim  strWebserviceURL  As   String
    
    strWebserviceURL 
=   " http://localhost/BWR/TEST.asmx/DataSetToXmlTest "
    
Set  oHTTP  =   New  XMLHTTP
    oHTTP.Open 
" POST " , strWebserviceURL,  False
    oHTTP.setRequestHeader 
" Content-Type " " application/x-www-form-urlencoded "
    oHTTP.send 
    
    
Set  oXmlDoc  =   New  DOMDocument
    oXmlDoc.Load oHTTP.responseXML
    
' oXmlDoc.Save (App.Path & "ds.xml")
    
    
' 查询
     Dim  oXmlNode  As  IXMLDOMNode
    
Dim  oXmlNodes  As  IXMLDOMNodeList
    
Set  oXmlNodes  =  oXmlDoc.documentElement.selectNodes( " material[cat='VCD-S'] " )
    
' 得到xml文档中cat="VCD-S"的所有集合
     For   Each  oXmlNode  In  oXmlNodes
        Debug.Print oXmlNode.Text
    
Next
    
Set  oHTTP  =   Nothing
    
Set  oXmlDoc  =   Nothing
    
Set  oXmlNode  =   Nothing
    
Set  oXmlNodes  =   Nothing


    

   对于WebServices返回常用的数据类型和数组,除了上面的调用方法之外,还可用Soap相关对象直接得到数据,下面是返回String数组的示例:

' =============================== WebServices代码 ===============================

 
< WebMethod() >  _
    
Public   Function ArrayTest(ByVal i As ShortByVal j As ShortAs String()
        
Dim s(2As String
        s(
1= "A;" & (i + j)
        s(
2= "B;" & (i - j)
        
Return s
    
End Function



' =================================== VB 代码 =================================

' 引用 Microsoft Soap Type Library


    
Dim  oSC  As   New  SoapClient
    
Dim  s()  As   String
    
Dim  i  As   Integer
    
    oSC.ClientProperty(
" ServerHTTPRequest " =   True
    oSC.mssoapinit (
" http://localhost/BWR/TEST.asmx?WSDL " )
    s 
=  oSC.ArrayTest( 9871 250 )
    
Set  oSC  =   Nothing
    
    
For  i  =   0   To   UBound (s)
        Debug.Print s(i)
    
Next

  让人惊喜的是WebServices可以自定义数据类型,如果是.NET平台,你可以在客户端直接声明WebServices中自定义的数据类型。VB6这样做当然是不行的了,不过你依然可以通过其返回的XML得到你想要的数据。下面的示例是,VB6调用WebServices通过ArrayLis返回的一个WebServices自定义数据类型的集合:


' =============================== WebServices代码 ===============================

     
' 自定义结构
     Public   Structure WSType
        
Dim CName As String         '客户
        Dim PName As String         '产品名称
        Dim Qty As Short            '交易数量
        Dim Price As Decimal        '交易价格
        Dim SoDate As String        '交易日期
    End Structure


    
' 这个服务必须
     < WebMethod() >  _
    
Public   Function GetWSType(ByVal cName As StringByVal pName As String, _
    
ByVal Qty As ShortByVal Price As DecimalByVal soDate As StringAs WSType

        
Dim mWSType As New WSType
        mWSType.CName 
= cName
        mWSType.PName 
= pName
        mWSType.Qty 
= Qty
        mWSType.Price 
= Price
        mWSType.SoDate 
= soDate
        
Return (WSType)

    
End Function


    
< WebMethod() >  _
    
Public   Function GetTBWebInfo(ByVal soDate As DateAs ArrayList

        
Dim sql As String = "select * from soitem where sodate='"& soDate &"'"
        
Dim cn As OdbcConnection = New OdbcConnection(cnString.ToString())
        
Dim da As OdbcDataAdapter = New OdbcDataAdapter(sql, cn)
        
Dim ds As New DataSet
        
Dim wt As WSType
        
Dim arr As New ArrayList

        cn.Open()
        da.Fill(ds, 
"soitem")
        cn.Close()
        
        
Dim r As DataRow
        
For Each r In ds.Tables(0).Rows
            wt 
= New WSType
            wt
= GetWSType( r.Item("cname"),r.Item("pname"), _
        r.Item(
"qty"),r.Item("price"),r.Item("soDate"))
            arr.Add(wt)
        
Next

        
Return arr

    
End Function


' =================================== VB 代码 =================================

    
Dim  oHTTP  As  XMLHTTP
    
Dim  oXmlDoc  As  DOMDocument
    
Dim  oXmlNode  As  IXMLDOMNode
    
Dim  oXmlNodes  As  IXMLDOMNodeList      
    
Dim  oXmlNodeChd  As  IXMLDOMNode
    
Dim  oXmlNodeChds  As  IXMLDOMNodeList  
    
Dim  strWebserviceURL  As   String , strRequest  As   String
 
Dim  i  As   Integer , row  As   Integer
 
    strWebserviceURL 
=   " http://localhost/BWR/TBWeb.asmx/GetTBWebInfo "
    strRequest 
=   " strWeb=2007-08-30 "      ' 传递参数
     Set  oHTTP  =   New  XMLHTTP
    oHTTP.Open 
" POST " , strWebserviceURL,  False
    oHTTP.setRequestHeader 
" Content-Type " " application/x-www-form-urlencoded "
    oHTTP.send (strRequest) 
    
    
' 载入回转的xml(一个带有WS自定义类型的arraylist)
     Set  oXmlDoc  =   New  DOMDocument
    oXmlDoc.Load oHTTP.responseXML
    
' oXmlDoc.Save (App.Path & "aTB.xml")
    
    
' 从xml中获取相关信息,并显示
     Set  oXmlNodes  =  oXmlDoc.documentElement.selectNodes( " anyType " )
    
    fg.Clear   
' fg是表格控件
     Call  Fg_Initialize
    
    
For   Each  oXmlNode  In  oXmlNodes
        i 
=   1
        
Set  oXmlNodeChds  =  oXmlNode.childNodes
        
With  fg
            .Rows 
=  .Rows  +   1
            row 
=  .Rows  -   1
            
For   Each  oXmlNodeChd  In  oXmlNodeChds
                .TextMatrix(row, i) 
=  oXmlNodeChd.Text
                i 
=  i  +   1
            
Next
        
End   With
    
Next

    
Set  oHTTP  =   Nothing
    
Set  oXmlDoc  =   Nothing
    
Set  oXmlNodeChd  =   Nothing
    
Set  oXmlNodeChds  =   Nothing
    
Set  oXmlNode  =   Nothing
    
Set  oXmlNodes  =   Nothing

 

  以上是工作中遇到的问题,主要就是在传统POS机(800M的CPU,32M内存,WIN98系统)上,通过VB调用WebServices实现了,对FreeBSD平台下PostgreSQL数据库的读写,感觉挺好......

 

你可能感兴趣的:(VB6.0基础编程)