如题,webservice中如何传递DbParameter[]类型,
因为在传递的时候,总会提示说webservice的DbParameter[]和系统的DbParameter[]不一致,不能转换?
这个怎么解决啊?

解决方案 »

  1.   

    DbParameter 类型会在客户端本地生成代理类型,和系统的并不一样。你可以WebMethod里再创建一个系统的DbParameter,
    自己将传过来的DbParameter里的属性Copy到里面。
      

  2.   

    服务端:
    [WebMethod]
    [XmlInclude(typeof(System.Data.OleDb.OleDbParameter))]
    public void SetParameters(DbParameter[] dbParams)
    {
        foreach (var p in dbParams)
            Console.WriteLine(p.DbType);
    }客户端:using (var client = new WebSvc.Service1SoapClient())
    {
        var param1 = new WebSvc.OleDbParameter();
        param1.DbType = WebSvc.DbType.String;
        param1.ParameterName = "@test";
        param1.Value = "value";
        client.SetParameters(new[] { param1 });
    }
      

  3.   

    webservice中实现如下的一个方法WebService的DbParameter ConvertDbParameter(系统的DbParameter p)
    {
       WebService的DbParameter con = new ...
       con.属性1 = p.属性x;
       con.属性2 = p.属性y;
       ...   return con;
    }
      

  4.   


    郁闷,我的webservice在客户端是动态生成dll调用的,
    貌似不能直接引用webservice里的定义的类型啊
      

  5.   

    那杯具了这样的话,WebMethod不要传抽象类。
      

  6.   


    我说一下我现在的工作内容,
    我现在是把DB的操作,包括增删改的方法都挪到了webservice上,
    把webservice作为访问数据库的中间件,是动态生成dll引用的,
    查询和删除都没有问题,因为传递类型都是string,DataTable,DataSet,
    就是增加和修改的时候,原来框架的一些方法涉及到DbParameter[]的传递,
    折腾了好久还是没搞掂。大家帮帮忙啊,
    谢谢
      

  7.   

    谢谢 fangxinggood 的帮忙~~ 呵呵
      

  8.   

    不知道你的动态dll怎么生成的?CodeDom的吧?如果是,你可以反射创建实例。不过这样的应用效率很差。
    另外枚举传递的有问题。这个还没仔细研究。var url = "http://localhost:2284/Service1.asmx";
    var proxy = CreateWebService(url, "MyWebSvc");var param1 = proxy.CreateInstance("MyWebSvc.OleDbParameter");
    var param2 = proxy.CreateInstance("MyWebSvc.OleDbParameter");SetValue(param1, "ParameterName", "@test1");
    SetValue(param1, "Value", "test1");
    SetValue(param2, "ParameterName", "@test2");
    SetValue(param2, "Value", "test2");
    var baseType = proxy.GetType("MyWebSvc.DbParameter");
    var parameters = Array.CreateInstance(baseType, 2);
    parameters.SetValue(param1, 0);
    parameters.SetValue(param2, 1);var client = proxy.CreateInstance("MyWebSvc.Service1");
    var method = client.GetType().GetMethod("SetParameters");
    var result = method.Invoke(client, new object[] { parameters });
    Console.WriteLine(result);
      

  9.   

    问题始终没有很好的解决,
    最后,采用的是客户端把DbParameter[]转换成DataTable,
    WebService再把DataTable转换回Dbparameter的方法,
    方法有点笨,要是实在没有好的办法,只好结贴了呜呜
      

  10.   

    你也没说你是怎么动态生成dll的如果是用 ServiceDescriptionImporter 动态生成的客户端代理,那么它一定会把 Soap 协议规定以外的对象,生成到你定义的namespace底下。而不是使用 System.Data.Common.DbParameter 如果自己封装soapMessage还有可能
      

  11.   


            /// <summary>
            /// 创建webservice的DLL
            /// </summary>
            /// <param name="url">WebService服务地址</param>
            /// <param name="nameSpace">命名空间</param>
            /// <param name="dllName">DLL名称</param>
            public static void CreateDLL(string url, string nameSpace, string dllName)
            {
                WebClient client = new WebClient();
                Stream stream = client.OpenRead(url + "?WSDL");
                ServiceDescription description = ServiceDescription.Read(stream);            //创建客户端代理代理类
                ServiceDescriptionImporter importer = new ServiceDescriptionImporter();            //指定访问协议
                importer.ProtocolName = "Soap";
                //生成客户端代理
                importer.Style = ServiceDescriptionImportStyle.Client;
                importer.CodeGenerationOptions = CodeGenerationOptions.GenerateProperties | CodeGenerationOptions.GenerateNewAsync;
                //添加WSDL文档
                importer.AddServiceDescription(description, null, null);            //命名空间
                CodeNamespace nmspace = new CodeNamespace();
                nmspace.Name = nameSpace;
                CodeCompileUnit unit = new CodeCompileUnit();
                unit.Namespaces.Add(nmspace);            ServiceDescriptionImportWarnings warning = importer.Import(nmspace, unit);
                CodeDomProvider provider = CodeDomProvider.CreateProvider("CSharp");            CompilerParameters parameter = new CompilerParameters();
                parameter.GenerateExecutable = false;
                parameter.OutputAssembly = dllName;//输出程序集的名称
                parameter.ReferencedAssemblies.Add("System.dll");
                parameter.ReferencedAssemblies.Add("System.XML.dll");
                parameter.ReferencedAssemblies.Add("System.Web.Services.dll");
                parameter.ReferencedAssemblies.Add("System.Data.dll");            CompilerResults result = provider.CompileAssemblyFromDom(parameter, unit);
                if (result.Errors.HasErrors)
                {
                    // 显示编译错误信息
                }
            }
      

  12.   


            /// <summary>
            /// 创建webservice的DLL
            /// </summary>
            /// <param name="url">WebService服务地址</param>
            /// <param name="nameSpace">命名空间</param>
            /// <param name="dllName">DLL名称</param>
            public static void CreateDLL(string url, string nameSpace, string dllName)
            {
                WebClient client = new WebClient();
                Stream stream = client.OpenRead(url + "?WSDL");
                ServiceDescription description = ServiceDescription.Read(stream);            //创建客户端代理代理类
                ServiceDescriptionImporter importer = new ServiceDescriptionImporter();            //指定访问协议
                importer.ProtocolName = "Soap";
                //生成客户端代理
                importer.Style = ServiceDescriptionImportStyle.Client;
                importer.CodeGenerationOptions = CodeGenerationOptions.GenerateProperties | CodeGenerationOptions.GenerateNewAsync;
                //添加WSDL文档
                importer.AddServiceDescription(description, null, null);            //命名空间
                CodeNamespace nmspace = new CodeNamespace();
                nmspace.Name = nameSpace;
                CodeCompileUnit unit = new CodeCompileUnit();
                unit.Namespaces.Add(nmspace);            ServiceDescriptionImportWarnings warning = importer.Import(nmspace, unit);
                CodeDomProvider provider = CodeDomProvider.CreateProvider("CSharp");            CompilerParameters parameter = new CompilerParameters();
                parameter.GenerateExecutable = false;
                parameter.OutputAssembly = dllName;//输出程序集的名称
                parameter.ReferencedAssemblies.Add("System.dll");
                parameter.ReferencedAssemblies.Add("System.XML.dll");
                parameter.ReferencedAssemblies.Add("System.Web.Services.dll");
                parameter.ReferencedAssemblies.Add("System.Data.dll");            CompilerResults result = provider.CompileAssemblyFromDom(parameter, unit);
                if (result.Errors.HasErrors)
                {
                    // 显示编译错误信息
                }
            }