WCF學習之旅—第三個示例之五(三十一)

来源:http://www.cnblogs.com/chillsrc/archive/2016/12/01/6122750.html
-Advertisement-
Play Games

本文介紹應用程式中添加書籍的保存功能,涉及兩個功能“新增”與“修改”。異常處理的小結。 ...


   上接WCF學習之旅—第三個示例之一(二十七)

              WCF學習之旅—第三個示例之二(二十八)

             WCF學習之旅—第三個示例之三(二十九)

             WCF學習之旅—第三個示例之四(三十)

十、添加保存功能

在此步驟中,將在應用程式中添加書籍的保存功能,涉及兩個功能“新增”與“修改”。

  1. 在解決方案資源管理器中,選中“FrmBook.cs”文件,在彈出的右鍵菜單中選擇“打開”,或者使用滑鼠左鍵雙擊。
  2. 在FrmBook.cs界面中,使用滑鼠雙擊“保存”按鈕與“清空”按鈕
  3. 然後在 btnSave _Click事件處理程式中添加以下代碼:
 private void btnSave_Click(object sender, EventArgs e)
       {
             try
            {
                using (ChannelFactory<IBookService> channelFactory = new ChannelFactory<IBookService>("WSHttpBinding_IBookService"))
                {

                    IBookService proxy = channelFactory.CreateChannel();
                    using (proxy as IDisposable)
                    {

                        if (string.IsNullOrEmpty(txtBookId.Text))

                        {
                            textBoxMsg.Text = proxy.Add(GetBookInfo());
                        }

                        else

                            textBoxMsg.Text = proxy.Edit(GetBookInfo());

                    }
                }

            }

            catch (FaultException<SQLError> fex)
            {
                SQLError error = fex.Detail;
                textBoxMsg.Text = string.Format("拋出一個服務端錯誤。\r\n\t錯誤代碼:{0}\n\t錯誤原因:{1}\r\n\t操作:{2}\r\n\t錯誤信息:{3}\r\n\r\n",
fex.Code, fex.Reason, error.Operation, error.ErrorMessage);
            }
        }

    4. 在 buttonClear_Click事件處理程式中添加以下代碼

private void buttonClear_Click(object sender, EventArgs e)
        {           

            txtBookId.Text = string.Empty;
            txtAuthorID.Text = string.Empty;
            textBoxName.Text = string.Empty;
            textBoxCategory.Text = string.Empty;
            textBoxPrice.Text = string.Empty;
            textBoxRating.Text = string.Empty;
            textBoxNumberofcopies.Text = string.Empty;
            txtPublishDate.Text = string.Empty;
        }

      5.在菜單欄上,依次選擇“調試”和“啟動調試”以運行應用程式。

      6. 在界面中使用滑鼠點擊“查詢”按鈕,顯示出全部的書籍記錄。

       7. 使用滑鼠選中BookID=6的書籍信息,然後點擊“查詢選中的書籍”,這時會在“詳細信息”中顯示這本書的詳細信息。

      8. 分別修改“價格”與“出版日期”,然後使用滑鼠點擊“保存”按鈕。

      9.點擊“查詢”按鈕,再次查詢出結果,與之前的查詢結果進行比較。見下圖, “價格”與“出版日期”已經保存到資料庫。

        

      10.接下來,我們來看看如何新增一條書籍信息。在“書籍信息”界面中,點擊“清空”按鈕,然後在詳細信息中分別輸入“作者編號”、“書名”、“類型”、“價格”、“評價”、“出版數量”、“出版日期”,點擊“保存”按鈕。就新增了一條新的記錄。如下圖。

 

十一、添加刪除功能

在此步驟中,將在應用程式中添加書籍的刪除功能。

  1. 在解決方案資源管理器中,選中“FrmBook.cs”文件,在彈出的右鍵菜單中選擇“打開”,或者使用滑鼠左鍵雙擊。
  2. 在FrmBook.cs界面中,使用滑鼠雙擊“刪除選中書籍”按鈕
  3. 然後在 btnDel _Click事件處理程式中添加以下代碼:
private void btnDel_Click(object sender, EventArgs e)

        {

            Books book = new Books();

            if (gridBooks.SelectedRows.Count > 0)

            {
                book = gridBooks.SelectedRows[0].DataBoundItem as Books;

                textBoxMsg.Text = XMLHelper.ToXML<Books>(book);
                using (ChannelFactory<IBookService> channelFactory = new ChannelFactory<IBookService>("WSHttpBinding_IBookService"))
                {

                    IBookService proxy = channelFactory.CreateChannel();
                    using (proxy as IDisposable)
                    {
                        textBoxMsg.Text = proxy.Delete(textBoxMsg.Text);                      

                    }
                }
            }
            else
            {
                textBoxMsg.Text = "沒有選中相應的記錄!";
            }
        }

       4. 在菜單欄上,依次選擇“調試”和“啟動調試”以運行應用程式。

       5. 在界面中使用滑鼠點擊“查詢”按鈕,顯示出全部的書籍記錄。

       6. 使用滑鼠選中BookID=3的書籍信息,然後點擊“刪除選中書籍”。

       7. 再次使用滑鼠點擊“查詢”按鈕,再次查詢出結果,與之前的查詢結果進行比較。見下圖, “BookID=3”的記錄已經被刪除了。

 

 

十二、關於異常處理的小結

       1. 一開始,我對異常返回的寫法如下,在BookService.svc.cs文件,雙擊在“代碼編輯器”中打開,代碼如下,註意其中的“Edit”方法的異常返回,看上去沒什麼問題,但在具體實踐中,卻得到如圖1的錯誤,看得我摸不著頭腦,不知道錯在什麼地方。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;

using System.ServiceModel;
using System.Text;
using BookMgr.Contracts;
using BookMgr.Model;

using BookMgr.Common;

using System.Data.Entity;
namespace BookMgr.Service
{
    // 註意: 使用“重構”菜單上的“重命名”命令,可以同時更改代碼、svc 和配置文件中的類名“BookService”。

    // 註意: 為了啟動 WCF 測試客戶端以測試此服務,請在解決方案資源管理器中選擇 BookService.svc 或 BookService.svc.cs,然後開始調試。
    public class BookService :IBookService
    {

        BookEntities db = new BookEntities();
        public string Add(string mbook)
        {

            try
            {

                Books book = XMLHelper.DeSerializer<Books>(mbook);
                db.Books.Add(book);
                db.SaveChanges();

            }
            catch (Exception ex)
            {
                return ex.Message;
            }
            return "true";

        }
        public string Delete(string bookInfo)
        {

            try
            {
                Books book = XMLHelper.DeSerializer<Books>(bookInfo);
                db.Entry(book).State = EntityState.Deleted;
                db.SaveChanges();
            }

            catch (Exception ex)

            {
                return ex.Message;

            }

            return "true";
        }

        public void DoWork()

        {
        }

           public string Edit(string mbook)
        {
            try
            {
                Books book = XMLHelper.DeSerializer<Books>(mbook);
                db.Entry(book).State = EntityState.Modified;
                db.SaveChanges(); 

            }
            catch (Exception ex)
            {           

                string reason = string.Empty;
                if (ex.InnerException != null)
                {
                    reason = string.Format("{0}。InnerException:{1}",ex.Message, ex.InnerException.Message);
                }
                else reason = ex.Message;
                SQLError error = new SQLError("更新資料庫操作", reason);
                throw new FaultException<SQLError>(error, new FaultReason(reason), new FaultCode("Edit"));
            }
            return "true";
        } 

        public string Get(string Id)
        {
            int bookId = Convert.ToInt32(Id);
            Books book = db.Books.Find(bookId);
            string xml = XMLHelper.ToXML<Books>(book);
            return xml;

            //throw new NotImplementedException();
        }

        public string Search(string Category, string searchString)
        {
            var cateLst = new List<string>();
            var cateQry = from d in db.Books
                          orderby d.Category
                          select d.Category;
            cateLst.AddRange(cateQry.Distinct());

            var books = from m in db.Books
                        select m; 

            if (!String.IsNullOrEmpty(searchString))
            {
                books = books.Where(s => s.Name.Contains(searchString));
            }

            List<Books> list = null;
            if (string.IsNullOrEmpty(Category))
            {
                list = books.ToList<Books>();
                //return XMLHelper.ToXML<List<Books>>(list);
            }
            else
            {
                list = books.Where(x => x.Category == Category).ToList<Books>();
                //  return XMLHelper.ToXML<IQueryable<Books>>(books.Where(x => x.Category == Category));

            }
            return XMLHelper.ToXML<List<Books>>(list);
        }
    }
}

2. 異常返回值圖。

 

             圖1

3. 看來之前的寫法,無法獲取全部的異常信息,我添加了一個獲取異常的方法,把所有的內部異常信息獲取出來。具體代碼見下,下麵只有“Edit”方法的異常處理。

    StringBuilder sb = new StringBuilder();
        /// <summary>
        /// 遞歸獲取錯誤信息的內部錯誤信息,直到InnerException為null
        /// </summary>
        /// <param name="ex"></param>
        private string GetErrorMessage(Exception ex)
        {
            if (ex.InnerException != null)
            {
                sb.Append("InnerException:"+ex.Message + ",");

                GetErrorMessage(ex.InnerException);
            }
            else
            {

                sb.Append(ex.Message + ",");
            }
            return sb.ToString();
        } 

    public string Edit(string mbook)
        {
            try
            {
                Books book = XMLHelper.DeSerializer<Books>(mbook);
                db.Entry(book).State = EntityState.Modified;
                db.SaveChanges();
            }
            catch (Exception ex)            {              

                string reason = GetErrorMessage(ex);           

                SQLError error = new SQLError("更新資料庫操作", reason);
                throw new FaultException<SQLError>(error, new FaultReason(reason), new FaultCode("Edit"));
            }
            return "true";
        }

 

4.這樣修改之後的異常返回,如下圖。這樣我們就能很容易知道問題出在哪裡了。

 

 

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 前兩天入手一個Macbook air,在裝軟體過程中摸索了一些基本操作,現就常用操作進行總結, 1關於觸控板: 按下(不區分左右) =滑鼠左鍵 control+按下 =滑鼠右鍵 雙指上下拖 滾屏 雙指左右拖 瀏覽器前進/後退 三指左右拖 切換程式 三指上下拖 打開程式縮略圖/恢復 四指抓 打開所有程 ...
  • Hadoop的安裝非常簡單,可以在官網上下載到最近的幾個版本,最好使用穩定版。本例在3台機器集群安裝。hadoop版本如下: Hadoop的安裝非常簡單,可以在官網上下載到最近的幾個版本,最好使用穩定版。本例在3台機器集群安裝。hadoop版本如下: Hadoop的安裝非常簡單,可以在官網上下載到最 ...
  • .NET基礎知識點 l .Net平臺 .Net FrameWork框架 l .Net FrameWork框架提供了一個穩定的運行環境,;來保障我們.Net平臺正常的運轉 l 兩種交互模式 C/S:要求客戶的電腦上必須要安裝一個客戶端:qq、360、快播等..... B/S:要求客戶的電腦上只需要安裝 ...
  • "原文地址 Kestrel server for ASP.NET Core" By [Tom Dykstra][1], [Chris Ross][2], and [Stephen Halter][3] Kestrel是一個基於libuv的跨平臺[ASP.NET Core web伺服器][4],[li ...
  • 公司還用這些老家伙沒辦法,用了幾次這倆。每次用都要重新翻一下A片。 好好的A片楞是翻譯成了禪經。把這東西弄成個玄學。微軟也是吃棗藥丸。參考了@風中靈藥的blog.寫的牛逼。 還有一些公司用到的風中靈藥沒有提及,我給自己留個tip.好以後看看。有錯誤希望大家指出。雖然我不一定改。 AutoResetE ...
  • 直接上代碼,包各位看客能用!!! 1.首先請求參數的封裝 2.HttpWebRequest 封裝 HttpUploadClient類中兩個Execute2,參考網上,大都用第一個,如果上傳小文件沒問題,要是比較大(百兆以上)就會記憶體溢出,然後就用流方式。思路是一樣的 3.調用示例: 4.介面服務後臺 ...
  • 第一步:訪問:https://www.microsoft.com/zh-cn/software-download/windows10ISO/ 預設就只能下載win10,這怎麼行呢。巨硬程式員貌似沒做服務端驗證。。第二步:瀏覽器控制台輸入以下js代碼: 效果: 需要下載的就快下。指不定哪天就被封了。 ...
  • 目前chrome是我在實現webdriver時運行最穩定的瀏覽器,如何利用webdriver打開多個標簽頁和鏈接呢,到處查找得到的往往只是如何打開標簽頁。打開標簽頁很簡單,chrome瀏覽器打開標簽頁的快捷鍵是ctrl+t,那把ctrl+t的按鍵事件傳入即可,很多種實現方式,以下只列出兩種:1:Ac ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...