客户端调用WCF的时候报上面的错误,WCF只能序列化基础的数据类型,不能直接序列化SqlParameter类型,需要使用自定义类,然后在WCF服务端转换的方式解决:

自定义类代码如下:

 using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Runtime.Serialization;
using System.Text;
using System.Threading.Tasks; namespace CommonLib.CustomClass
{
/// <summary>
/// 方法标记为DataContract约束,属性标记为DataMember
/// </summary>
[Serializable]
[DataContract]
public class SetSqlParameter
{
#region 属性 /// <summary>
/// 参数名称
/// </summary>
[DataMember]
private string paraName = "";
public string ParaName
{
get { return this.paraName; }
set { this.paraName = value; } } /// <summary>
/// 参数长度
/// </summary>
[DataMember]
private int paraLength = ;
public int ParaLength
{ get { return this.paraLength; }
set { this.paraLength = value; }
} /// <summary>
/// 参数值
/// </summary>
[DataMember]
private object paraValue = null;
public object ParaValue
{
get { return this.paraValue; }
set { this.paraValue = value; }
} /// <summary>
/// 参数类型
/// </summary>
[DataMember]
private SqlDbType paraDbType = SqlDbType.NVarChar;
public SqlDbType ParaDbType
{
get { return this.paraDbType; } set { this.paraDbType = value; }
} #endregion /// <summary>
/// 构造函数
/// </summary>
/// <param name="sPara"></param>
public SetSqlParameter(SqlParameter sPara)
{
this.paraName = sPara.ParameterName;
this.paraLength = sPara.Size;
this.paraValue = sPara.Value;
this.paraDbType = sPara.SqlDbType;
} /// <summary>
/// 转换成SqlParameter类型
/// </summary>
/// <returns></returns>
public SqlParameter ConvertToSqlParameter()
{
SqlParameter parameter = new SqlParameter(this.paraName, this.paraDbType, this.paraLength);
parameter.Value = this.paraValue;
return parameter;
}
}
}

WCF服务端代码如下:

接口代码:

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;
using System.Data;
using System.Data.SqlClient;
using CommonLib.CustomClass; namespace WcfServiceDemo
{
// 注意: 使用“重构”菜单上的“重命名”命令,可以同时更改代码和配置文件中的接口名“IMyService”。
[ServiceContract]
public interface IMyService
{
[OperationContract]
DataTable ExeceteQuery(string strSQL, params SetSqlParameter[] parameters);
}
}

接口实现类代码:

 using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;
using System.Configuration;
using CommonLib.CustomClass; namespace WcfServiceDemo
{
// 注意: 使用“重构”菜单上的“重命名”命令,可以同时更改代码、svc 和配置文件中的类名“MyService”。
// 注意: 为了启动 WCF 测试客户端以测试此服务,请在解决方案资源管理器中选择 MyService.svc 或 MyService.svc.cs,然后开始调试。
public class MyService : IMyService
{ public DataTable ExeceteQuery(string strSQL, params SetSqlParameter[] parameters)
{
DataTable dtReturn = new DataTable();
dtReturn.TableName = "ExecuteQuery";
string strCon = ConfigurationManager.ConnectionStrings["HealthHospInfection"].ConnectionString;
using (SqlConnection conn = new SqlConnection(strCon))
{
SqlCommand cmd = new SqlCommand(strSQL, conn);
conn.Open();
if (parameters != null)
{
SqlParameter[] para = new SqlParameter[parameters.Length];
for (int i = ; i < parameters.Length; i++)
{
//把SetSqlParameter类型的数组转换成SqlParameter类型的数组
para[i] = parameters[i].ConvertToSqlParameter();
}
cmd.Parameters.AddRange(para);
} SqlDataAdapter adapter = new SqlDataAdapter(cmd);
adapter.Fill(dtReturn);
}
return dtReturn;
}
}
}

客户端调用WCF代码:

 using CommonLib.CustomClass;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms; namespace winClient
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
} private void btn_GetData_Click(object sender, EventArgs e)
{ string strSQL = " SELECT * FROM BaseSetMainInfo WHERE TypeCode=@TypeCode "; //定义SqlParameter
SqlParameter para = new SqlParameter("@TypeCode", SqlDbType.Int);
para.Value = ; //定义SetSqlParameter类型的数组
SetSqlParameter[] paras = new SetSqlParameter[] {
new SetSqlParameter(para)
}; //实例化WCF服务
ServiceReference.MyServiceClient client=new ServiceReference.MyServiceClient();
//调用WCF服务提供的方法
DataTable dt = client.ExeceteQuery(strSQL, paras);
this.dataGridView1.DataSource = dt; }
}
}

这样就可以解决WCF不能直接序列化SqlParameter类型的问题了。

代码下载地址:https://files.cnblogs.com/files/dotnet261010/WcfSqlParameterDemo.rar

由于内部错误,服务器无法处理该请求。有关该错误的详细信息,请打开服务器上的 IncludeExceptionDetailInFaults (从 ServiceBehaviorAttribute 或从 <serviceDebug> 配置行为)以便将异常信息发送回客户端,或打开对每个 Microsoft .NET Framework SDK 文档的跟踪并检查服务器跟踪日志。的更多相关文章

  1. Microsoft Visual Studio 2012 文档 下载地址 vs2012 中文帮助文档

    https://www.microsoft.com/zh-cn/download/confirmation.aspx?id=34794 下载地址: http://download.microsoft. ...

  2. 受不了Android SDK文档打开缓慢问题,自己开发简易脱机浏览器。

    google android sdk离线文档打开的时候特别慢,据说是要从谷歌官网拉取一些东西导致的.脱机浏览能够解决该问题.PC端能够使用firefox. 可是Android端貌似没有支持脱机工作的浏 ...

  3. Web服务器(容器)请求常见的错误及其解决方法

    首先我们来看看容器如何找到service()方法?(1)当在浏览器中输入 http://localhost:8080/firstweb/sayHi 这个地址后,容器是如何找到 HelloServlet ...

  4. Mvc项目部署IIS报错:没有为请求的URL配置默认文档,并且没有在服务器设置目录浏览

    问题原因: 1.iis是在安装完.net framework 之后才安装的,需要进行iis注册,开始--运行--cmd,打开命令行提示符,输入命令如下 C:\Windows\Microsoft.NET ...

  5. IIS异常:CS0016: 未能写入输出文件“c:\WINDOWS\Microsoft.NET\Framework\.。。”--“拒绝访问

    CS0016: 未能写入输出文件“c:/WINDOWS/Microsoft.NET/Framework/v2.0.50727/Temporary ASP.NET Files/.........dll” ...

  6. C# 10分钟入门基于WebOffice实现在线编辑文档,实时保存到服务器(所有office,兼容WPS)

    今天,他来了(weboffice在线编辑文档). 上次写了一个在线预览的博,当然,效果并不是太理想,但是紧急解决了当时的问题. 后来,小编重新查找资料,求助大牛,终于使用新的方式替换了之前的low方法 ...

  7. 微软microsoft word的api文档地址

    https://docs.microsoft.com/en-us/previous-versions/office/developer/office-2003/aa172758(v%3doffice. ...

  8. 使用Microsoft Office 2007将文档转换为PDF

    点击帮助 输入关键词PDF后搜索 点击进入Save or convert to PDF or XPS 点击进入2007 Microsoft Office Add-in: Microsoft Save ...

  9. umeditor word文档图片粘贴-自动上传到服务器

    图片的复制无非有两种方法,一种是图片直接上传到服务器,另外一种转换成二进制流的base64码 目前限chrome浏览器使用,但是项目要求需要支持所有的浏览器,包括Windows和macOS系统.没有办 ...

随机推荐

  1. js实现可拉伸移动的div

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "DTD/xhtml1-strict.dtd&qu ...

  2. java接口的高级应用

    直接上菜 /*接口类*/ public interface MsgListener{ public void afterMsgRecived(String msgData); } /*工具类*/ pu ...

  3. ReadOnly field saved with NULL value

    On CRM opportunity form view, i added readonly="1" for probability field. When i saved, wh ...

  4. bzoj-1492 货币兑换Cash (2)——CDQ分治

    题意: 略 见上一篇 题解: 方程还是那个方程f[i]=A[i] * X[j] + B[i] * Y[j]. 化简为Y[i]=(-A[i]/B[i]) * X[i] + f[i]/B[i]这一坨: 既 ...

  5. oracle 存储过程 调用动态sql

      oracle 存储过程 调用动态sql CreationTime--2018年8月16日11点25分 Author:Marydon 1.错误实现方式 --开始时间拼接' 00:00:00' V_S ...

  6. php 一个过虑xxs的代码

    一个过虑xxs的代码 public static function removeXSS($str) { $str = str_replace('<!-- -->', '', $str); ...

  7. 深层神经网络框架的python实现

    概述 本文demo非常适合入门AI与深度学习的同学,从最基础的知识讲起,只要有一点点的高等数学.统计学.矩阵的相关知识,相信大家完全可以看明白.程序的编写不借助任何第三方的深度学习库,从最底层写起. ...

  8. Java泛型入门

      Java泛型入门 在学习本章之前,须要对Java的集合(Collection.Map)有一定的基础. Java集合有一个缺点.就是把一个对象"丢进"集合里后,集合就会&qu ...

  9. CentOS连接网络注意事项

    连接网络,系统中这两个服务需要启动 可以看到右上角网络连接成功了

  10. 对Ubuntu操作系统进行彻底优化

    在安装Linux系统之初,就应该考虑怎样使Linux系统得到最好的性能.Linux本身也设计成可以良好扩展的形态,比如在Linux系统中,我们可以随心所欲地组织磁盘分区,有些朋友喜欢一个/,一个swa ...