您的位置:首页 > 编程语言 > VB

VB6.0调用WebServices的简单示例

2007-08-30 14:36 176 查看
  在.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 :Namespace:="http://tempuri.org/")> _


<WebServiceBinding(ConformsTo:=WsiProfiles.BasicProfile1_1)> _


<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _




Public Class TESTClass TEST


Inherits System.Web.Services.WebService




'读取config中的连接字符串




Public Function cnString()Function cnString() As String


Return ConnectionStrings("connToPgSql").ToString()


End Function




'ADO记录集转换为XML


<WebMethod()> _




Public Function RecordsetToXmlTest()Function RecordsetToXmlTest(ByVal Uid As String) As 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()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()Function ArrayTest(ByVal i As Short, ByVal j As Short) As String()


Dim s(2) As 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 WSTypeStructure 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()Function GetWSType(ByVal cName As String, ByVal pName As String, _


ByVal Qty As Short, ByVal Price As Decimal, ByVal soDate As String) As 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()Function GetTBWebInfo(ByVal soDate As Date) As 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数据库的读写,感觉挺好......
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: