webservice中如何传递DbParameter类型 如题,webservice中如何传递DbParameter[]类型,因为在传递的时候,总会提示说webservice的DbParameter[]和系统的DbParameter[]不一致,不能转换?这个怎么解决啊? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 DbParameter 类型会在客户端本地生成代理类型,和系统的并不一样。你可以WebMethod里再创建一个系统的DbParameter,自己将传过来的DbParameter里的属性Copy到里面。 服务端:[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 });} webservice中实现如下的一个方法WebService的DbParameter ConvertDbParameter(系统的DbParameter p){ WebService的DbParameter con = new ... con.属性1 = p.属性x; con.属性2 = p.属性y; ... return con;} 郁闷,我的webservice在客户端是动态生成dll调用的,貌似不能直接引用webservice里的定义的类型啊 那杯具了这样的话,WebMethod不要传抽象类。 我说一下我现在的工作内容,我现在是把DB的操作,包括增删改的方法都挪到了webservice上,把webservice作为访问数据库的中间件,是动态生成dll引用的,查询和删除都没有问题,因为传递类型都是string,DataTable,DataSet,就是增加和修改的时候,原来框架的一些方法涉及到DbParameter[]的传递,折腾了好久还是没搞掂。大家帮帮忙啊,谢谢 谢谢 fangxinggood 的帮忙~~ 呵呵 不知道你的动态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); 问题始终没有很好的解决,最后,采用的是客户端把DbParameter[]转换成DataTable,WebService再把DataTable转换回Dbparameter的方法,方法有点笨,要是实在没有好的办法,只好结贴了呜呜 你也没说你是怎么动态生成dll的如果是用 ServiceDescriptionImporter 动态生成的客户端代理,那么它一定会把 Soap 协议规定以外的对象,生成到你定义的namespace底下。而不是使用 System.Data.Common.DbParameter 如果自己封装soapMessage还有可能 /// <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) { // 显示编译错误信息 } } /// <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) { // 显示编译错误信息 } } 求用system.io.stream读取d:\\abc.txt的前10个字节的例子。 C#怎么向并口发送指令 在Datagridview中怎麼處理日期的空值 子窗口无法重新激活父窗口控件 c#简单问题 请问PropertyGrid能否可以取到所显示的内容? 关于单击winForms的DataGrid 求教C#调用C++dll带NONAME导出函数的问题,谢谢 请教:如何在WEB树形控件单击时,知道是单击的哪一个NODE呢,写在什么事情中呀,另外: 问题多多!DataGrid一问!! 菜单联动浏览器兼容问题 请问WINFORM 中 json 如何生产 treeview
自己将传过来的DbParameter里的属性Copy到里面。
[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 });
}
{
WebService的DbParameter con = new ...
con.属性1 = p.属性x;
con.属性2 = p.属性y;
... return con;
}
郁闷,我的webservice在客户端是动态生成dll调用的,
貌似不能直接引用webservice里的定义的类型啊
我说一下我现在的工作内容,
我现在是把DB的操作,包括增删改的方法都挪到了webservice上,
把webservice作为访问数据库的中间件,是动态生成dll引用的,
查询和删除都没有问题,因为传递类型都是string,DataTable,DataSet,
就是增加和修改的时候,原来框架的一些方法涉及到DbParameter[]的传递,
折腾了好久还是没搞掂。大家帮帮忙啊,
谢谢
另外枚举传递的有问题。这个还没仔细研究。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);
最后,采用的是客户端把DbParameter[]转换成DataTable,
WebService再把DataTable转换回Dbparameter的方法,
方法有点笨,要是实在没有好的办法,只好结贴了呜呜
/// <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)
{
// 显示编译错误信息
}
}
/// <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)
{
// 显示编译错误信息
}
}