PDF.NET数据开发框架实体类操作实例(for PostgreSQL,并且解决自增问题)
PDF.NET數據開發框架實體類操作實例(MySQL)
的姊妹篇,兩者使用了同一個測試程序,不同的只是使用的類庫和數據庫不同,下面說說具體的使用過程。
1,首先在App.config文件中配置數據庫連接字符串:
<?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,定義一個用戶實體類:
/*?*?PDF.NET?數據開發框架
?*?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";//標識,自增
????????????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中定義的用戶實體類不同,下面這一行代碼被注釋掉了:
?//IdentityName = "ID";//標識,自增
雖然PostgreSQL有“自增”列,但無法直接取到剛插入的這個自增值,所以需要注釋它。
注:在PDF.NET SOD框架 5.6.0.1121 之后,框架取消了這一個限制,你仍然可以像在其它數據庫中那樣使用PostgreSQL的自增列,實體類無需做任何更改。
3,根據這個實體類,我們去PostgreSQL定義一個用戶表:tb_user,具體過程省略,注意字段“ID”仍然使用自增列(在PostgreSQL中是 serial 類型,但編輯表類型的時候,發現字段是整數類型,不過有了默認值:nextval('"User_ID_seq"'::regclass))。
再定義一個存儲過程查詢指定條件的用戶記錄:
?
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實體類操作的測試代碼:
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?存儲過程測試;
????????????//參數名字可以加?@符號,例如?@pAge1
????????????//DataSet?ds1?=?db.ExecuteDataSet("proc_user1",
????????????//????CommandType.StoredProcedure,
????????????//????new?System.Data.IDataParameter[]?{?db.GetParameter("@pAge1",?18)?});
????????????//PostgreSQL?的存儲過程只管參數順序,不管參數名,如果存儲過程名稱有大寫字母,需要使用雙引號
????????????//fn_queryUser2?定義的參數名字是?Age
????????????DataSet?ds1?=?db.ExecuteDataSet("[fn_queryUser2]",
??????????????CommandType.StoredProcedure,
??????????????new?System.Data.IDataParameter[]?{?db.GetParameter("@pAge1",?18)?});
????????????
????????????//
????????????User?u?=?new?User();
????????????//*************構建?OQL?查詢表達式?*******?begin?************
????????????//查詢實體集合
????????????//使用?OQLCompare?對象作為條件
????????????//OQL?q?=?OQL.From(u).Select().Where(new?OQLCompare(u).Comparer(u.Age,?OQLCompare.CompareType.NoSmaller,?15)).END?;
????????????OQL?q?=?new?OQL(u);
????????????//使用OQL2?作為條件對象
????????????q.Select().Where(q.Condition.AND(u.Age,?">=",?15)).OrderBy?(u.Age?,"asc");
????????????//使用?QueryParameter?數組作為條件,適合于多個并列的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?());
????????????
????????????//*************構建?OQL?查詢表達式?*******?end?************
????????????//查詢實體列表
????????????var?result?=?EntityQuery<User>.QueryList(q);
????????????Console.WriteLine("--查詢實體集合成功,數量:"+result?.Count?);
????????????Console.WriteLine("\r\n--Executed?SQL?Text:\r\n{0}\r\n",?PWMIS.DataProvider.Data.CommandLog.Instance.CommandText);
????????????//查詢單個實體
????????????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("--查詢單個實體成功!");
????????????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?沒有?@@IDENTITY?變量,所以無法拿到剛才的自增值
????????????//但可以使用?select?currval('User_ID_seq');
????????????//所以必須設置當前實體對應的表的自增字段序列名稱
????????????//db.InsertKey?=?"User_ID_seq"; ??????????? // Ver?5.6.0.1121 之后,框架取消了這一個限制
????????????if?(EntityQuery<User>.Instance.Insert(u,db)?>?0)
????????????????Console.WriteLine("--插入實體成功!");?//將自動為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("修改實體成功!");
????????????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>?的實例對象方法更新實體
????????????//只會更新賦值過的屬性值
????????????EntityQuery<User>?eq?=?new?EntityQuery<User>(u2);
????????????eq.DefaultDataBase?=?db;//必須設置當前數據庫訪問對象
????????????if?(eq.SaveAllChanges()?>?0)
????????????????Console.WriteLine("--更新實體成功!");
????????????Console.WriteLine("\r\n--Executed?SQL?Text:\r\n{0}\r\n",?PWMIS.DataProvider.Data.CommandLog.Instance.CommandText);
????????????Console.Read();
????????}
????}
} 注意上面代碼中的這一部分:
//PostgreSQL?沒有?@@IDENTITY?變量,所以無法拿到剛才的自增值
????????????//但可以使用?select?currval('User_ID_seq');
????????????//所以必須設置當前實體對應的表的自增字段序列名稱
????????????db.InsertKey?=?"User_ID_seq";
在PostgreSQL中,不同的表需要設置不同的 InsertKey?,而在SQLSERVER等數據庫中,始終采用 InsertKey=“select?@@IDENTITY?”;
注:在PDF.NET SOD框架 5.6.0.1121 之后,框架取消了這一個限制。不過原理上跟以前是一樣的,只不過框架自動處理了這個問題,前提是你必須使用SOD自帶的處理自增的方式,自動創建表。
?
5,編譯運行,得到下面的結果:
?
--OQL?to?SQL:SELECT?[ID],[Name],[Age]
?FROM?[tb_user]
???Where??[Age]?>=?@Age0
????????Order?by?[Age]?asc
--查詢實體集合成功,數量: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
--查詢單個實體成功!
--Executed?SQL?Text:
SELECT?"ID","Name","Age"
?FROM?"tb_user"
???Where?"Name"=@Name
--插入實體成功!
--Executed?SQL?Text:
INSERT?INTO?"tb_user"("Name","Age")?VALUES?(@P0,@P1)
修改實體成功!
Executed?SQL?Text:
UPDATE?"tb_user"?SET?"Age"=@P0?WHERE?"ID"=@P1
--更新實體成功!
--Executed?SQL?Text:
INSERT?INTO?"tb_user"("Name","Age")?VALUES?(@P0,@P1)
?
?
注意:在PostgreSQL中,SQL語句中的字段名要使用雙引號,PDF.NET數據開發框架為你自動完成這一切,使得你的SQL語句能夠很容易的移植到PostgreSQL。
最后,附帶一個PostgreSQL中使用觸發器模擬自增與不使用自增,還有跟MySQL自增下,CRUD數據的一個效率對比測試數據,測試程序請看源碼的 SampleOrmTest示例:
====**************** PDF.NET SOD ORM 控制臺測試程序 **************==== 框架核心程序集 PWMIS.Core Version:5.6.0.1111====應用程序配置文件默認的數據庫配置信息:=========================== -------測試1---使用觸發器做自增測試------------------------------當前使用的數據庫類型是:PostgreSQL 連接字符串為:server=127.0.0.1;User Id=root;password=;DataBase=mydb 請確保數據庫服務器和數據庫是否有效(SqlServer,Access 會自動創建數據庫), 繼續請回車,退出請輸入字母 Q . =====Power by Bluedoctor,2015.3.1 http://www.pwmis.com/sqlmap =======-------PDF.NET SOD ORM 測試 開始 --------- 測試:用戶zhang san 的密碼和注冊日期已經更新 --刪除 1002條數據-- --插入 1001條數據-- --修改 3次數據,User ID:1048-- SOD ORM的 6種 查詢方式,開始---- Login0:True Login1:True Login2:True Login3:True Login4:True Login5:True Login6:False 模糊查詢姓 張 的用戶,數量:10 -------PDF.NET SOD ORM 測試 全部結束----- 耗時:(ms)1050-------測試2---不使用觸發器做自增測試------------------------------當前使用的數據庫類型是:PostgreSQL 連接字符串為:server=127.0.0.1;User Id=root;password=;DataBase=mydb 請確保數據庫服務器和數據庫是否有效(SqlServer,Access 會自動創建數據庫), 繼續請回車,退出請輸入字母 Q . =====Power by Bluedoctor,2015.3.1 http://www.pwmis.com/sqlmap =======-------PDF.NET SOD ORM 測試 開始 --------- 測試:用戶zhang san 的密碼和注冊日期已經更新 --刪除 1001條數據-- --插入 1001條數據-- --修改 0次數據,User ID:0-- SOD ORM的 6種 查詢方式,開始---- Login0:True Login1:True Login2:True Login3:True Login4:True Login5:True Login6:False 模糊查詢姓 張 的用戶,數量:10 -------PDF.NET SOD ORM 測試 全部結束----- 耗時:(ms)779====================================================== -------測試3---MySQL對比測試(使用自增)------------------------------當前使用的數據庫類型是:MySql 連接字符串為:server=127.0.0.1;User Id=root;password=;DataBase=test 請確保數據庫服務器和數據庫是否有效(SqlServer,Access 會自動創建數據庫), 繼續請回車,退出請輸入字母 Q . =====Power by Bluedoctor,2015.3.1 http://www.pwmis.com/sqlmap =======-------PDF.NET SOD ORM 測試 開始 --------- 測試:用戶zhang san 的密碼和注冊日期已經更新 --刪除 1002條數據-- --插入 1001條數據-- --修改 3次數據,User ID:11103-- SOD ORM的 6種 查詢方式,開始---- Login0:True Login1:True Login2:True Login3:True Login4:True Login5:True Login6:False 模糊查詢姓 張 的用戶,數量:10 -------PDF.NET SOD ORM 測試 全部結束----- 耗時:(ms)604?
?
?
? ? 本文轉自深藍醫生博客園博客,原文鏈接:http://www.cnblogs.com/bluedoctor/archive/2011/04/26/2029005.html,如需轉載請自行聯系原作者
總結
以上是生活随笔為你收集整理的PDF.NET数据开发框架实体类操作实例(for PostgreSQL,并且解决自增问题)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LVS原理详解及部署之五:LVS+kee
- 下一篇: asp.net ajax控件工具集 Au