WebService总结(2017/11/12)

一、概述

平台:VS2015

语言:C#

技术:ELINQ

数据库:ORACLE

成果:一个能实现对数据库中的表进行增删改查功能的接口

接口返回的结果:JSON格式的结果集


二、流程

1.添加网站,新建一个web服务。


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


3.配置数据库连接信息。在Web.config文件中添加连接字符串:


WebService总结(2017/11/12)_第1张图片


WebService总结(2017/11/12)_第2张图片



4.先添加实体类,在其中添加命名空间:using Nlite.Data;并映射数据库中的表,原则上实体类名要和表名一致或遵循一定规律。例如casetype类(映射Oracle数据库中的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; }

///

///区级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; }

///

///区级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;

///

///返回服务器时间

///

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

///

///返回结果的数量

///

publicint Count { get; set; }

///

///业务逻辑处理结果

///

publicbool Result { get; set; }

}

public enum codetype

{

///

///执行成功

///

CODE_OK = 0,

///

///执行失败

///

CODE_ERROR = 1

}

再添加Returntype类,以JSON格式返回结果集。

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//输出的内容详情

{

Code = head.Code,

Errmsg = head.Msg,

ServerTime = head.ServerTime,

Result = head.Result,

Count = head.Count,

Data = data

};

//设置时间格式

IsoDateTimeConverter timeFormat = new IsoDateTimeConverter(); //实例化一个标准数据时间格式的对象

timeFormat.DateTimeFormat = "yyyy-MM-dd HH:mm:ss";//指定输出的时间格式

IList converts = new List(); //初始化实例,表示可按照索引单独访问的一组对象,转换对象为JSON,没懂?

converts.Add(timeFormat);//添加时间格式,没懂?

//设置输出语句

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

new JsonSerializerSettings()

{

ReferenceLoopHandling = ReferenceLoopHandling.Ignore,

ContractResolver = new CamelCasePropertyNamesContractResolver(),

Converters =converts

}));//将字符串写如HTTP响应输出流,JsonConvert类提供.NET和JSON类型转换的方法:SerializeObject方法(具体连载对象,默认格式,初始化一个JSON连载设置)

}

}


5.再添加SsisDbContext类,在这个类中连接数据库(创建DbConfiguration对象、设置SQL语句输出日志、注册实体到数据表的映射关系),然后创建DbSet对象(表示用于执行插入、读取、更新和删除操作的类型化实体集,对实体集的所有增删改查操作会立即同步到数据库对应的表中)。


5.1映射关系总结:

一对一:第一种是一对一主键关联,要求两个主键必须完全一致;第二种是一对一外键关联(未懂)。例子,一个球队对应一个地址。

一对多:例如,从球队角度来说,一个球队拥有多个球员

多对一:例如,从球员角度来说,多个球员属于一个球队

多对多:如学生与选修课之间的关系,一个学生可以选择多门选修课,每门选修课又可以被多名学生选择。一般是采用中间表的方式处理,转化为两个一对多。

代码示例:

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);

});//设置SQL语句输出日志,注册实体到数据表的映射关系,从caseinfo的角度来说,caseinfomodel与casetypemodel是一对一的关系

publicSsisDbContext():base(dbConfig)//根据DbConfiguration创建DbContext的对象

{

//

// TODO:在此处添加构造函数逻辑

//ELinq

}

publicreadonly IDbSet CaseInformation;//表示用于执行插入、读取、更新和删除操作的类型化实体集,对实体集中所有的增删改查操作会立即同步到数据库对应的表中

publicreadonly IDbSet CASEINFO;

publicreadonly IDbSet CASETYPE;

}


6.主体代码编写(实现增删改查)

在using( SsisDbContext db = new SsisDbContext()) {}中写基于ELINQ技术的增删改查的语句。


6.1查询:

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

其中where语句中写筛选条件,select语句将序列中的每个元素投影到新表中,tolist语句将表转换为集合


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));//执行更新,并返回进行更新的记录数。


6.4删除-delete(返回一个INT型的值)

intcount =

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

pidval && p.treetype == treetypeval);//执行删除操作,并返回删除记录的数量


6.5多表联合查询

先搞明白表与表之间的映射关系,是一对一,还是多对一,或者一对多;

然后使用include语句立即加载针对特定关系检索的对象;

接着输出指定查询信息。

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

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

{

DOCID = c.DOCID,

typename =c.CaseType.TYPENAME

}).ToList();//通过docid查询对应的案件记录,并将序列中的每个元素投射到新表中


7.注意事项

1)一定要如下设置异常信息捕捉,以便于查看BUG原因!!!

catch(Exceptionex)//异常信息

{

hd.Msg = ex.ToString();//数据库自带的异常信息

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

}

2)入参在表中是什么类型,就设置为对应类型,不要擅自改动!!!


8.在IIS上发布出来

1)添加网站

2)设置权限

3)添加默认文档

4)选择网站对应的应用程序池,右键-高级设置:,接着设置“启用32位应用程序”为true,点击确定

你可能感兴趣的:(WebService总结(2017/11/12))