接触PetaPoco已经有一段时间了,为了全面了解一下PetaPoco,刚好结合目前在做的一个项目,对常用的几个业务操作用PetaPoco进行改写,如增删改查、分页以及存储过程的调用,在文章的最后附上我测试的源码(源码有许多不规范的地方,也有冗余,只是简单地改写后为了快速通过函数功能测试,希望大家拍砖指正。)

1、 PetaPoco是C#微型ORM框架,基本无需配置,仅由单个cs文件构成,支持.net3.5 .net4.0。官方还出品了配套的T4模板用来自动生成数据库Models。官方网站:http://www.toptensoftware.com/petapoco/,截稿时PetaPoco的官方最新版本为5.0.1。

2、 从官网下载文件压缩包(另一种安装PetaPoco文件的方式见本文的最后的附录一),下载地址需要注意一下,官方给出的Github下载地址是https://github.com/toptensoftware/PetaPoco,如果你点这个地址下载下来的可能是前一个版本,也就是4.0.3,我个人是遇到这个问题了,以为下载下来的是5.0.1,其实不然,下面给出一个能下载到5.0.1的地址,也是Github上的https://github.com/toptensoftware/PetaPoco/tree/v5,打开链接之后点击右边下载zip包即可。(顺带也提醒一下,官网给出的NuGet下载地址,没有加入版本号,下载到的其实也是4.0.3,所以大家在下载的时候把版本号也加上了,具体请见本文的附录一)。另外,建议大家参与一下官网的这篇文章http://www.toptensoftware.com/Articles/137/Long-Time-No-Post-and-PetaPoco-v5,我也是看完之后才知道我下载的版本不是最新的。说明一下:我下载的时间是2014年4月3日,至于这个日期以后的会不会变化就留给大家去验证了。

3、 先建立一个类库并命名(我的叫做Controller),然后先添加一个App.config文件,创建数据库连接字符串,必须指定为providerName=”System.Data.SqlClient”。把第二步下载到的PetaPoco文件压缩包解压后把T4模板以及PetaPoco.cs文件拷贝到你的项目中,项目结构如下图所示,编辑Database.tt,如果需要自动生成视图的代码,需要加上这一句:IncludeViews = true; 保存文件后再Database.tt 文件上点击右键,运行自定义工具(可能会有一个.net版本警告,可以直接无视),就能在Database.tt下生成一个Database.cs 文件了,文件里面是什么内容,大家打开看一下就明白了。

4、 使用SingleOrDefault或者Delete的时候,参数用object和用string调用的是两个不同的接口,public T SingleOrDefault<T>(object primaryKey)和public T SingleOrDefault<T>(string sql, params object[] args),写法如下:

[WebMethod(Description = "", MessageName = "QueryOne", EnableSession = true)]

public string QueryOne(object strId)

{

var db = Hyet.Model.DbUtils.GetInstance();

object obj = db.SingleOrDefault<Tbl_WaiterInfo>(strId);

return SerializeHelper<Tbl_WaiterInfo>.Serialize(obj);

}

[WebMethod(Description = "", MessageName = "DeleteReal", EnableSession = true)]

public string DeleteReal(object strId)

{

var db = Hyet.Model.DbUtils.GetInstance();

object obj = db.Delete<Tbl_WaiterInfo>(strId);

return obj.ToString();

}

5、 模糊查询,用like关键字的时候需要注意下面的写法,这里特别感谢博客园网友的指点。

//注意有Like关键字用下面这种写法(写法1)
//sql.Append("WHERE W.WaiterName Like '%" + strKeyword + "%' OR W.Sex Like '%" + strKeyword + "%' OR W.WaiterAccount Like '%" + strKeyword + "%' ", strKeyword); //来自博客园网友James-yu的指点(写法2)
sql.Append("WHERE W.WaiterName Like @0 OR W.Sex Like @0 OR W.WaiterAccount Like @0 ", "%" + strKeyword + "%"); //不要采用下面这种方式,实现不了模糊查询
//sql.Append("WHERE W.WaiterName Like '%@0%' OR W.Sex Like '%@0%' OR W.WaiterAccount Like '%@0%' ", strKeyword);

6、 执行存储过程

db.EnableAutoSelect = false; //需要加上这么一句,是否自动添加select子句

//输入参数

var param0 = new SqlParameter("@strInput1", System.Data.SqlDbType.VarChar, );

param0.Direction = System.Data.ParameterDirection.Input;

param0.Value = strInput1;

var param1 = new SqlParameter("@strInput2", System.Data.SqlDbType.NVarChar, );

param1.Direction = System.Data.ParameterDirection.Input;

param1.Value = strInput2;

//输出参数

var param2 = new SqlParameter("@strOutput1", System.Data.SqlDbType.NVarChar, );

param2.Direction = System.Data.ParameterDirection.Output;

param2.Value = DBNull.Value;

var param3 = new SqlParameter("@strOutput2", System.Data.SqlDbType.NVarChar, );

param3.Direction = System.Data.ParameterDirection.Output;

param3.Value = DBNull.Value;

var sql = PetaPoco.Sql.Builder.Append("exec 存储过程名称 @0,@1,@2 output,@3 output", param0, param1, param2, param3);

var result = db.Fetch<T>(sql); //根据实际情况替换T

string str = param2.Value.ToString(); //返回值

string str = param3.Value.ToString();//返回值

7、 存储过程代码示例:

ALTER PROCEDURE [dbo].[proc_ChuChangQiuTong]

@strInput1 NVARCHAR(),

@strInput2 NVARCHAR(),

@strOutput1 NVARCHAR() OUTPUT,

@strOutput2 NVARCHAR() OUTPUT

AS

Declare @SELECT NVARCHAR() ----存放动态生成的SQL语句

BEGIN

SET @SELECT = 'SELECT * FROM dbo.Tbl_WaiterInfo WHERE IsDelete=0'

EXEC(@SELECT) --这里执行结果是一个数据集

SET @strOutput1 = @strInput1

SET @strOutput2 = @strInput2

SELECT @strOutput1

SELECT @strOutput2

END

8、 A表(T4模板自动生成对应的A类)Join B表(T4模板自动生成对应的B类),返回结果按平常习惯来说它应该是一个数据集DataSet或者DataTable,但是,PetaPoco没有返回DataSet或者DataTable的,如Fetch<T>返回的是一个List<T>,这时候就会有麻烦了,这个T到底是写A呢还是写B呢?不用纠结,马上告诉你答案:

解决方法1(最为推荐):因为是用T4模板来自动生成数据库表或者视图的模型类,所以不建议在自动生成的代码里面做过多的扩展,否则一重新生成,之前修改的代码就会被覆盖掉了。再来看一下,T4模板生成的是partial class(MSDN给出的官方定义是这样的:分部类型定义允许将类、结构或接口的定义拆分到多个文件中),如下图所示:

接着上面的话题,首先添加一个新类,使用与T4模板生成的类相同的名字(确保名称空间也要匹配),声明为partial class,给任何Join的列添加[ResultColumn]属性,这里我们决定来partial A,把Join后B的属性加进来,代码举例如下图所示,

最后的执行代码是这样的:var result = db.Fetch<A>(sql);

项目结构如下图所示:

解决方法2(这中方法我本人没有试过,待验证):可以自己写一个类C,这个类的属性就是A和B的Join后的所有列,C类示例代码:

public class C

{

public string p1 { get;set; }

public long p2 { get;set; }

……

}

最后的执行代码:var articles = db.Fetch<C>(sql);

附录一(从NuGet安装PetaPoco,参考来自http://landyer.com/archives/138

VS2010自带了NuGet,但是版本可能不是最新的(我的就不是)。
首先把NuGet升级到最新版本。

1. 打开《扩展管理器》

2. 在左侧的手风琴菜单中选中《更新》

3. 如上图,这种情况就是需要更新《NuGet Package Manager》。如果没有出现,则说明H你的《NuGet》已经是最新的了(前提是你是VS2010),直接进入下一章吧。

4. 点击《更新》,然后按操作进行就ok了。

5. 依次打开《工具》《库程序包管理器》《程序包管理器控制台》

6. 敲入命令对可用的版本进行查询get-package –listavailable –allversion –filter petapoco,如图

7. 我要使用的是petapoco 5.0.1这一个,敲入命令进行安装install-package petapoco –version 5.0.1,如图
中间弹出对话框,直接确定,如果之后报错直接无视就行了。

8. 将当前焦点窗口转移回控制台。如下图输出,表示安装成功。

9. 上图中的《acoms》是我当前的项目,安装的时候默认要有一个打开的项目的Web的桌面的都可以。

10. PetaPoco的安装结束。

附录二(有用的帮助文档)

http://www.toptensoftware.com/petapoco/

http://landyer.com/archives/138

http://www.cnblogs.com/vento/archive/2013/02/09/2909562.html

http://www.cnblogs.com/youring2/archive/2012/06/04/2532130.html

http://www.cnblogs.com/yanxiaodi/archive/2013/03/25/2978606.html

http://www.toptensoftware.com/Articles/74/PetaPoco-Paged-Queries (针对row_number()问题)

附录三(附上我这边调试好的代码片段

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Services;
using Hyet.Model;
using Common;
using PetaPoco;
using System.Data.SqlClient; namespace ServicesApi.API
{
/// <summary>
/// Waiter 的摘要说明
/// </summary>
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(false)]
// 若要允许使用 ASP.NET AJAX 从脚本中调用此 Web 服务,请取消对下行的注释。
// [System.Web.Script.Services.ScriptService]
public class Waiter : System.Web.Services.WebService
{
[WebMethod(Description = "添加", MessageName = "Insert", EnableSession = true)]
public object Insert(string strEntityInfo)
{
var db = Hyet.Model.DbUtils.GetInstance();
Tbl_WaiterInfo waiterInfo = SerializeHelper<Tbl_WaiterInfo>.Deserialize(strEntityInfo);
return db.Insert(waiterInfo);
} [WebMethod(Description = "修改", MessageName = "Update", EnableSession = true)]
public string Update(string strEntityInfo)
{
var db = Hyet.Model.DbUtils.GetInstance();
Tbl_WaiterInfo waiterInfo = SerializeHelper<Tbl_WaiterInfo>.Deserialize(strEntityInfo);
object obj = db.Update(waiterInfo);
return obj.ToString();
} [WebMethod(Description = "真删", MessageName = "DeleteReal", EnableSession = true)]
public string DeleteReal(object strId)
{
//参数用object和用string调用的是两个不同的接口,public T SingleOrDefault<T>(object primaryKey)和public T SingleOrDefault<T>(string sql, params object[] args)
var db = Hyet.Model.DbUtils.GetInstance();
object obj = db.Delete<Tbl_WaiterInfo>(strId);
return obj.ToString();
} [WebMethod(Description = "假删", MessageName = "DeleteNoReal", EnableSession = true)]
public string DeleteNoReal(object strId)
{
//参数用object和用string调用的是两个不同的接口,public T SingleOrDefault<T>(object primaryKey)和public T SingleOrDefault<T>(string sql, params object[] args)
var db = Hyet.Model.DbUtils.GetInstance();
object entity = db.SingleOrDefault<Tbl_WaiterInfo>(strId);
Tbl_WaiterInfo waiterInfo = (Tbl_WaiterInfo)entity;
waiterInfo.IsDelete = ;
object obj = db.Update(waiterInfo);
return obj.ToString();
} [WebMethod(Description = "获取单个实体", MessageName = "QueryOne", EnableSession = true)]
public string QueryOne(object strId)
{
//参数用object和用string调用的是两个不同的接口,public T SingleOrDefault<T>(object primaryKey)和public T SingleOrDefault<T>(string sql, params object[] args)
var db = Hyet.Model.DbUtils.GetInstance();
object obj = db.SingleOrDefault<Tbl_WaiterInfo>(strId);
return SerializeHelper<Tbl_WaiterInfo>.Serialize(obj);
} [WebMethod(Description = "获取所有实体", MessageName = "QueryAll", EnableSession = true)]
public string QueryAll(string strKeyword)
{
var db = Hyet.Model.DbUtils.GetInstance(); var sql = PetaPoco.Sql.Builder.Append("select * from Tbl_WaiterInfo where IsDelete=0");
//注意有Like关键字用下面这种写法(写法1)
//if (!string.IsNullOrEmpty(strKeyword)) { sql.Append("and WaiterName like '%" + strKeyword + "%'"); } //注意有Like关键字只能用下面这种写法(写法2)
if (!string.IsNullOrEmpty(strKeyword)) { sql.Append("and WaiterName like @0 ", "%" + strKeyword + "%"); } //不要采用下面这种方式,实现不了模糊查询
//if (!string.IsNullOrEmpty(strKeyword)) { sql.Append("and WaiterName like '%@0%'", strKeyword); } sql.Append("order by WaiterName asc"); object obj = db.Fetch<Tbl_WaiterInfo>(sql);
return SerializeHelper<Tbl_WaiterInfo>.Serialize(obj);
} [WebMethod(Description = "分页获取实体", MessageName = "QueryPage", EnableSession = true)]
public string QueryPage(long pageIndex, long pageSize, string strKeyword)
{
var db = Hyet.Model.DbUtils.GetInstance(); var sql = PetaPoco.Sql.Builder.Append("select * from Tbl_WaiterInfo where IsDelete=0");
//注意有Like关键字用下面这种写法(写法1)
//if (!string.IsNullOrEmpty(strKeyword)) { sql.Append("and WaiterName like '%" + strKeyword + "%'"); } //注意有Like关键字只能用下面这种写法(写法2)
if (!string.IsNullOrEmpty(strKeyword)) { sql.Append("and WaiterName like @0 ", "%" + strKeyword + "%"); } //不要采用下面这种方式,实现不了模糊查询
//if (!string.IsNullOrEmpty(strKeyword)) { sql.Append("and WaiterName like '%@0%'", strKeyword); } sql.Append("order by WaiterName asc"); object obj = db.Page<Tbl_WaiterInfo>(pageIndex, pageSize, sql);
return SerializeHelper<Tbl_WaiterInfo>.Serialize(obj);
} [WebMethod(Description = "获取记录总数", MessageName = "GetCount", EnableSession = true)]
public string GetCount()
{
var db = Hyet.Model.DbUtils.GetInstance();
object obj = db.ExecuteScalar<long>("select Count(*) from Tbl_WaiterInfo");
return obj.ToString();
} [WebMethod(Description = "判断是否存在", MessageName = "CheckExist", EnableSession = true)]
public string CheckExist(object strId)
{
var db = Hyet.Model.DbUtils.GetInstance();
object obj = db.Exists<Tbl_WaiterInfo>(strId);
return obj.ToString();
} [WebMethod(Description = "执行事务", MessageName = "DoTrans", EnableSession = true)]
public string DoTrans(string strEntityInfo1, string strEntityInfo2)
{
var db = Hyet.Model.DbUtils.GetInstance();
db.BeginTransaction();
try
{
db.CompleteTransaction();
return "success";
}
catch (Exception)
{
db.AbortTransaction();
return "faild";
}
} [WebMethod(Description = "执行存储过程(只有输入参数)", MessageName = "ProcInput", EnableSession = true)]
public string ProcInput(object strInput)
{
var db = Hyet.Model.DbUtils.GetInstance();
db.EnableAutoSelect = false; //一定要加上这句 //注意下面这种写法Input
var param1 = new SqlParameter("@strInput1", System.Data.SqlDbType.NVarChar, );
param1.Direction = System.Data.ParameterDirection.Input;
param1.Value = strInput; var sql = PetaPoco.Sql.Builder.Append("exec proc_KeXuanZeRenRen @0", param1);
object obj = db.Fetch<Tbl_WaiterInfo>(sql);
return SerializeHelper<List<Tbl_WaiterInfo>>.Serialize(obj);
} [WebMethod(Description = "执行存储过程(只有输出参数)", MessageName = "ProcOutput", EnableSession = true)]
public string ProcOutput()
{
var db = Hyet.Model.DbUtils.GetInstance();
db.EnableAutoSelect = false; //一定要加上这句,是否自动添加select子句 //不要用 var param1 = new SqlParameter() { Direction = ParameterDirection.Output, SqlDbType = SqlDbType.NVarChar, Value = DBNull.Value };
//不要用 var param2 = new SqlParameter() { Direction = ParameterDirection.Output, SqlDbType = SqlDbType.NVarChar, Value = DBNull.Value }; //注意下面这种写法Output
var param1 = new SqlParameter("@strOutput1", System.Data.SqlDbType.NVarChar, );
param1.Direction = System.Data.ParameterDirection.Output;
param1.Value = DBNull.Value;
var param2 = new SqlParameter("@strOutput2", System.Data.SqlDbType.NVarChar, );
param2.Direction = System.Data.ParameterDirection.Output;
param2.Value = DBNull.Value; var sql = PetaPoco.Sql.Builder.Append("exec proc_TestOutput @0 output,@1 output", param1, param2);
db.Execute(sql); string str1 = param1.Value.ToString();
string str2 = param2.Value.ToString(); return str1;
} [WebMethod(Description = "执行存储过程(输入输出参数)", MessageName = "ProcInputOutput", EnableSession = true)]
public string ProcInputOutput(object strInput)
{
var db = Hyet.Model.DbUtils.GetInstance();
db.EnableAutoSelect = false; //一定要加上这句,是否自动添加select子句 //注意下面这种写法Input
var param1 = new SqlParameter("@strInput1", System.Data.SqlDbType.NVarChar, );
param1.Direction = System.Data.ParameterDirection.Input;
param1.Value = strInput; //注意下面这种写法Output
var param2 = new SqlParameter("@strOutput1", System.Data.SqlDbType.NVarChar, );
param2.Direction = System.Data.ParameterDirection.Output;
param2.Value = DBNull.Value;
var param3 = new SqlParameter("@strOutput2", System.Data.SqlDbType.NVarChar, );
param3.Direction = System.Data.ParameterDirection.Output;
param3.Value = DBNull.Value; var sql = PetaPoco.Sql.Builder.Append("exec proc_TestInputOutPut @0, @1 output, @2 output", param1, param2, param3);
db.Execute(sql); string str1 = param2.Value.ToString();
string str2 = param3.Value.ToString(); return str1;
} [WebMethod(Description = "执行存储过程(输入输出参数)", MessageName = "ProcInputOutput2", EnableSession = true)]
public string ProcInputOutput2(object strServiceId, object strKeyword, object strWaiterId1,
object strWaiterId2, object strWaiterId3, object strWaiterId4, object pageSize, object pageIndex)
{
var db = Hyet.Model.DbUtils.GetInstance();
db.EnableAutoSelect = false; //一定要加上这句,是否自动添加select子句 //注意下面这种写法Input
var param1 = new SqlParameter("@strServiceId", System.Data.SqlDbType.VarChar, );
param1.Direction = System.Data.ParameterDirection.Input;
param1.Value = strServiceId; var param2 = new SqlParameter("@strKeyword", System.Data.SqlDbType.NVarChar, );
param2.Direction = System.Data.ParameterDirection.Input;
param2.Value = strKeyword; var param3 = new SqlParameter("@strWaiterId1", System.Data.SqlDbType.NVarChar, );
param3.Direction = System.Data.ParameterDirection.Input;
param3.Value = strWaiterId1; var param4 = new SqlParameter("@strWaiterId2", System.Data.SqlDbType.NVarChar, );
param4.Direction = System.Data.ParameterDirection.Input;
param4.Value = strWaiterId2; var param5 = new SqlParameter("@strWaiterId3", System.Data.SqlDbType.NVarChar, );
param5.Direction = System.Data.ParameterDirection.Input;
param5.Value = strWaiterId3; var param6 = new SqlParameter("@strWaiterId4", System.Data.SqlDbType.NVarChar, );
param6.Direction = System.Data.ParameterDirection.Input;
param6.Value = strWaiterId4; var param7 = new SqlParameter("@pageSize", System.Data.SqlDbType.NVarChar, );
param7.Direction = System.Data.ParameterDirection.Input;
param7.Value = pageSize; var param8 = new SqlParameter("@pageIndex", System.Data.SqlDbType.NVarChar, );
param8.Direction = System.Data.ParameterDirection.Input;
param8.Value = pageIndex; //注意下面这种写法Output
var param9 = new SqlParameter("@strOutput1", System.Data.SqlDbType.NVarChar, );
param9.Direction = System.Data.ParameterDirection.Output;
param9.Value = DBNull.Value; var sql = PetaPoco.Sql.Builder.Append("exec proc_ChuChangQiuTong @0,@1,@2,@3,@4,@5,@6,@7,@8 output", param1, param2, param3, param4, param5, param6, param7, param8, param9);
var result = db.Fetch<Tbl_WaiterInfo>(sql); string str9 = param9.Value.ToString(); return str9;
} [WebMethod(Description = "可选出场球童", MessageName = "SelectChuChangQiuTong", EnableSession = true)]
public void SelectChuChangQiuTong(string strKeyword, string strWaiterId1, string strWaiterId2,
string strWaiterId3, string strWaiterId4, int pageSize, int pageIndex)
{
var db = Hyet.Model.DbUtils.GetInstance(); var sql = PetaPoco.Sql.Builder.Append("SELECT * FROM (");
sql.Append("SELECT UniqueID,WaiterName,WaiterAccount,IsDelete,Sex,WorkStautsName,WorkLeaveName FROM dbo.View_WaiterInfo WHERE IsDelete=0 ");
sql.Append("AND UniqueID NOT IN (SELECT WaiterInfoID FROM dbo.View_ServiceWaiters WHERE ServiceEnd IS NULL) "); //过滤已经分配设备的球童
sql.Append("AND UniqueID IN (SELECT DutyWaiterID FROM dbo.Tbl_Equipment WHERE DutyWaiterID IS NOT NULL) "); //过滤掉已经选择的第1\2\3\4个球童
if (!string.IsNullOrEmpty(strWaiterId1)) { sql.Append("AND UniqueID<>'@0' ", strWaiterId1); }
if (!string.IsNullOrEmpty(strWaiterId2)) { sql.Append("AND UniqueID<>'@0' ", strWaiterId2); }
if (!string.IsNullOrEmpty(strWaiterId3)) { sql.Append("AND UniqueID<>'@0' ", strWaiterId3); }
if (!string.IsNullOrEmpty(strWaiterId4)) { sql.Append("AND UniqueID<>'@0' ", strWaiterId4); } sql.Append(") W "); sql.Append("INNER JOIN "); sql.Append("(");
sql.Append("SELECT UniqueID AS EquipmentUniqueID,EquipmentName,EquipmentNo,MobileNumber,");
sql.Append("DutyWaiterID,UseStatus FROM dbo.Tbl_Equipment WHERE UseStatus=1 AND IsDelete=0");
sql.Append(") E "); sql.Append("ON W.UniqueID = E.DutyWaiterID "); //模糊查询
if (!string.IsNullOrEmpty(strKeyword))
{
//注意有Like关键字用下面这种写法(写法1)
//sql.Append("WHERE W.WaiterName Like '%" + strKeyword + "%' OR W.Sex Like '%" + strKeyword + "%' OR W.WaiterAccount Like '%" + strKeyword + "%' ", strKeyword); //来自博客园网友James-yu的指点(写法2)
sql.Append("WHERE W.WaiterName Like @0 OR W.Sex Like @0 OR W.WaiterAccount Like @0 ", "%" + strKeyword + "%"); //不要采用下面这种方式,实现不了模糊查询
//sql.Append("WHERE W.WaiterName Like '%@0%' OR W.Sex Like '%@0%' OR W.WaiterAccount Like '%@0%' ", strKeyword);
} //结果排序
sql.Append("ORDER BY W.WaiterAccount ASC"); Page<Tbl_WaiterInfo> page = db.Page<Tbl_WaiterInfo>(pageIndex, pageSize, sql); List<Tbl_WaiterInfo> list = page.Items; string str = db.LastCommand;
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Runtime.Serialization.Json; namespace Common
{
/// <summary>
/// XML序列化助手类
/// </summary>
public class SerializeHelper<T>
{
public static string Serialize(object obj)
{
if (obj == null) return null;
using (MemoryStream memoryStream = new MemoryStream())
{
DataContractJsonSerializer dataContractJsonSerializer = new DataContractJsonSerializer(obj.GetType());
dataContractJsonSerializer.WriteObject(memoryStream, obj);
return Encoding.UTF8.GetString(memoryStream.ToArray());
}
} public static T Deserialize(string str)
{ using (MemoryStream memoryStream = new MemoryStream(Encoding.UTF8.GetBytes(str)))
{
DataContractJsonSerializer dataContractJsonSerializer = new DataContractJsonSerializer(typeof(T));
return (T)dataContractJsonSerializer.ReadObject(memoryStream);
}
}
}
}

(原创)PetaPoco使用小记(2014-5-5更新)的更多相关文章

  1. [原创] 【2014.12.02更新网盘链接】基于EasySysprep4.1的 Windows 7 x86/x64 『视频』封装

    [原创] [2014.12.02更新网盘链接]基于EasySysprep4.1的 Windows 7 x86/x64 『视频』封装 joinlidong 发表于 2014-11-29 14:25:50 ...

  2. app后端设计(2)--xmpp的使用(2014.01.14更新)

    在app中有时候是需要添加聊天服务,在这里谈谈曾经开发聊天服务的经验: (1)聊天服务端选的openfire,这是一个基于xmpp协议的聊天服务器(XMPP是一种基于XML的协议,它继承了在XML环境 ...

  3. app后端设计(11)-- 系统架构(2014.12.05更新)

    个人认为,在小型的创业团队中,特别是以应用产品为主,在架构后台的时候,需要集中精力解决自身业务上的问题,不是花时间解决第三方已经解决的问题,简单点来说,就是能用第三方服务就使用第三方的服务.基于这个原 ...

  4. 【原创】我所理解的自动更新-APP发布与后台发布

    发布后台 创建渠道:添加新的渠道,设置渠道名称,自动生成渠道id.    查看渠道:查看渠道基本信息,渠道app版本号,资源版本号,是否开启更新.    创建/更新APP:选择打包ios,androi ...

  5. 【原创】我所理解的自动更新-外网web服务器配置

    ClientDownload和ClientUpdate共享渠道配置信息: channel-0.php //以appstore的渠道为例 <?php define('APPNAME', 'TOKE ...

  6. App Store审核指南中文版(2014.10.11更新)

    App Store审核指南中文版(2014.10.11更新) 2014-10-11 16:36 编辑: suiling 分类:AppStore研究 来源:CocoaChina  2 8657 App ...

  7. OpenStack 2014.1(Icehouse) 更新说明

    OpenStack 2014.1(Icehouse) 更新说明 1.综合升级说明 Ÿ   Windows安装包应使用PBR 0.8版本,以避免发生bug1294246 Ÿ   log-config选项 ...

  8. 在SQL Server 2014里可更新的列存储索引 (Updateable Column Store Indexes)

    传统的关系数据库服务引擎往往并不是对超大量数据进行分析计算的最佳平台,为此,SQL Server中开发了分析服务引擎去对大笔数据进行分析计算.当然,对于数据的存放平台SQL Server数据库引擎而言 ...

  9. app后端设计(3)--短信,邮件,推送服务(2014.12.05更新)

    在app的后端设计中,免不了消息的推送,短信,邮件等服务,下面就个人的开发经验谈谈这方面. (1)最重要的是,各种推送一定要放在队列系统中处理,不然会严重影响api的响应时间. (2)短信方面 以前我 ...

随机推荐

  1. angularjs动态添加节点时,绑定到$scope中

    <html> <head> <meta charset="utf-8"/> <script src="https://cdn.b ...

  2. dreamwave基础

    WEBcs架构需要在客户段安装程序, 需要安装程序, 工作量会比较大, 需要安装和维护, 比如以后系统升级, 会很麻烦. 优点是一些业务逻辑可以在客户端, 可以减少服务器的一些压力, 客户端的界面操作 ...

  3. Date.parse和new Date(str)的兼容性问题

    Date.parse和new Date(str)的兼容性问题 Date '2015-05-04'是无法被各个浏览器中,使用new Date(str)来正确生成日期对象的. 正确的用法是'2015/05 ...

  4. 使用jQuery可能出现的错误

  5. PHP下ajax跨域的解决方案之jsonp

    首先要说明一下json和jsonp的区别? json是一种基于文本的数据交换方式,或者叫做描述数据的一种格式. var person = { "name": "test& ...

  6. NPOI创建doc

    using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.We ...

  7. golang协程进行同步方法

    1.使用chanel func main() { done := make(chan bool) ticker := time.NewTicker(time.Millisecond * 1000) g ...

  8. JTemplate学习(二)

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DT ...

  9. Laravel 5.4+Vue.js 初体验:Laravel下配置运行Vue.js

    生产材料PHP:PHP 5.6+Laravel 5.4:https://github.com/laravel/laravel/releases/Composer:http://getcomposer. ...

  10. action spring 注入错误,如果检查各项注入都没有错误时,考虑struts 是否配置了namespace(如果你有多个namespace="/")

    [ERROR] 2015-01-04 09:42:35,180 (CommonsLogger.java:38) - Exception occurred during processing reque ...