一、概述
平臺: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,點擊確定