之前做的一些系统中都涉及将本地数据上传到远程数据库服务器,或者将远程数据库服务器的数据下载的本地,都不知道用那种方式实现更方便,更安全,在此向大伙请教。我曾经用这样的方式实现在远程服务器写一个ASP文件接收数据如:<%If Request.ServerVariables("REQUEST_METHOD")="POST" Then
ON ERROR RESUME NEXT
Dim AttendArray
Dim ResStr
Set xmldom=Server.CreateObject("Microsoft.XMLDOM")
Set Obj=Server.CreateObject("SAS.SHIFT")
xmldom.load(Request)
Set Rs=Server.CreateObject("ADODB.Recordset")
Rs.Open xmldom
AttendArray=Rs.GetRows 
If IsArray(AttendArray) Then
ResStr=Obj.AddAttendRecord(AttendArray)
End If
If Err.number =0 Then
Response.Write "OK"
Set xmlResult=Server.CreateObject("Microsoft.XMLDOM")
xmlResult.save(Response)
Set xmlResult=Nothing
Else
Response.Write "NO"
Set xmlResult=Server.CreateObject("Microsoft.XMLDOM")
xmlResult.save(Response) 
Set xmlResult=Nothing
End If
End If
%>
客户端这样写的    Dim Url As String    Url = "http://" & ServerName & "/shift/AddAttendRecord.asp"
    
    Dim Conn As ADODB.Connection
    Dim rs As ADODB.Recordset
    Dim Strm As ADODB.Stream
    Dim XMLHttp As XMLHTTPRequest
    Dim ObjSas As InstantPassCls.clsSAS
    Dim AttendArray As Variant
    Dim i As Integer
    Set rs = New ADODB.Recordset
    Set ObjSas = New InstantPassCls.clsSAS
    AttendArray = ObjSas.GetUploadRecord
    
    If IsArray(AttendArray) Then
        
        With rs.Fields
            .Append "StaffNo", adBSTR
            .Append "Time", adBSTR
            .Append "AttendType", adBSTR
        End With
        rs.Open
        With rs
            For i = 0 To UBound(AttendArray, 2)
                .AddNew
                .Fields("StaffNO") = AttendArray(0, i)
                .Fields("Time") = AttendArray(1, i)
                .Fields("AttendType") = AttendArray(2, i)
                .Update
            Next i
        End With
        
        Set Strm = New ADODB.Stream
        rs.Save Strm, adPersistXML
        Set XMLHttp = New XMLHTTPRequest
        XMLHttp.Open "POST", Url, False
        XMLHttp.send Strm.ReadText
        
        If Err.Number = 0 Then
            UPloadData = XMLHttp.responseText
            Sleep (10000)
            'If Left(UPloadData, 2) = "NO" Then
            If InStr(1, UPloadData, "NO") > 0 Then
                UPloadData = LoadResString(5038)
                WriteLog 4, "Upload data failed"
            End If
            'If Left(UPloadData, 2) = "OK" Then
            If InStr(1, UPloadData, "OK") > 0 Then
                ObjSas.MarkRecord
                WriteLog 4, "Upload data success"
                UPloadData = LoadResString(5037)
            End If
        Else
            UPloadData = LoadResString(5036)
            WriteLog 4, "Upload data failed"
        End If
    
    Else
        UPloadData = LoadResString(5035)
    End If
    
    Set ObjSas = Nothing
    Set rs = Nothing
这样传送觉得不是很稳定,尤其是数据量大的时候经常出现超时问题后来曾经用SOAP实现调用远程服务器函数,但觉得那样配置比较麻烦,除了IIS要配置可解析WSDL文件外,客户端安装SOAP组件比较麻烦。我一直想,能不能通过ADO直接连接远程数据库,其实觉得那样做应该是没有问题,但我从来没有那么做。请大家说说各自都是如何实现的。那种方法更加安全,稳定

解决方案 »

  1.   

    我的个人观点:
    1.vb传送数据比较麻烦,不能把结果集提交到服务端,只能字符串或者xml传输。
    后来曾经用SOAP实现调用远程服务器函数,但觉得那样配置比较麻烦,除了IIS要配置可解析WSDL文件外,客户端安装SOAP组件比较麻烦。
    2.要解析wsdl文件,可能装.net环境,客户端必须安装soap组件。
    而且webservice可以返回dataset,但是vb必须xml化才能接受。
    能不能通过ADO直接连接远程数据库,其实觉得那样做应该是没有问题,但我从来没有那么做。
    3.可以,但是安全性降低。可以考虑
    1.我用pb作过,比较优秀,直接将本地数据拷贝到远程
    2.delphi没有试过,但是它有远程数据模块,估计也没有问题
    3.下载数据都没有问题。只要能从服务端得到数据显示到客户端,应该没有问题。
    4.可以使用webservice,但是没有试过返回纪录集的情况
    5.如果com+,下载是没有问题的,上传数据也比较麻烦
      

  2.   

    online说的有道理,PB我没有做过,我不知道它是如何实现直接将本地数据拷贝到远程
      

  3.   

    后来曾经用SOAP实现调用远程服务器函数,但觉得那样配置比较麻烦,除了IIS要配置可解析WSDL文件外,客户端安装SOAP组件比较麻烦。
    这个你怎么做的?
    返回纪录集,如何调用??
      

  4.   

    ,PB我没有做过,我不知道它是如何实现直接将本地数据拷贝到远程
    1。建立服务端程序,来响应客户端的连接
    2。连接成功后,本地检索数据窗,得到数据,形成blob数据类型,
    调用远程组件,将blob数据传输到远程,在远程还远成数据窗,然后update
      

  5.   

    在vb中编写一个DLL组件,用SOAP WSDL Generator(安装组件后有这个工具)生成wsdl文件,在这个DLL组件里面使用ado打开数据库,用RECORDSET记录返回recordset 的getrows,如Public SOAPClient As MSSOAPLib30.SoapClient30
        Set SOAPClient = New MSSOAPLib30.SoapClient30
        SOAPClient.MSSoapInit "http://" & ServerAddr & "/SASService/SASService.WSDL", "", ""
    调用远程函数
    ReturnValue = SOAPClient.GetACLList(TerminalID, CompanyCode)GetACLList就是远程服务器端函数,返回的是记录集
      

  6.   

    首先在vb中建立一个”标准EXE”的工程。添加引用:Microsoft  Soap  Type  library。注意:如果没有安装Microsoft  Soap  Toolkit,是没有这个类型库的。 
    可以在http://www.ourfly.com中下载。 
    添加一个text 
    Private  Sub  Form_Load() 
            Text1.Text  =  add() 
    End  Sub Public  Function  Add()  As  String 
    Dim  objSoapClient  As  New  SoapClient 
            objSoapClient.ClientProperty("ServerHTTPRequest")  =  True 
    Call  objSoapClient.mssoapinit("http://localhost/webserver/service1.asmx?WSDL",  "Service1",  "Service1Soap") 
    这句也可以 
    objSoapClient.mssoapinit("http://localhost/webserver/service1.asmx?WSDL")         Add  =  objSoapClient.Show("龙卷风.NET") 
    End  Function 
    这是我以前写的,差不多我在delphi论坛问了,还没有结果
    http://expert.csdn.net/Expert/topic/1836/1836745.xml?temp=6.556338E-02
      

  7.   

    看来大伙对这个问题不是很感兴趣上传下载的数据包含二进制数据等等,我找不出更好的办法了,只能通过ADO连接远程数据库了