PetaPoco靳怎么读读

posts - 42,&
comments - 19,&
trackbacks - 0
大部分转自:&/archives/138
PetaPoco C#微型ORM框架,基本无需配置,仅由单个cs文件构成,支持.net3.5 .net4.0。
截稿时PetaPoco的官方最新版本为5.0.1。我不采用5.0.1版本,因为我用的是.net3.5,而5.0.1的版本中用到了一个类System.Tuple,这个类是从.net4.0才开始有的。(当然也可以自己实现这个类,不过像我这样的初学者还是算了吧)。
NuGet图形界面中默认列出的只有最新版本,一装就是5.0.1,&那就是使用NuGet命令行。
1.依次打开《工具》《库程序包管理器》《程序包管理器控制台》
2.敲入命令对可用的版本进行查询get-package &listavailable &allversion &filter petapoco,如图
3.敲入命令进行安装install-package petapoco &version 4.0.3
配置PetaPoco
现在又遇到一个问题,使用Ctrl+Shift+B编译项目的时候报错,说dynamic神马的不存在。
这是因为Dynamic也是.net4.0的。PetaPoco官方提供了一个编译时的选项来开启&关闭对dynamic的支持。
下面来进行编译选项的设置:
在项目上《右键》《属性》
选择左侧tab的第二项《生成》,在《条件编译符号》中输入PETAPOCO_NO_DYNAMIC
保存,再次Ctrl+Shift+B,进行编译。这次就OK了。
配置PetaPoco T4模板
打开Database.tt文件
ConnectionStringName = "WorkDemo";
// Uses last connection string in config if not specified
Namespace = "WorkDemo.Tests.Models";
RepoName = "PPUtils";
//辅助类的名字
PetaPoco使用示例
& & 一对多 和 多对一
为Account增加一个额外的属性AccountUsers
为Account_User增加一个额外的属性Account
将Account和Account_User进行关联
public partial class Account
[PetaPoco.Ignore]
public List&Account_User& AccountUsers { get; set; }
public partial class Account_User
[PetaPoco.Ignore]
public Account Account { get; set; }
public class UserAccountRelator
private Dictionary&long, Account& accounts = new Dictionary&long, Account&();
public Account_User MapIt(Account account, Account_User user)
Account accountE
if (accounts.TryGetValue(account.Id, out accountExisting))
account = accountE
accounts.Add(account.Id, account);
user.Account =
public class AccountUserRelator
public Account MapIt(Account account, Account_User user)
if (account == null)
if (current != null && current.Id == account.Id)
current.AccountUsers.Add(user);
return null;
var prev =
current.AccountUsers = new List&Account_User&();
current.AccountUsers.Add(user);
& & 查询:
var users = db.Fetch&Account, Account_User, Account_User&(
new UserAccountRelator().MapIt,
"select * from Account A left join Account_User AU on AU.AccountId=A.Id "
foreach (Account_User user in users)
Console.WriteLine("{0} - {1}", user.Id, user.UserName);
var accounts = db.Fetch&Account, Account_User, Account&(
new AccountUserRelator().MapIt,
"select * from Account A left join Account_User AU on AU.AccountId=A.Id "
foreach (Account acc in accounts)
Console.WriteLine("{0} - {1}", acc.Id, acc.Name);
阅读(...) 评论()PetaPoco是一款适用于.Net 和Mono的微小、快速、单文件的微型ORM。
PetaPoco有以下特色:
微小,没有依赖项&&单个的C#文件可以方便的添加到任何项目中。
工作于严格的没有装饰的Poco类,和几乎全部加了特性的Poco类
Insert/Delete/Update/Save and IsNew 等帮助方法。
分页支持:自动得到总行数和数据
支持简单的事务
更好的支持参数替换,包括从对象属性中抓取命名的参数。
很好的性能,剔除了Linq,并通过Dynamic方法快速的为属性赋值
T4模板自动生成Poco类
查询语言是Sql&&不支持别扭的fluent或Linq语法(仁者见仁,智者见智)
包含一个低耦合的Sql Builder类,让内联的Sql更容易书写
为异常信息记录、值转换器安装和数据映射提供钩子。(Hooks for logging exceptions, installing value converters and mapping columns to properties without attributes.)
兼容SQL Server, SQL Server CE, MySQL, PostgreSQL and Oracle。
可以在.NET 3.5 或Mono 2.6或更高版本上运行
在.NET 4.0 和Mono 2.8下支持dynamic
NUnit单元测试
开源(Apache License)
所有功能大约用了1500行代码
可以从这里获得PetaPoco:
代码展示:
首先,定义一个Poco类:
// Represents a record in the "articles" table
public class article
public long article_id { }
public string title { }
public DateTime date_created { }
public bool draft { }
public string content { }
接下来,创建一个PetaPoco.Database,来执行查询:
// Create a PetaPoco database object
var db=new PetaPoco.Database("connectionStringName");
// Show all articles
foreach (var a in db.Query&article&("SELECT * FROM articles"))
Console.WriteLine("{0} - {1}", a.article_id, a.title);
得到一个scalar:
long count=db.ExecuteScalar&long&("SELECT Count(*) FROM articles");
得到一行记录:
var a = db.SingleOrDefault&article&("SELECT * FROM articles WHERE article_id=@0", 123));
获取分页数据:
PetaPoco能够自动完成分页请求
var result=db.Page&article&(1, 20, // &-- page number and items per page
"SELECT * FROM articles WHERE category=@0 ORDER BY date_posted DESC", "coolstuff");
你将会得到一个PagedFetch对象:
public class Page&T& where T:new()
public long CurrentPage { }
public long ItemsPerPage { }
public long TotalPages { }
public long TotalItems { }
public List&T& Items { }
PetaPoco在背后为我们做了一下处理:
生成并执行一个查询,得到匹配的数据行数
修改原始的查询语句,使其只得到所有匹配数据的一个子集
你现在已经拥有了一个展示单页数据的一切东西和一个分页控制器,他们被封装在一个现成的小对象中。(You now have everything to display a page of data and a pager control all wrapped up in one handy little object!)
Query vs Fetch
Database 对象有两个获取数据的方法:Query 和Fetch。这两个方法非常相似,不同的是Fetch方法返回一个POCO类的List&&,而Query使用&yield return&迭代所有数据,这些数据并没有加载到内存中。
不带查询的命令
使用Execute 方法执行一个不带查询的命令:
db.Execute("DELETE FROM articles WHERE draft&&0");
Inserts、Updates 和 Deletes
PetaPoco提供了insert、update和delete操作的帮助。
在插入一条记录时,你需要指定插入的表名和主键:
// Create the article
var a=new article();
a.title="My new article";
a.content="PetaPoco was here";
a.date_created=DateTime.UtcN
// Insert it
db.Insert("articles", "article_id", a);
// by now a.article_id will have the id of the new article
更新记录也一样:
// Get a record
var a=db.SingleOrDefault&article&("SELECT * FROM articles WHERE article_id=@0", 123);
// Change it
a.content="PetaPoco was here again";
// Save it
db.Update("articles", "article_id", a);
或者你可以传一个匿名类来更新一部分字段。下面的代码只更新article的title字段:
db.Update("articles", "article_id", new { title="New title" }, 123);
// Delete an article extracting the primary key from a record
db.Delete("articles", "article_id", a);
// Or if you already have the ID elsewhere
db.Delete("articles", "article_id", null, 123);
修饰POCO类
在上面的例子中,必须指明表名和主键是很烦人的,你可以在你的Poco类中附加这些信息:
// Represents a record in the "articles" table
[PetaPoco.TableName("articles")]
[PetaPoco.PrimaryKey("article_id")]
public class article
public long article_id { }
public string title { }
public DateTime date_created { }
public bool draft { }
public string content { }
简化后的insert、update、delete:
// Insert a record
var a=new article();
a.title="My new article";
a.content="PetaPoco was here";
a.date_created=DateTime.UtcN
db.Insert(a);
// Update it
a.content="Blah blah";
db.Update(a);
// Delete it
db.Delete(a);
delete和update的其它方式
// Delete an article
db.Delete&article&("WHERE article_id=@0", 123);
// Update an article
db.Update&article&("SET title=@0 WHERE article_id=@1", "New Title", 123);
你还可以告诉POCO忽略某列
public class article
[PetaPoco.Ignore]
public long SomeCalculatedFieldPerhaps
或许你喜欢一点更详细的描述。和自动映射所有列相比,你可以通过使用类和列的属性来指明哪些列需要映射。
// Represents a record in the "articles" table
[PetaPoco.TableName("articles")]
[PetaPoco.PrimaryKey("article_id")]
[PetaPoco.ExplicitColumns]
public class article
[PetaPoco.Column]publiclong article_id {}
[PetaPoco.Column]publicstring title {}
[PetaPoco.Column]publicDateTime date_created {}
[PetaPoco.Column]public bool draft {}
[PetaPoco.Column]publicstring content {}
它可以结合partial class 很好的工作,把需要绑定的字段放在一个.cs文件中,把计算得到的和别的有用的属性添加到分开的文件中,而不用去考虑DAL。
好吧,PetaPoco仅支持少数几个,因为我不想引起混乱。
Hey!稍等&&它们不是POCO对象了!
当然,它们打破了严格的POCO概念,但使用它们可以让POCO更容易工作。
Writing all those POCO objects can soon get tedious and error prone... so PetaPoco includes a&&that can automatically write classes for all the tables in your your SQL Server, SQL Server CE, MySQL, PostgreSQL or Oracle database.
Using the T4 template is pretty simple. The git repository includes three files (The NuGet package adds these to your project automatically in the folder&\Models\Generated).
PetaPoco.Core.ttinclude - includes all the helper routines for reading the DB schema
PetaPoco.Generator.ttinclude - the actual template that defines what's generated
Database.tt - the template itself that includes various settings and includes the two other ttinclude files.
A typical Database.tt file looks like this:
&#@ include file="PetaPoco.Core.ttinclude" #&&#& & // Settings& & ConnectionStringName="jab";& & Namespace=ConnectionStringName;& & DatabaseName=ConnectionStringName;& & stringRepoName=DatabaseName+"DB";& & bool GenerateOperations=true;& & // Load tables& & var tables =LoadTables();#&&#@ include file="PetaPoco.Generator.ttinclude" #&
To use the template:
Add the three files to you C# project
Make sure you have a connection string and provider name set in your app.config or web.config file
Edit ConnectionStringName property in Records.tt (ie: change it from "jab" to the name of your connection string)
Save Database.tt.
All going well Database.cs should be generated with POCO objects representing all the tables in your database. To get the project to build you'll also need to add PetaPoco.cs to your project and ensure it is set to compile (NuGet does this for you) .
The template is based on the&&template. If you're familiar with its ActiveRecord templates you'll find PetaPoco's template very similar.
自动的Select语句
当使用PetaPoco时,大多数查询都以"SELECT * FROM table"开头。鉴于我们现在可以从POCO对象的attribute中得到表名,我们没有理由不自动生成Select语句。
如果你运行一个不以select开头的查询, PetaPoco会自动的将它加上:
// Get a record
var a=db.SingleOrDefault&article&("SELECT * FROM articles WHERE article_id=@0",123);
可以简写:
// Get a recordvar a=db.SingleOrDefault&article&("WHERE article_id=@0",123);
PetaPoco实际上并不生成"SELECT *",它更准确的得到要查询的列名。
IsNew 和Save 方法
有时你有一个POCO,你想要知道数据库中是否已经存在。因为我们有主键,我们所要做的检查是该属性被设置为别的值还是默认值。
检测是否为新增:
// Is this a new record if(db.IsNew(a)){& & // Yes it is...}
和它相关联还有一个Save方法,它将根据判断的结果执行Insert或Update。
// Save a new or existing recorddb.Save(a);
事务相当的简单:
using (var scope=db.Transaction){& & // Do transacted updates here& & // Commit& & scope.Complete();}
事务可以是嵌套的,因此你可以调用其它包含事务的方法,或者被包含在单个的事务中。当所有事务都执行完成了,事务将会提交,否则所有操作都将回滚。
注意:为了使用事务,所有操作都需要相同的PetaPoco Database对象实例。你很可能想到IOC容器中为在每一个http请求或每一个线程共享同一个实体,我喜欢用。
Linq从哪儿实现?
没有任何支持。我在Subsonic中使用Linq很长时间,我发现自己下降到使用&来做这些事情,因为:
&不能用简单的Linq实现
&在.NET 下工作,但不支持Mono(尤其是Mono 2.6)
低效。例如:Subsonic 中activerecord.SingleOrDefault(x=x.id==123)的效率比CodingHorror 低20倍。
Now that I've got CodingHorror all over the place it bugs me that half the code is Linq and half is SQL.
Also, I've realized that for me the most annoying thing about SQL directly in the code is not the fact that it's SQL but that it's nasty to format nicely and to build up those SQL strings.
PetaPoco's SQL Builder
目前已经有很多构建SQL的API,以下是我的版本,它确实很基础!
我的目标是格式化SQL更简单,并且通过适当的参数替换达到防止SQL注入的作用。这不能保证SQL语法的正确,也不支持使用intellisense。
以下是非常基础的写法:
var id=123;var a=db.Query&article&(PetaPoco.Sql.Builder& & .Append("SELECT * FROM articles")& & .Append("WHERE article_id=@0", id))
很管用吧,参数索引器来通过调用.Append是多么酷啊!【Big deal right? Well what's cool about this is that the parameter indicies are specific to each&.Append&call:】
var id=123;var a=db.Query&article&(PetaPoco.Sql.Builder& & .Append("SELECT * FROM articles")& & .Append("WHERE article_id=@0", id)& & .Append("AND date_created&@0",DateTime.UtcNow))
你也可以根据条件构建SQL:
var id=123;var sql=PetaPoco.Sql.Builder& & .Append("SELECT * FROM articles")& & .Append("WHERE article_id=@0", id);if(start_date.HasValue)& & sql.Append("AND date_created&=@0", start_date.Value);if(end_date.HasValue)& & sql.Append("AND date_created&=@0", end_date.Value);var a=db.Query&article&(sql)
注意到每个append调用都用到餐厨@0了吗?PetaPoco构建整个列表的参数,将这些参数索引更新到内部。
你也可以使用命名参数,然后他会在传递的参数中找到合适的属性名。
sql.Append("AND date_created&=@start AND date_created&=@end", & & & & & & & & new & & & & & & & & { & & & & & & & & & & start=DateTime.UtcNow.AddDays(-2), & & & & & & & & & & end=DateTime.UtcNow & & & & & & & & }& & & & & & );
不管是数字的还是命名的参数,如果任何一个参数不能被推断出来,都会抛出一个异常。
这里还有几个创建SQL的公用方法:
var sql=PetaPoco.Sql.Builder()& & & & & & .Select("*")& & & & & & .From("articles")& & & & & & .Where("date_created & @0",DateTime.UtcNow)& & & & & & .OrderBy("date_created DESC");
跟踪Sql命令
有些时候能够看到执行的Sql语句会非常有用,PetaPoco为此提供了三个属性:
LastSQL - 非常明显,不解释
LastArgs - 传递的参数数组
LastCommand - SQL语句和参数字符串
在调试器中查看LastCommand属性能够简单的看到执行了那些操作!
OnException Handler Routine
PetaPoco所执行的Sql命令都封装在try/catch语句块中,所有的异常信息都会传递给OnException虚方法。通过记录这些异常(或在这个方法中设置断点),你可以轻松的跟踪那些地方出现了问题。
上面的内容展示了最基本的PetaPoco使用方法,想了解更多,请。
原文地址:
转自:/youring2/archive//2532130.html
阅读(...) 评论()接触PetaPoco已经有一段时间了,为了全面了解一下PetaPoco,刚好结合目前在做的一个项目,对常用的几个业务操作用PetaPoco进行改写,如增删改查、分页以及存储过程的调用,在文章的最后附上我测试的源码(源码有许多不规范的地方,也有冗余,只是简单地改写后为了快速通过函数功能测试,希望大家拍砖指正。)
1、 PetaPoco是C#微型ORM框架,基本无需配置,仅由单个cs文件构成,支持.net3.5 .net4.0。官方还出品了配套的T4模板用来自动生成数据库Models。官方网站:,截稿时PetaPoco的官方最新版本为5.0.1。
2、 从官网下载文件压缩包(另一种安装PetaPoco文件的方式见本文的最后的附录一),下载地址需要注意一下,官方给出的Github下载地址是,如果你点这个地址下载下来的可能是前一个版本,也就是4.0.3,我个人是遇到这个问题了,以为下载下来的是5.0.1,其实不然,下面给出一个能下载到5.0.1的地址,也是Github上的,打开链接之后点击右边下载zip包即可。(顺带也提醒一下,官网给出的NuGet下载地址,没有加入版本号,下载到的其实也是4.0.3,所以大家在下载的时候把版本号也加上了,具体请见本文的附录一)。另外,建议大家参与一下官网的这篇文章,我也是看完之后才知道我下载的版本不是最新的。说明一下:我下载的时间是日,至于这个日期以后的会不会变化就留给大家去验证了。
3、 先建立一个类库并命名(我的叫做Controller),然后先添加一个App.config文件,创建数据库连接字符串,必须指定为providerName=&System.Data.SqlClient&。把第二步下载到的PetaPoco文件压缩包解压后把T4模板以及PetaPoco.cs文件拷贝到你的项目中,项目结构如下图所示,编辑Database.tt,如果需要自动生成视图的代码,需要加上这一句:IncludeViews = 保存文件后再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, 255);
param0.Direction = System.Data.ParameterDirection.I
param0.Value = strInput1;
var param1 = new SqlParameter("@strInput2", System.Data.SqlDbType.NVarChar, 255);
param1.Direction = System.Data.ParameterDirection.I
param1.Value = strInput2;
//输出参数
var param2 = new SqlParameter("@strOutput1", System.Data.SqlDbType.NVarChar, 255);
param2.Direction = System.Data.ParameterDirection.O
param2.Value = DBNull.V
var param3 = new SqlParameter("@strOutput2", System.Data.SqlDbType.NVarChar, 255);
param3.Direction = System.Data.ParameterDirection.O
param3.Value = DBNull.V
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(255),
@strInput2 NVARCHAR(255),
@strOutput1 NVARCHAR(255) OUTPUT,
@strOutput2 NVARCHAR(255) OUTPUT
Declare @SELECT NVARCHAR(1000) ----存放动态生成的SQL语句
SET @SELECT = 'SELECT * FROM dbo.Tbl_WaiterInfo WHERE IsDelete=0'
EXEC(@SELECT) --这里执行结果是一个数据集
SET @strOutput1 = @strInput1
SET @strOutput2 = @strInput2
SELECT @strOutput1
SELECT @strOutput2
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,参考来自)
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的安装结束。
附录二(有用的帮助文档)
/petapoco/
/archives/138
/vento/archive//2909562.html
/youring2/archive//2532130.html
/yanxiaodi/archive//2978606.html
&(针对row_number()问题)
附录三(附上我这边调试好的代码片段)
using System.Collections.G
using System.L
using System.W
using System.Web.S
using Hyet.M
using PetaP
using System.Data.SqlC
namespace ServicesApi.API
/// &summary&
/// Waiter 的摘要说明
/// &/summary&
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[ponentModel.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)
waiterInfo.IsDelete = 1;
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();
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, 255);
param1.Direction = System.Data.ParameterDirection.I
param1.Value = strI
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, 255);
param1.Direction = System.Data.ParameterDirection.O
param1.Value = DBNull.V
var param2 = new SqlParameter("@strOutput2", System.Data.SqlDbType.NVarChar, 255);
param2.Direction = System.Data.ParameterDirection.O
param2.Value = DBNull.V
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, 255);
param1.Direction = System.Data.ParameterDirection.I
param1.Value = strI
//注意下面这种写法Output
var param2 = new SqlParameter("@strOutput1", System.Data.SqlDbType.NVarChar, 255);
param2.Direction = System.Data.ParameterDirection.O
param2.Value = DBNull.V
var param3 = new SqlParameter("@strOutput2", System.Data.SqlDbType.NVarChar, 255);
param3.Direction = System.Data.ParameterDirection.O
param3.Value = DBNull.V
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, 255);
param1.Direction = System.Data.ParameterDirection.I
param1.Value = strServiceId;
var param2 = new SqlParameter("@strKeyword", System.Data.SqlDbType.NVarChar, 255);
param2.Direction = System.Data.ParameterDirection.I
param2.Value = strK
var param3 = new SqlParameter("@strWaiterId1", System.Data.SqlDbType.NVarChar, 255);
param3.Direction = System.Data.ParameterDirection.I
param3.Value = strWaiterId1;
var param4 = new SqlParameter("@strWaiterId2", System.Data.SqlDbType.NVarChar, 255);
param4.Direction = System.Data.ParameterDirection.I
param4.Value = strWaiterId2;
var param5 = new SqlParameter("@strWaiterId3", System.Data.SqlDbType.NVarChar, 255);
param5.Direction = System.Data.ParameterDirection.I
param5.Value = strWaiterId3;
var param6 = new SqlParameter("@strWaiterId4", System.Data.SqlDbType.NVarChar, 255);
param6.Direction = System.Data.ParameterDirection.I
param6.Value = strWaiterId4;
var param7 = new SqlParameter("@pageSize", System.Data.SqlDbType.NVarChar, 255);
param7.Direction = System.Data.ParameterDirection.I
param7.Value = pageS
var param8 = new SqlParameter("@pageIndex", System.Data.SqlDbType.NVarChar, 255);
param8.Direction = System.Data.ParameterDirection.I
param8.Value = pageI
//注意下面这种写法Output
var param9 = new SqlParameter("@strOutput1", System.Data.SqlDbType.NVarChar, 255);
param9.Direction = System.Data.ParameterDirection.O
param9.Value = DBNull.V
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.I
string str = db.LastC
using System.Collections.G
using System.L
using System.T
using System.IO;
using System.Runtime.Serialization.J
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);
阅读(...) 评论()}

我要回帖

更多关于 靳怎么读 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信