<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
由於內部錯誤,伺服器無法處理該請求。有關該錯誤的詳細資訊,請開啟伺服器上的 IncludeExceptionDetailInFaults (從 ServiceBehaviorAttribute 或從 <serviceDebug> 設定行為)以便將異常資訊傳送回使用者端,或開啟對每個 Microsoft .NET Framework SDK 檔案的跟蹤並檢查伺服器跟蹤紀錄檔。
使用者端呼叫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 = 0; 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; } } }
介面程式碼:
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 = 0; 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 = 1; //定義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型別的問題了。
程式碼下載地址:點此下載
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援it145.com。
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45