WebService總結(jié)(2017/11/12)

一、概述

平臺:VS2015

語言:C#

技術(shù):ELINQ

數(shù)據(jù)庫:ORACLE

成果:一個能實現(xiàn)對數(shù)據(jù)庫中的表進行增刪改查功能的接口

接口返回的結(jié)果:JSON格式的結(jié)果集


二、流程

1.添加網(wǎng)站,新建一個web服務(wù)。


2.添加引用:System.Data.OracleClient;通過Nuget安裝ELinq包和Newtonsoft.Json包;


3.配置數(shù)據(jù)庫連接信息。在Web.config文件中添加連接字符串:





4.先添加實體類,在其中添加命名空間:using Nlite.Data;并映射數(shù)據(jù)庫中的表,原則上實體類名要和表名一致或遵循一定規(guī)律。例如casetype類(映射Oracle數(shù)據(jù)庫中的s_casetype表):

using System;

using System.Collections.Generic;

using System.Linq;

using System.Web;

using NLite.Data;

///

/// casetype的摘要說明

///

[Table("s_casetype")]

public class casetype

{

///

///案件類型代碼

///

[Id]

publicstring typeid { get; set; }

///

///父類的代碼

///

publicstring pid { get; set; }

///

///案件類型名稱

///

publicstring typename { get; set; }

///

///說明

///

publicstring remark { get; set; }

///

///樹類型,0是事件,1是部件

///

publicstring treetype { get; set; }

///

///區(qū)級TYPEID

///

publicstring qtypeid { get; set; }

}

其次,添加一個展示指定輸出信息的類。例如caseinfo類:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Web;

///

/// CaseInfo的摘要說明,用于輸出的類

///

public class CaseInfo

{

///

///案件代碼

///

publicstring typeid { get; set; }

///

///父類的案件代碼

///

publicstring pid { get; set; }

///

///案件類型名稱

///

publicstring typename { get; set; }

///

///案件說明

///

publicstring remark { get; set; }

///

///樹類型,0是事件,1是部件

///

publicstring treetype { get; set; }

///

///區(qū)級TYPEID

///

publicstring qtypeid { get; set; }

}

接著添加了HeadData類,返回操作成功與否的信息;

using System;

using System.Collections.Generic;

using System.Linq;

using System.Web;

///

/// HeadData的摘要說明

///返回操作是否成功的提示信息

///

public class HeadData

{

///

///一個返回值,0表示成功

///

publicint Code { get; set; }

///

///錯誤的信息

///

privatestring mMsg = "";

///

///錯誤信息

///

publicstring Msg { get { return mMsg; } set { mMsg = value; } }

privateDateTime mServerTime = DateTime.Now;

///

///返回服務(wù)器時間

///

publicDateTime ServerTime { get { return mServerTime; } set { mServerTime = value; }}

///

///返回結(jié)果的數(shù)量

///

publicint Count { get; set; }

///

///業(yè)務(wù)邏輯處理結(jié)果

///

publicbool Result { get; set; }

}

public enum codetype

{

///

///執(zhí)行成功

///

CODE_OK = 0,

///

///執(zhí)行失敗

///

CODE_ERROR = 1

}

再添加Returntype類,以JSON格式返回結(jié)果集。

using System;

using System.Collections.Generic;

using System.Linq;

using System.Web;

using Newtonsoft.Json;

using Newtonsoft.Json.Converters;

using Newtonsoft.Json.Serialization;

///

/// returntype的摘要說明

///

public class returntype

{

publicstatic void Json(HttpResponse Resp, HeadData head, object data)

{

if (string.IsNullOrEmpty(Resp.ContentType)) //為啥要判斷一下?

{

Resp.ContentType = "text/json";

}

object objData = new//輸出的內(nèi)容詳情

{

Code = head.Code,

Errmsg = head.Msg,

ServerTime = head.ServerTime,

Result = head.Result,

Count = head.Count,

Data = data

};

//設(shè)置時間格式

IsoDateTimeConverter timeFormat = new IsoDateTimeConverter(); //實例化一個標(biāo)準(zhǔn)數(shù)據(jù)時間格式的對象

timeFormat.DateTimeFormat = "yyyy-MM-dd HH:mm:ss";//指定輸出的時間格式

IList converts = new List(); //初始化實例,表示可按照索引單獨訪問的一組對象,轉(zhuǎn)換對象為JSON,沒懂?

converts.Add(timeFormat);//添加時間格式,沒懂?

//設(shè)置輸出語句

Resp.Write(JsonConvert.SerializeObject(objData, Newtonsoft.Json.Formatting.None,

new JsonSerializerSettings()

{

ReferenceLoopHandling = ReferenceLoopHandling.Ignore,

ContractResolver = new CamelCasePropertyNamesContractResolver(),

Converters =converts

}));//將字符串寫如HTTP響應(yīng)輸出流,JsonConvert類提供.NET和JSON類型轉(zhuǎn)換的方法:SerializeObject方法(具體連載對象,默認(rèn)格式,初始化一個JSON連載設(shè)置)

}

}


5.再添加SsisDbContext類,在這個類中連接數(shù)據(jù)庫(創(chuàng)建DbConfiguration對象、設(shè)置SQL語句輸出日志、注冊實體到數(shù)據(jù)表的映射關(guān)系),然后創(chuàng)建DbSet對象(表示用于執(zhí)行插入、讀取、更新和刪除操作的類型化實體集,對實體集的所有增刪改查操作會立即同步到數(shù)據(jù)庫對應(yīng)的表中)。


5.1映射關(guān)系總結(jié):

一對一:第一種是一對一主鍵關(guān)聯(lián),要求兩個主鍵必須完全一致;第二種是一對一外鍵關(guān)聯(lián)(未懂)。例子,一個球隊對應(yīng)一個地址。

一對多:例如,從球隊角度來說,一個球隊擁有多個球員

多對一:例如,從球員角度來說,多個球員屬于一個球隊

多對多:如學(xué)生與選修課之間的關(guān)系,一個學(xué)生可以選擇多門選修課,每門選修課又可以被多名學(xué)生選擇。一般是采用中間表的方式處理,轉(zhuǎn)化為兩個一對多。

代碼示例:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Web;

using NLite;

using NLite.Data;

///

/// SsisDbContext的摘要說明

///

public class SsisDbContext:DbContext

{

conststring CONNECTIONNAME = "Northwind";

staticNLite.Data.DbConfiguration dbConfig = NLite.Data.DbConfiguration.Configure(CONNECTIONNAME)

.SetSqlLogger(() => new SqlLog(Console.Out))

.AddClass()

.AddClass(m =>

{

m.OneToOne(e => e.CaseType).ThisKey(e =>e.TYPEID).OtherKey(e => e.TYPEID);

})

.AddClass(m =>

{

m.ManyToOne(e => e.CaseTypeList).ThisKey(e =>e.TYPEID).OtherKey(e => e.TYPEID);

});//設(shè)置SQL語句輸出日志,注冊實體到數(shù)據(jù)表的映射關(guān)系,從caseinfo的角度來說,caseinfomodel與casetypemodel是一對一的關(guān)系

publicSsisDbContext():base(dbConfig)//根據(jù)DbConfiguration創(chuàng)建DbContext的對象

{

//

// TODO:在此處添加構(gòu)造函數(shù)邏輯

//ELinq

}

publicreadonly IDbSet CaseInformation;//表示用于執(zhí)行插入、讀取、更新和刪除操作的類型化實體集,對實體集中所有的增刪改查操作會立即同步到數(shù)據(jù)庫對應(yīng)的表中

publicreadonly IDbSet CASEINFO;

publicreadonly IDbSet CASETYPE;

}


6.主體代碼編寫(實現(xiàn)增刪改查)

在using( SsisDbContext db = new SsisDbContext()) {}中寫基于ELINQ技術(shù)的增刪改查的語句。


6.1查詢:

varquery= db.caseinformation.where(condition1 ).select(c=> new OutClass{ ….}).ToList();

其中where語句中寫篩選條件,select語句將序列中的每個元素投影到新表中,tolist語句將表轉(zhuǎn)換為集合


6.2插入-insert:

vara =newcasetype

{

typeid = typeidval,

pid = pidval,

typename =typenameval,

remark = remarkval,

treetype =treetypeval,

qtypeid =qtypeidval

};

db.CaseInformation.Insert(a);//插入語句


6.3更新修改-update(會返回一個INT型的值):

intcount =

db.CaseInformation.Update(new{ typename = typenameval }, (p => p.typeid ==typeidval && p.pid == pidval && p.treetype ==treetypeval));//執(zhí)行更新,并返回進行更新的記錄數(shù)。


6.4刪除-delete(返回一個INT型的值)

intcount =

db.CaseInformation.Delete(p => p.typeid == typeidval && p.pid ==

pidval && p.treetype == treetypeval);//執(zhí)行刪除操作,并返回刪除記錄的數(shù)量


6.5多表聯(lián)合查詢

先搞明白表與表之間的映射關(guān)系,是一對一,還是多對一,或者一對多;

然后使用include語句立即加載針對特定關(guān)系檢索的對象;

接著輸出指定查詢信息。

varvlist = db.CASEINFO.Include(e => e.CaseType).Where(c

=> c.DOCID == docid).Select(c =>newCaseDetail()

{

DOCID = c.DOCID,

typename =c.CaseType.TYPENAME

}).ToList();//通過docid查詢對應(yīng)的案件記錄,并將序列中的每個元素投射到新表中


7.注意事項

1)一定要如下設(shè)置異常信息捕捉,以便于查看BUG原因!??!

catch(Exceptionex)//異常信息

{

hd.Msg = ex.ToString();//數(shù)據(jù)庫自帶的異常信息

returntype.Json(resp, hd,null);//返回JSON格式結(jié)果集

}

2)入?yún)⒃诒碇惺鞘裁搭愋?,就設(shè)置為對應(yīng)類型,不要擅自改動!??!


8.在IIS上發(fā)布出來

1)添加網(wǎng)站

2)設(shè)置權(quán)限

3)添加默認(rèn)文檔

4)選擇網(wǎng)站對應(yīng)的應(yīng)用程序池,右鍵-高級設(shè)置:,接著設(shè)置“啟用32位應(yīng)用程序”為true,點擊確定

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容