PDF.NET数据开发框架实体类操作实例(for PostgreSQL,并且解决自增问题)
PDF.NET數(shù)據(jù)開發(fā)框架實(shí)體類操作實(shí)例(MySQL)
的姊妹篇,兩者使用了同一個(gè)測(cè)試程序,不同的只是使用的類庫(kù)和數(shù)據(jù)庫(kù)不同,下面說(shuō)說(shuō)具體的使用過(guò)程。
1,首先在App.config文件中配置數(shù)據(jù)庫(kù)連接字符串:
<?xml version="1.0" encoding="utf-8" ?> <configuration><connectionStrings><!--<add name ="default" connectionString ="server=192.168.50.XX;User Id=root;password=XXXX;database=test" providerName="PWMIS.DataProvider.Data.MySQL,PWMIS.MySqlClient"/>--><add name ="default" connectionString ="server=127.0.0.1;User Id=postgres;password=XXXX;database=Test" providerName="PWMIS.DataProvider.Data.PostgreSQL,PWMIS.PostgreSQLClient"/></connectionStrings> </configuration>2,定義一個(gè)用戶實(shí)體類:
/*?*?PDF.NET?數(shù)據(jù)開發(fā)框架
?*?http://www.pwmis.com/sqlmap
?*/
using?System;
using?System.Collections.Generic;
using?System.Linq;
using?System.Text;
using?PWMIS.DataMap.Entity;
namespace?TestMySqlEntity
{
????class?User:EntityBase?
????{
????????public?User()
????????{
????????????TableName?=?"tb_user";
????????????PrimaryKeys.Add("ID");//主鍵
????????????IdentityName?=?"ID";//標(biāo)識(shí),自增
????????????PropertyNames?=?new?string[]?{"ID","Name","Age"?};
????????????PropertyValues?=?new?object[PropertyNames.Length];
????????}
????????public?int?ID
????????{
????????????get?{?return?getProperty<int>("ID");?}
????????????set?{?setProperty("ID",?value);?}
????????}
????????public?int?Age
????????{
????????????get?{?return?getProperty<int>("Age");?}
????????????set?{?setProperty("Age",?value);?}
????????}
????????public?string?Name
????????{
????????????get?{?return?getProperty<string>("Name");?}
????????????set?{?setProperty("Name",?value,50);?}
????????}
????}
}
與MySQL中定義的用戶實(shí)體類不同,下面這一行代碼被注釋掉了:
?//IdentityName = "ID";//標(biāo)識(shí),自增
雖然PostgreSQL有“自增”列,但無(wú)法直接取到剛插入的這個(gè)自增值,所以需要注釋它。
注:在PDF.NET SOD框架 5.6.0.1121 之后,框架取消了這一個(gè)限制,你仍然可以像在其它數(shù)據(jù)庫(kù)中那樣使用PostgreSQL的自增列,實(shí)體類無(wú)需做任何更改。
3,根據(jù)這個(gè)實(shí)體類,我們?nèi)ostgreSQL定義一個(gè)用戶表:tb_user,具體過(guò)程省略,注意字段“ID”仍然使用自增列(在PostgreSQL中是 serial 類型,但編輯表類型的時(shí)候,發(fā)現(xiàn)字段是整數(shù)類型,不過(guò)有了默認(rèn)值:nextval('"User_ID_seq"'::regclass))。
再定義一個(gè)存儲(chǔ)過(guò)程查詢指定條件的用戶記錄:
?
CREATE?OR?REPLACE?FUNCTION?"fn_queryUser2"("Age"?integer)??RETURNS?SETOF?tb_user?AS
'select?*?from?tb_user?where?"Age">$1'
??LANGUAGE?sql?VOLATILE
??COST?100
??ROWS?1000;
ALTER?FUNCTION?"fn_queryUser2"(integer)?OWNER?TO?postgres;
?
?
4,編寫ORM實(shí)體類操作的測(cè)試代碼:
using?System;using?System.Collections.Generic;
using?System.Linq;
using?System.Text;
using?PWMIS.DataMap.Entity;
using?System.Data;
namespace?TestMySqlEntity
{
????class?Program
????{
????????static?void?Main(string[]?args)
????????{
????????????PWMIS.DataProvider.Data.AdoHelper?db?=?PWMIS.DataProvider.Adapter.MyDB.GetDBHelperByConnectionName("default");
????????????//PWMIS.DataProvider.Data.AdoHelper?db?=?PWMIS.DataProvider.Adapter.MyDB.Instance?;
????????????//MySQL?存儲(chǔ)過(guò)程測(cè)試;
????????????//參數(shù)名字可以加?@符號(hào),例如?@pAge1
????????????//DataSet?ds1?=?db.ExecuteDataSet("proc_user1",
????????????//????CommandType.StoredProcedure,
????????????//????new?System.Data.IDataParameter[]?{?db.GetParameter("@pAge1",?18)?});
????????????//PostgreSQL?的存儲(chǔ)過(guò)程只管參數(shù)順序,不管參數(shù)名,如果存儲(chǔ)過(guò)程名稱有大寫字母,需要使用雙引號(hào)
????????????//fn_queryUser2?定義的參數(shù)名字是?Age
????????????DataSet?ds1?=?db.ExecuteDataSet("[fn_queryUser2]",
??????????????CommandType.StoredProcedure,
??????????????new?System.Data.IDataParameter[]?{?db.GetParameter("@pAge1",?18)?});
????????????
????????????//
????????????User?u?=?new?User();
????????????//*************構(gòu)建?OQL?查詢表達(dá)式?*******?begin?************
????????????//查詢實(shí)體集合
????????????//使用?OQLCompare?對(duì)象作為條件
????????????//OQL?q?=?OQL.From(u).Select().Where(new?OQLCompare(u).Comparer(u.Age,?OQLCompare.CompareType.NoSmaller,?15)).END?;
????????????OQL?q?=?new?OQL(u);
????????????//使用OQL2?作為條件對(duì)象
????????????q.Select().Where(q.Condition.AND(u.Age,?">=",?15)).OrderBy?(u.Age?,"asc");
????????????//使用?QueryParameter?數(shù)組作為條件,適合于多個(gè)并列的And條件
????????????//q.Select().Where(new?QueryParameter[]?{?new?QueryParameter("Age",?PWMIS.Common.enumCompare.NoSmaller,?15)?}).OrderBy(u.Age,?"asc");?
????????????Console.WriteLine("--OQL?to?SQL:\r\n"+q.ToString?());
????????????
????????????//*************構(gòu)建?OQL?查詢表達(dá)式?*******?end?************
????????????//查詢實(shí)體列表
????????????var?result?=?EntityQuery<User>.QueryList(q);
????????????Console.WriteLine("--查詢實(shí)體集合成功,數(shù)量:"+result?.Count?);
????????????Console.WriteLine("\r\n--Executed?SQL?Text:\r\n{0}\r\n",?PWMIS.DataProvider.Data.CommandLog.Instance.CommandText);
????????????//查詢單個(gè)實(shí)體
????????????u.Name?=?"zhang?san";
????????????q.Select().Where(u.Name);
????????????Console.WriteLine("--OQL?to?SQL:\r\n"?+?q.ToString());
????????????User?u1?=?EntityQuery<User>.QueryObject(q);
????????????if?(u1?!=?null)
????????????????Console.WriteLine("--查詢單個(gè)實(shí)體成功!");
????????????Console.WriteLine("\r\n--Executed?SQL?Text:\r\n{0}\r\n",?PWMIS.DataProvider.Data.CommandLog.Instance.CommandText);
????????????//直接使用EntityQuery<T>.Instance?屬性的插入、修改、刪除方法
????????????u.Name?=?"li?si5";
????????????u.Age?=?28;
????????????//PostgreSQL?沒(méi)有?@@IDENTITY?變量,所以無(wú)法拿到剛才的自增值
????????????//但可以使用?select?currval('User_ID_seq');
????????????//所以必須設(shè)置當(dāng)前實(shí)體對(duì)應(yīng)的表的自增字段序列名稱
????????????//db.InsertKey?=?"User_ID_seq"; ??????????? // Ver?5.6.0.1121 之后,框架取消了這一個(gè)限制
????????????if?(EntityQuery<User>.Instance.Insert(u,db)?>?0)
????????????????Console.WriteLine("--插入實(shí)體成功!");?//將自動(dòng)為ID屬性賦值
????????????Console.WriteLine("\r\n--Executed?SQL?Text:\r\n{0}\r\n",?PWMIS.DataProvider.Data.CommandLog.Instance.CommandText);
????????????
????????????u.Age?=?29;
????????????if?(EntityQuery<User>.Instance.Update(u,db)?>?0)
????????????????Console.WriteLine("修改實(shí)體成功!");
????????????Console.WriteLine("\r\nExecuted?SQL?Text:\r\n{0}\r\n",?PWMIS.DataProvider.Data.CommandLog.Instance.CommandText);
????????????User?u2?=?new?User();
????????????u2.Name?=?"wang?wu";
????????????u2.Age?=?20;
????????????//使用EntityQuery<T>?的實(shí)例對(duì)象方法更新實(shí)體
????????????//只會(huì)更新賦值過(guò)的屬性值
????????????EntityQuery<User>?eq?=?new?EntityQuery<User>(u2);
????????????eq.DefaultDataBase?=?db;//必須設(shè)置當(dāng)前數(shù)據(jù)庫(kù)訪問(wèn)對(duì)象
????????????if?(eq.SaveAllChanges()?>?0)
????????????????Console.WriteLine("--更新實(shí)體成功!");
????????????Console.WriteLine("\r\n--Executed?SQL?Text:\r\n{0}\r\n",?PWMIS.DataProvider.Data.CommandLog.Instance.CommandText);
????????????Console.Read();
????????}
????}
} 注意上面代碼中的這一部分:
//PostgreSQL?沒(méi)有?@@IDENTITY?變量,所以無(wú)法拿到剛才的自增值
????????????//但可以使用?select?currval('User_ID_seq');
????????????//所以必須設(shè)置當(dāng)前實(shí)體對(duì)應(yīng)的表的自增字段序列名稱
????????????db.InsertKey?=?"User_ID_seq";
在PostgreSQL中,不同的表需要設(shè)置不同的 InsertKey?,而在SQLSERVER等數(shù)據(jù)庫(kù)中,始終采用 InsertKey=“select?@@IDENTITY?”;
注:在PDF.NET SOD框架 5.6.0.1121 之后,框架取消了這一個(gè)限制。不過(guò)原理上跟以前是一樣的,只不過(guò)框架自動(dòng)處理了這個(gè)問(wèn)題,前提是你必須使用SOD自帶的處理自增的方式,自動(dòng)創(chuàng)建表。
?
5,編譯運(yùn)行,得到下面的結(jié)果:
?
--OQL?to?SQL:SELECT?[ID],[Name],[Age]
?FROM?[tb_user]
???Where??[Age]?>=?@Age0
????????Order?by?[Age]?asc
--查詢實(shí)體集合成功,數(shù)量:18
--Executed?SQL?Text:
SELECT?"ID","Name","Age"
?FROM?"tb_user"
???Where??"Age"?>=?@Age0
????????Order?by?"Age"?asc
--OQL?to?SQL:
SELECT?[ID],[Name],[Age]
?FROM?[tb_user]
???Where?[Name]=@Name
--查詢單個(gè)實(shí)體成功!
--Executed?SQL?Text:
SELECT?"ID","Name","Age"
?FROM?"tb_user"
???Where?"Name"=@Name
--插入實(shí)體成功!
--Executed?SQL?Text:
INSERT?INTO?"tb_user"("Name","Age")?VALUES?(@P0,@P1)
修改實(shí)體成功!
Executed?SQL?Text:
UPDATE?"tb_user"?SET?"Age"=@P0?WHERE?"ID"=@P1
--更新實(shí)體成功!
--Executed?SQL?Text:
INSERT?INTO?"tb_user"("Name","Age")?VALUES?(@P0,@P1)
?
?
注意:在PostgreSQL中,SQL語(yǔ)句中的字段名要使用雙引號(hào),PDF.NET數(shù)據(jù)開發(fā)框架為你自動(dòng)完成這一切,使得你的SQL語(yǔ)句能夠很容易的移植到PostgreSQL。
最后,附帶一個(gè)PostgreSQL中使用觸發(fā)器模擬自增與不使用自增,還有跟MySQL自增下,CRUD數(shù)據(jù)的一個(gè)效率對(duì)比測(cè)試數(shù)據(jù),測(cè)試程序請(qǐng)看源碼的 SampleOrmTest示例:
====**************** PDF.NET SOD ORM 控制臺(tái)測(cè)試程序 **************==== 框架核心程序集 PWMIS.Core Version:5.6.0.1111====應(yīng)用程序配置文件默認(rèn)的數(shù)據(jù)庫(kù)配置信息:=========================== -------測(cè)試1---使用觸發(fā)器做自增測(cè)試------------------------------當(dāng)前使用的數(shù)據(jù)庫(kù)類型是:PostgreSQL 連接字符串為:server=127.0.0.1;User Id=root;password=;DataBase=mydb 請(qǐng)確保數(shù)據(jù)庫(kù)服務(wù)器和數(shù)據(jù)庫(kù)是否有效(SqlServer,Access 會(huì)自動(dòng)創(chuàng)建數(shù)據(jù)庫(kù)), 繼續(xù)請(qǐng)回車,退出請(qǐng)輸入字母 Q . =====Power by Bluedoctor,2015.3.1 http://www.pwmis.com/sqlmap =======-------PDF.NET SOD ORM 測(cè)試 開始 --------- 測(cè)試:用戶zhang san 的密碼和注冊(cè)日期已經(jīng)更新 --刪除 1002條數(shù)據(jù)-- --插入 1001條數(shù)據(jù)-- --修改 3次數(shù)據(jù),User ID:1048-- SOD ORM的 6種 查詢方式,開始---- Login0:True Login1:True Login2:True Login3:True Login4:True Login5:True Login6:False 模糊查詢姓 張 的用戶,數(shù)量:10 -------PDF.NET SOD ORM 測(cè)試 全部結(jié)束----- 耗時(shí):(ms)1050-------測(cè)試2---不使用觸發(fā)器做自增測(cè)試------------------------------當(dāng)前使用的數(shù)據(jù)庫(kù)類型是:PostgreSQL 連接字符串為:server=127.0.0.1;User Id=root;password=;DataBase=mydb 請(qǐng)確保數(shù)據(jù)庫(kù)服務(wù)器和數(shù)據(jù)庫(kù)是否有效(SqlServer,Access 會(huì)自動(dòng)創(chuàng)建數(shù)據(jù)庫(kù)), 繼續(xù)請(qǐng)回車,退出請(qǐng)輸入字母 Q . =====Power by Bluedoctor,2015.3.1 http://www.pwmis.com/sqlmap =======-------PDF.NET SOD ORM 測(cè)試 開始 --------- 測(cè)試:用戶zhang san 的密碼和注冊(cè)日期已經(jīng)更新 --刪除 1001條數(shù)據(jù)-- --插入 1001條數(shù)據(jù)-- --修改 0次數(shù)據(jù),User ID:0-- SOD ORM的 6種 查詢方式,開始---- Login0:True Login1:True Login2:True Login3:True Login4:True Login5:True Login6:False 模糊查詢姓 張 的用戶,數(shù)量:10 -------PDF.NET SOD ORM 測(cè)試 全部結(jié)束----- 耗時(shí):(ms)779====================================================== -------測(cè)試3---MySQL對(duì)比測(cè)試(使用自增)------------------------------當(dāng)前使用的數(shù)據(jù)庫(kù)類型是:MySql 連接字符串為:server=127.0.0.1;User Id=root;password=;DataBase=test 請(qǐng)確保數(shù)據(jù)庫(kù)服務(wù)器和數(shù)據(jù)庫(kù)是否有效(SqlServer,Access 會(huì)自動(dòng)創(chuàng)建數(shù)據(jù)庫(kù)), 繼續(xù)請(qǐng)回車,退出請(qǐng)輸入字母 Q . =====Power by Bluedoctor,2015.3.1 http://www.pwmis.com/sqlmap =======-------PDF.NET SOD ORM 測(cè)試 開始 --------- 測(cè)試:用戶zhang san 的密碼和注冊(cè)日期已經(jīng)更新 --刪除 1002條數(shù)據(jù)-- --插入 1001條數(shù)據(jù)-- --修改 3次數(shù)據(jù),User ID:11103-- SOD ORM的 6種 查詢方式,開始---- Login0:True Login1:True Login2:True Login3:True Login4:True Login5:True Login6:False 模糊查詢姓 張 的用戶,數(shù)量:10 -------PDF.NET SOD ORM 測(cè)試 全部結(jié)束----- 耗時(shí):(ms)604?
?
?
? ? 本文轉(zhuǎn)自深藍(lán)醫(yī)生博客園博客,原文鏈接:http://www.cnblogs.com/bluedoctor/archive/2011/04/26/2029005.html,如需轉(zhuǎn)載請(qǐng)自行聯(lián)系原作者
總結(jié)
以上是生活随笔為你收集整理的PDF.NET数据开发框架实体类操作实例(for PostgreSQL,并且解决自增问题)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: LVS原理详解及部署之五:LVS+kee
- 下一篇: 洛谷——P2118 比例简化