VB.NET中WebService数据插入与读取问题求助
解决WebService组件数据传递与返回值读取问题
看起来你遇到的核心问题是没把组件对象正确传入WebService方法的参数集合里,而且调用时传错了对象。另外代码里还有几处语法和类型转换的小问题,我来一步步帮你修正:
1. 修正语法与类型转换的安全问题
你的空值判断代码有语法错误,直接用CDbl转换用户输入还容易抛出异常,建议用Double.TryParse做安全处理:
' 安全处理空值与类型转换,避免输入非数字时崩溃 Dim peso1 As Double = 0 Double.TryParse(TexPeso1.Text, peso1) Dim peso2 As Double = 0 Double.TryParse(TexPeso2.Text, peso2) Dim Peso As Double = Math.Max(peso1, peso2)
2. 正确填充组件集合
根据你的描述,WebService的ZWS_BAS_02方法需要接收I_T_BAS_COMPONENT集合参数。你已经创建了单个组件对象,现在需要把它加入对应集合,再赋值给svc_ZWS_BAS_02的属性:
' 初始化WebService主参数对象 Dim svc_ZWS_BAS_02 As New ServiceReference1.ZWS_BAS_02 ' 创建组件集合(WebService引用通常会生成List(Of 实体类)类型的集合) Dim componentList As New List(Of ServiceReference1.ZWS_BAS_02_COMPONENT) ' 填充组件对象(这里可以添加多个组件,如果你需要插入多组数据) Dim svc_ZWS_BAS_02_COMP As New ServiceReference1.ZWS_BAS_02_COMPONENT svc_ZWS_BAS_02_COMP.AUFNR = TexNOrden.Text svc_ZWS_BAS_02_COMP.WERKS = TexNCentro.Text svc_ZWS_BAS_02_COMP.COMP = TexComponente.Text svc_ZWS_BAS_02_COMP.CHARG = TexLote.Text svc_ZWS_BAS_02_COMP.CHARG2 = TexLoteReal.Text ' 取消注释,补上第5个变量 svc_ZWS_BAS_02_COMP.BDMNG = Peso ' 第6个变量 svc_ZWS_BAS_02_COMP.MEINS = TexUnMedidaCantNotificada.Text ' 第7个变量 ' 补上你的第8个变量,比如: ' svc_ZWS_BAS_02_COMP.YOUR_EIGHTH_FIELD = YourTargetControl.Text ' 将组件对象加入集合 componentList.Add(svc_ZWS_BAS_02_COMP) ' 把集合赋值给主参数对象的对应属性 ' 如果WebService要求数组类型,就用ToArray();如果是List类型直接赋值即可 svc_ZWS_BAS_02.I_T_BAS_COMPONENT = componentList.ToArray()
3. 修正WebService方法调用
现在用填充好的svc_ZWS_BAS_02对象调用方法就没问题了:
' 初始化代理并设置身份凭证 Dim proxy As New ServiceReference1.ZWS_BASClient proxy.ClientCredentials.UserName.UserName = "BASCULA" proxy.ClientCredentials.UserName.Password = "friasBascula" ' 调用方法并获取返回结果 Dim resultado = proxy.ZWS_BAS_02(svc_ZWS_BAS_02)
4. 读取返回的3个变量
调用成功后,resultado对象里包含你需要的返回数据,根据WebService的定义直接访问对应属性即可:
' 示例:根据WebService实际返回结构调整属性名 If resultado IsNot Nothing Then Dim errorCode As String = resultado.ZWS_BAS_02_ERR.ERR_CODE Dim errorMsg As String = resultado.ZWS_BAS_02_ERR.ERR_MSG Dim businessData As String = resultado.YOUR_RETURN_FIELD_NAME ' 替换为实际返回属性名 ' 这里可以把返回值绑定到界面控件,或者做后续业务处理 End If
完整修正后的代码
' Inicializo el WebService , initialize the webservice Dim svc_ZWS_BAS_02 As New ServiceReference1.ZWS_BAS_02 Dim svc_ZWS_BAS_02_ERR As New ServiceReference1.ZWS_BAS_02_ERROR ' 安全处理空值与类型转换 Dim peso1 As Double = 0 Double.TryParse(TexPeso1.Text, peso1) Dim peso2 As Double = 0 Double.TryParse(TexPeso2.Text, peso2) Dim Peso As Double = Math.Max(peso1, peso2) ' ASIGNO VALORES A LAS VARIABLES DE ZWS_BAS_02_COMPONENT , store data on variables Dim componentList As New List(Of ServiceReference1.ZWS_BAS_02_COMPONENT) Dim svc_ZWS_BAS_02_COMP As New ServiceReference1.ZWS_BAS_02_COMPONENT svc_ZWS_BAS_02_COMP.AUFNR = TexNOrden.Text svc_ZWS_BAS_02_COMP.WERKS = TexNCentro.Text svc_ZWS_BAS_02_COMP.COMP = TexComponente.Text svc_ZWS_BAS_02_COMP.CHARG = TexLote.Text svc_ZWS_BAS_02_COMP.CHARG2 = TexLoteReal.Text svc_ZWS_BAS_02_COMP.BDMNG = Peso svc_ZWS_BAS_02_COMP.MEINS = TexUnMedidaCantNotificada.Text ' 补充第8个变量的赋值 ' svc_ZWS_BAS_02_COMP.YOUR_EIGHTH_FIELD = YourControl.Text componentList.Add(svc_ZWS_BAS_02_COMP) svc_ZWS_BAS_02.I_T_BAS_COMPONENT = componentList.ToArray() ' 根据实际类型调整 ' llamo al metodo , call method Dim proxy As New ServiceReference1.ZWS_BASClient ' le paso el usuario y el password , user and password proxy.ClientCredentials.UserName.UserName = "BASCULA" proxy.ClientCredentials.UserName.Password = "friasBascula" Dim resultado = proxy.ZWS_BAS_02(svc_ZWS_BAS_02) ' 现在可以正常调用了 ' 读取返回的3个变量(根据WebService实际结构调整) If resultado IsNot Nothing Then Dim errorCode = resultado.ZWS_BAS_02_ERR.ERR_CODE Dim errorMessage = resultado.ZWS_BAS_02_ERR.ERR_MSG Dim returnValue = resultado.SOME_RETURN_PROPERTY ' 替换为实际属性名 ' 后续处理逻辑 End If
小提示:如果I_T_BAS_COMPONENT的类型是List(Of ...)而非数组,直接把componentList赋值给svc_ZWS_BAS_02.I_T_BAS_COMPONENT即可,不用调用ToArray()。另外返回值的属性名需要你在Visual Studio里查看ZWS_BAS_02方法的返回类型结构来确认。
内容的提问来源于stack exchange,提问作者Ivan Hernandez
相关产品推荐
相关产品推荐

