日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

PDF.NET数据开发框架实体类操作实例(for PostgreSQL,并且解决自增问题)

發布時間:2025/3/21 asp.net 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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,并且解决自增问题)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。