欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

解決WCF不能直接序列化SqlParameter類型的問題

 更新時間:2022年03月04日 10:33:55   作者:.NET開發(fā)菜鳥  
這篇文章介紹了解決WCF不能直接序列化SqlParameter類型的問題,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下

錯誤描述:

由于內(nèi)部錯誤,服務(wù)器無法處理該請求。有關(guān)該錯誤的詳細信息,請打開服務(wù)器上的 IncludeExceptionDetailInFaults (從 ServiceBehaviorAttribute 或從 <serviceDebug> 配置行為)以便將異常信息發(fā)送回客戶端,或打開對每個 Microsoft .NET Framework SDK 文檔的跟蹤并檢查服務(wù)器跟蹤日志。

客戶端調(diào)用WCF的時候報上面的錯誤,WCF只能序列化基礎(chǔ)的數(shù)據(jù)類型,不能直接序列化SqlParameter類型,需要使用自定義類,然后在WCF服務(wù)端轉(zhuǎn)換的方式解決:

自定義類代碼如下:

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>
        /// 參數(shù)名稱
        /// </summary>
        [DataMember]
        private string paraName = "";
        public string ParaName
        {
            get { return this.paraName; }
            set { this.paraName = value; }

        }


        /// <summary>
        /// 參數(shù)長度
        /// </summary>
        [DataMember]
        private int paraLength = 0;
        public int ParaLength
        {

            get { return this.paraLength; }
            set { this.paraLength = value; }
        }


        /// <summary>
        /// 參數(shù)值
        /// </summary>
        [DataMember]
        private object paraValue = null;
        public object ParaValue
        {
            get { return this.paraValue; }
            set { this.paraValue = value; }
        }


        /// <summary>
        /// 參數(shù)類型
        /// </summary>
        [DataMember]
        private SqlDbType paraDbType = SqlDbType.NVarChar;
        public SqlDbType ParaDbType
        {
            get { return this.paraDbType; }

            set { this.paraDbType = value; }
        }

        #endregion

        /// <summary>
        /// 構(gòu)造函數(shù)
        /// </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>
        /// 轉(zhuǎn)換成SqlParameter類型
        /// </summary>
        /// <returns></returns>
        public SqlParameter ConvertToSqlParameter()
        {
            SqlParameter parameter = new SqlParameter(this.paraName, this.paraDbType, this.paraLength);
            parameter.Value = this.paraValue;
            return parameter;
        }
    }
}

WCF服務(wù)端代碼如下:

接口代碼:

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
{
    // 注意: 使用“重構(gòu)”菜單上的“重命名”命令,可以同時更改代碼和配置文件中的接口名“IMyService”。
    [ServiceContract]
    public interface IMyService
    {
        [OperationContract]
        DataTable ExeceteQuery(string strSQL, params SetSqlParameter[] parameters);
    }
}

接口實現(xiàn)類代碼:

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
{
    // 注意: 使用“重構(gòu)”菜單上的“重命名”命令,可以同時更改代碼、svc 和配置文件中的類名“MyService”。
    // 注意: 為了啟動 WCF 測試客戶端以測試此服務(wù),請在解決方案資源管理器中選擇 MyService.svc 或 MyService.svc.cs,然后開始調(diào)試。
    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類型的數(shù)組轉(zhuǎn)換成SqlParameter類型的數(shù)組
                        para[i] = parameters[i].ConvertToSqlParameter();
                    }
                    cmd.Parameters.AddRange(para);
                }

                SqlDataAdapter adapter = new SqlDataAdapter(cmd);
                adapter.Fill(dtReturn);
            }
            return dtReturn;
        }
    }
}

客戶端調(diào)用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類型的數(shù)組
            SetSqlParameter[] paras = new SetSqlParameter[] {
                new SetSqlParameter(para)
            };

            //實例化WCF服務(wù)
            ServiceReference.MyServiceClient client=new ServiceReference.MyServiceClient();
            //調(diào)用WCF服務(wù)提供的方法
            DataTable dt = client.ExeceteQuery(strSQL, paras);
            this.dataGridView1.DataSource = dt;

        }
    }
}

這樣就可以解決WCF不能直接序列化SqlParameter類型的問題了。

代碼下載地址:點此下載

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • C#中Razor模板引擎簡單使用

    C#中Razor模板引擎簡單使用

    Razor 是一種標記語法,可以讓您將基于服務(wù)器的代碼(Visual Basic 和 C#)嵌入到網(wǎng)頁中,本文給大家介紹了C#中Razor模板引擎簡單使用,需要的朋友可以參考下
    2022-02-02
  • c#字符串編碼編碼(encoding)使用方法示例

    c#字符串編碼編碼(encoding)使用方法示例

    System.Text提供了Encoding的抽象類,這個類提供字符串編碼的方法。使Unicode字符數(shù)組的字符串,轉(zhuǎn)換為指定編碼的字節(jié)數(shù)組,或者反之,看下面的例子
    2013-12-12
  • 淺解關(guān)于C#多線程的介紹

    淺解關(guān)于C#多線程的介紹

    本篇文章小編將為大家介紹,淺解關(guān)于C#的多線程,有需要的朋友可以參考一下
    2013-04-04
  • C#如何遠程讀取服務(wù)器上的文本內(nèi)容

    C#如何遠程讀取服務(wù)器上的文本內(nèi)容

    這篇文章主要介紹了C#如何遠程讀取服務(wù)器上的文本內(nèi)容,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • 詳解Unity中Mask和RectMask2D組件的對比與測試

    詳解Unity中Mask和RectMask2D組件的對比與測試

    本篇文章給大家介紹Unity中Mask和RectMask2D組件的對比與測試,包括組件用法及RectMask2D的基本用法,通過Mask的原理分析實例代碼相結(jié)合給大家講解的非常詳細,需要的朋友參考下吧
    2021-06-06
  • C#配置log4net實現(xiàn)將日志分類記錄到不同的日志文件中

    C#配置log4net實現(xiàn)將日志分類記錄到不同的日志文件中

    log4net是.Net下一個非常優(yōu)秀的開源日志記錄組件,log4net記錄日志的功能非常強大,它可以將日志分不同的等級,以不同的格式,輸出到不同的媒介,下面我們就來看看C#如何配置log4net讓日志分類記錄到不同的日志文件吧
    2024-02-02
  • C#將hashtable值轉(zhuǎn)換到數(shù)組中的方法

    C#將hashtable值轉(zhuǎn)換到數(shù)組中的方法

    這篇文章主要介紹了C#將hashtable值轉(zhuǎn)換到數(shù)組中的方法,涉及C#中CopyTo方法的使用技巧,非常具有實用價值,需要的朋友可以參考下
    2015-04-04
  • C# AttributeUsage使用案例詳解

    C# AttributeUsage使用案例詳解

    這篇文章主要介紹了C# AttributeUsage使用案例詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • C#實現(xiàn)計算年齡的簡單方法匯總

    C#實現(xiàn)計算年齡的簡單方法匯總

    本文給大家分享的是C#代碼實現(xiàn)的簡單實用的給出用戶的出生日期,計算出用戶的年齡的代碼,另外附上其他網(wǎng)友的方法,算是對計算年齡的一次小結(jié),希望大家能夠喜歡。
    2015-05-05
  • c#使用UTF-8編碼實現(xiàn)處理多語言文本

    c#使用UTF-8編碼實現(xiàn)處理多語言文本

    UTF-8編碼是現(xiàn)代應(yīng)用中處理多語言文本的首選,所以本文為大家詳細介紹了C#如何使用UTF-8編碼實現(xiàn)處理多語言文本,感興趣的小伙伴可以了解下
    2024-01-01

最新評論