PDF.NET SOD 開源框架紅包派送活動 && 新手快速入門指引

1、框架的由來  快速入門

有關框架的更多信息,請看框架官方主頁!

本套框架的思想是借鑑Java平臺的Hibernate 和 iBatis 而來,兼有ORM和SQL-MAP的特性,同時還參考了後來.NET的LINQ(本框架成型於2006年,當時還未據說過LINQ)使用風格,設計了OQL查詢表達式。本框架的設計思想是通用的,徹底能夠移植到Java 平臺,如今只提供了.NET平臺的實現,暫且將本框架命名爲html

PDF.NET

從2013.10.1日起,原PDF.NET 將改名爲程序員

SOD

one SQL-MAP,ORM,Data Control framework


原PDF.NET框架將成爲一個全功能的企業開發框架,而 SOD框架將是PDF.NET開發框架下面的 「數據開發框架"sql

PDF.NET

PDF.NET 開源歷史:數據庫

  1. 2010.2--PDF.NET3.0 會員發佈版
  2. 2010.5--PDF.NET3.5 會員發佈版
  3. 2011.3--PDF.NET4.0 會員發佈版
  4. 2011.9--PDF.NET Ver 3.0 開源版    節前送禮:PDF.NET(PWMIS數據開發框架)V3.0版開源    http://www.cnblogs.com/bluedoctor/archive/2011/09/29/2195751.html
  5. 2012.9--PDF.NET Ver 4.5 開源版 節前送禮:PDF.NET(PWMIS數據開發框架)V4.5版開源
  6. 2014.1--PDF.NET Ver 5.1 春節前最後一篇,CRUD碼農專用福利:PDF.NET之SOD Version 5.1.0 開源發佈(兼改名)
  7. 2015.2--PDF.NET SOD Ver5.1 一年之計在於春,2015開篇:PDF.NET SOD Ver 5.1徹底開源 

 

開源協議:編程

  • 框架類庫開源協議:採用LGPL協議,該協議容許商業使用,但僅限於包含類庫發佈,不得將源碼做爲商業行爲銷售分發,詳情請看該協議的官方說明。
  • 框架支持工具開源協議:採用GPL協議,不可用於商業銷售分發和修改,若是你想用於商業用途或者閉源使用,請單獨購買許可,詳情請看該協議官方說明。
  • 框架相關示例Demo開源協議:採用MIT協議,可自由修改使用,詳情請看該協議官方說明。

注:框架的支持工具指的是集成開發工具,能夠鏈接各類數據庫進行查詢,生成實體類,SQL-MAP DAL和 SqlMap.config 文件。安全

2、開源捐助帳號

右圖爲二維碼捐款方式多線程

感謝全部PDF.NET 框架的會員朋友熱心的捐助,併爲框架不斷完善和推廣做出的傑出貢獻!2015新春之際,送紅包給你們!app

hongbao

3、快速入門:

3.1,總覽

SOD框架分爲3大部分:框架

  1. SQL-MAP
  2. ORM
  3. Data Control

 

3.2,「SqlHelper」基礎

這三大部分,都是基於AdoHelper組件,它符合MS DAAB標準,因此熟悉SqlHelper的人應該很容易上手,下面舉例說明:ide

AdoHelper helper=new SqlServer();
DataSet ds=helper.ExecuteDataSet( 」Data Source=.;Initial Catalog=LocalDB;Integrated Security=True」,
      CommandType.Text,
      」SELECT * FROM Table_User」);

 

AdoHelper是一個抽象類,因此它能夠實例化成其餘數據庫訪問類,好比繼續下面的代碼:

helper=new Access(); //Access數據庫訪問類
DataSet dsAcc=helper.ExecuteDataSet( 」Provider=Microsoft.ACE.OLEDB.12.0;Jet OLEDB:Engine Type=6;Data Source=D:\Data\SuperMarket.accdb」,
        CommandType.Text,
        」SELECT * FROM Table_User」);

在 PWMIS.Core.dll SOD核心庫中,內置了SqlServer,SqlServerCe,Access,Oracle,OleDb,Odbc 等常見的數據庫訪問類提供程序。

在程序中每次都指定鏈接字符串和查詢命令類型,好處是「隨用隨取」,線程安全,隨時隨地「SqlHelper」,但很差之處就是代碼冗餘,因此能夠把數據訪問類類型和鏈接字符串放到應用程序配置文件中(App.config / Web.config ):

<connectionStrings>
    <add name="AccessDb"
  connectionString="Provider=Microsoft.ACE.OLEDB.12.0;Jet OLEDB:Engine Type=6;Data Source= |DataDirectory|SuperMarket.accdb"
  providerName="Access"/>
 </connectionStrings>

在上面的鏈接配置中, providerName="Access"    表示這將是用SOD框架的Access數據庫訪問提供程序,一樣道理,若是 providerName="SqlServer"  將使用SqlServer提供程序。

若是是SOD 核心程序以外的數據訪問提供程序,須要使用下面格式的鏈接配置:

<add name="default" 
  connectionString="server=10.0.0.1;User Id=pdfnet;password=pdfnet2015;CharSet=utf8;DataBase=test;Allow Zero Datetime=True" 
providerName="PWMIS.DataProvider.Data.MySQL,PWMIS.MySqlClient"/>

這個配置說明,鏈接名爲 default 的SOD數據訪問驅動程序 所在程序集 是 PWMIS.MySqlClient.dll ,提供程序全名稱是 PWMIS.DataProvider.Data.MySQL 。

注意:Web.config 文件中,鏈接字符串支持|DataDirectory| 路徑格式。

配置了數據庫鏈接信息以後,就能夠在程序中像下面這樣使用了:

using PWMIS.DataProvider.Adapter;//
AdoHelper accessDb1=MyDB.Instance;//應用程序配置文件鏈接配置節的最後一個數據鏈接配置
AdoHelper accessDb2=MyDB.GetDBHelperByConnectionName(「AccessDb」); //鏈接字符串名字
AdoHelper mySqlDb=MyDB.GetDBHelperByConnectionName(「default」); //鏈接字符串名字 
bool flag= accessDb.GetType() == typeof(Access); //flag=true;
bool flag2= mySqlDb.GetType() == typeof(PWMIS.DataProvider.Data.MySQL); //flag2=true;

注意示例中的 MyDB.Instance 對象,這是系統使用的默認數據訪問類,它始終讀取的是應用程序配置文件鏈接配置節的最後一個數據鏈接配置,這是一個靜態單利對象,請勿在事務中使用它,初此以外,在任何地方使用它都是能夠的,但仍然不建議你在多線程環境下使用 MyDB.Instance 這個AdoHelper的單例對象,推薦 accessDb2 的AdoHeper 實例化方式。

3.3,微型ORM

 

除此以外,AdoHelper 對象仍是一個「微型ORM」,請看下面的示例:

AdoHelper dbLocal = new SqlServer();
dbLocal.ConnectionString = "Data Source=.;Initial Catalog=LocalDB;Integrated Security=True";
var dataList = dbLocal.GetList(reader =>
{
    return new
   {
       UID=reader.GetInt32(0),
       Name=reader.GetString(1)
   };
}, "SELECT UID,Name FROM Table_User WHERE Sex={0} And Height>={1:5.2}",1, 1.60M);

上面將一條SQL語句的結果,直接映射到了一個匿名實體類上,注意還有格式化參數的功能。

若是不想接SQL結果映射到匿名類型上,而是一個結構根SQL結果類型相同的POCO類上,能夠這樣使用:

//假設UserPoco 對象跟 Table_User 表是映射的相同結構
AdoHelper dbLocal = new SqlServer();
dbLocal.ConnectionString = "Data Source=.;Initial Catalog=LocalDB;Integrated Security=True";
var list=dbLoal.QueryList<UserPoco>("SELECT UID,Name FROM Table_User WHERE Sex={0} And Height>={1:5.2}",1, 1.60M);

該功能能夠相似流行的Dapper 數據訪問組件,可使用SOD AdoHelper替代使用。

 

3.4,小結:

上面說明了PDF.NET SOD框架最基礎的數據訪問組件 AdoHelper 的使用,但這也是不少新手朋友不太清楚的地方,特別是 MyDB.Instance 單例對象容易濫用,必定要掌握。

SOD框架絕大部分狀況下,只須要進行上面的數據鏈接配置,便可順利運行代碼了,比起Entity Framework 的配置來,是否是簡單不少?

看到這裏,我想你應該入門了,下面就讓咱們簡要的瀏覽下SOD框架的一個大概。

----

4、SQL-MAP

你是否是曾經或者看到過別人作的項目,

  • 大量拼接SQL語句,或者SQL參數化查詢後拖沓呈長而又繁瑣的代碼,甚至SQL滿天飛?
  • 維護這樣的代碼是否是很是痛苦?
  • 天天寫這樣的CRUD代碼是否是感受有點浪費生命?

如今好了,你能夠將全部SQL語句集中寫到一個配置文件中,集中管理維護你的查詢程序,甚至,這個工做你能夠丟給DBA去作!

本功能相似於Java界著名的 iBatis 和移植到.Net的 MyBatis.Net ,可是,SQL-MAP去除了它們沉長的配置,而且使用工具自動生成代碼,使得編寫DAL 數據訪問層不須要寫一行代碼,請參考下面的文章:

《PDF.NET 之SQL-MAP 使用圖解教程》

更多的內容,你也能夠參考SOD框架官方博客的介紹:

(PDF.NET框架實例講解)將存儲過程映射爲實體類 深藍醫生 2011-08-18 17:25 閱讀:1748 評論:6

使用XSD編寫具備智能提示的XML文件(以SQL-MAP腳本爲實例) 深藍醫生 2011-05-13 12:17 閱讀:1609 評論:7

PDF.NET(PWMIS數據開發框架)之SQL-MAP目標和規範 深藍醫生 2011-05-07 00:05 閱讀:937 評論:1

抽象SQL查詢:SQL-MAP技術的使用 深藍醫生 2011-05-06 11:59 閱讀:3598 評論:21

使用OQL+SQLMAP解決ORM多表複雜的查詢問題 深藍醫生 2011-02-25 19:08 閱讀:928 評論:0

PDF.NET數據開發框架 之SQL-MAP使用存儲過程 深藍醫生 2010-07-03 23:31 閱讀:2386 評論:4

 

5、ORM

SOD框架發明了獨具特點的ORM查詢語言OQL,它基本覆蓋了SQL92標準的大部分功能,使得你在VS IDE 使用「對象化的SQL」。目前作到這個功能的除了Linq以外,沒有更多的ORM具備這個能力,可是對比EF框架的查詢語言Linq,OQL有本身的特點,它跟SQL更爲接近,對.NET框架的依賴很是小,這使得你有可能將OQL移植到Java ,C++ 這樣的面向對象的語言。

下面給出一個簡單的示例,有關該示例的詳細內容,請參考這篇博客文章《DataSet的靈活,實體類的方便,DTO的效率:SOD框架的數據容器,打造最適合DDD的ORM框架

SOD的實體類示例:

public class UserEntity:EntityBase, IUser
    {
        public UserEntity()
        {
            TableName = "Users";
            IdentityName = "User ID";
            PrimaryKeys.Add("User ID");
        }

        public int UserID
        {
            get { return getProperty<int>("User ID"); }
            set { setProperty("User ID", value); }
        }

        public string FirstName
        {
            get { return getProperty<string>("First Name"); }
            set { setProperty("First Name", value,20); }
        }

        public string LasttName
        {
            get { return getProperty<string>("Last Name"); }
            set { setProperty("Last Name", value,10); }
        }

        public int Age
        {
            get { return getProperty<int>("Age"); }
            set { setProperty("Age", value); }
        }
    }

這是一個簡單的用戶信息實體類,它繼承了一個接口 IUser  ,在App.config 中配置了數據鏈接後,就能夠像下面這樣使用了:

//註冊並從容器中建立實體類
EntityBuilder.RegisterType(typeof(IUser), typeof(UserEntity));
UserEntity user = EntityBuilder.CreateEntity<IUser>() as UserEntity;
//實體類做爲索引器使用
bool flag = (user["User ID"] == null);//true

//刪除測試數據
LocalDbContext context = new LocalDbContext();//自動建立表
OQL deleteQ = OQL.From(user)
    .Delete()
    .Where(cmp=>cmp.Comparer(user.UserID,">",0)) //爲了安全,不帶Where條件是不會所有刪除數據的
    .END;
context.UserQuery.ExecuteOql(deleteQ);
Console.WriteLine("插入3條測試數據");
//插入幾條測試數據
context.Add<UserEntity>(new UserEntity() {  FirstName ="zhang", LasttName="san" });
context.Add<IUser>(new UserDto() { FirstName = "li", LasttName = "si", Age = 21 });
context.Add<IUser>(new UserEntity() { FirstName = "wang", LasttName = "wu", Age = 22 });

//查找姓張的一個用戶
UserEntity uq = new UserEntity() { FirstName = "zhang" };
OQL q = OQL.From(uq)
   .Select(uq.UserID, uq.FirstName, uq.Age)
   .Where(uq.FirstName)
.END;

//下面的語句等效
//UserEntity user2 = EntityQuery<UserEntity>.QueryObject(q,context.CurrentDataBase);
UserEntity user2 = context.UserQuery.GetObject(q);

注意:該實例須要SOD框架最新版本的支持,你也可使用以前的方式,使用EntityQuery<T> 來操做實體類。

另外,SOD的ORM也支持根據接口之間建立實體類並查詢的功能,請看下面的示例:

 static void TestGOQL()
 {
     string sqlInfo="";
     //下面使用 ITable_User 或者 Table_User都可
      List<ITable_User> userList =
                OQL.FromObject<ITable_User>()
                //.Select() //選所有自斷
                .Select(s => new object[] { s.UID, s.Name, s.Sex }) //僅選取3個字段
                  .Where((cmp, user) => cmp.Property(user.UID) < 100)
                .OrderBy((o,user)=>o.Asc(user.UID))
                .Limit(5, 1) //限制5條記錄每頁,取第一頁
                .Print(out sqlInfo)
              .ToList();

            Console.WriteLine(sqlInfo);
            Console.WriteLine("User List item count:{0}",userList.Count);
        }

有關該功能的詳細內容介紹,請看博客文章《一行代碼調用實現帶字段選取+條件判斷+排序+分頁功能的加強ORM框架》。

6、Data Control

框架支持Windows Forms,WebForms 的窗體編程,擴展了一套數據控件,包括經常使用的 文本框、複選框、單選框、列表框、日曆控件、標籤控件等。這些控件所有遵循SOD的窗體數據接口,實現這個接口的控件將極大的簡化窗體應用程序的數據操做,有關內容詳細介紹,請看這篇博客文章:

不使用反射,「一行代碼」實現Web、WinForm窗體表單數據的填充、收集、清除,和到數據庫的CRUD

你也能夠在 pwmis.codeplex.com 下載源碼,找到下面地址對應的SimpleAccessWinForm

或者下載這個 Example PDF.Net_V4.6 WinForm 數據表單實例

 

或者看這個 Source Code WebTestTool

這2個示例應用程序,都演示了WinForm下如何使用Data Control 數據控件簡化CRUD窗體編程。

另外,若是你是WebForms 應用程序,開源項目的超市管理系統源碼 你能夠看看,

或者直接下載這個(版本較老)Source Code PDF.Net_V4.6_OpenSource (new)

 

結束語:

SOD不只僅是一個ORM,它還有SQL-MAP和DataControl,具體能夠看框架官網 http://www.pwmis.com/sqlmap ,9年曆史鑄就的成果,堅固可靠。

很是感謝你看到這裏,相信你初步瞭解了SOD框架的基本功能,若是您還有其它問題,歡迎你在項目的開源網站 pwmis.codeplex.com 的討論去發帖,或者去官方博客相關文章回帖也可。

 

最後,祝願全部.NET 程序員早日擺脫日復一日的CRUD功能,感謝你們對PDF.NET SOD框架一如既往的支持,

2015年新春之際,祝賀各位會員和其餘使用框架的朋友喜氣洋洋,閤家歡樂,萬事如意!

 

附註:若是你們尚未買到節日期間的火車票,推薦本框架開發做者自主開發的《12306無聲購票彈窗通知小工具》,工做搶票2不誤,綠色無毒安全放心!

 

深藍醫生

2015.2 月春節

相關文章
相關標籤/搜索