自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

PostgreSQL的PDF.NET驅(qū)動程序構(gòu)建過程

數(shù)據(jù)庫 其他數(shù)據(jù)庫 PostgreSQL
目前有兩種主要的PostgreSQL的.NET驅(qū)動程序,分別是Npgsql和dotConnector for PostgreSQL(以下簡稱dotConnector),這兩者都是第三方的.NET Provider,本文將大致講解一下這兩個驅(qū)動程序的安裝方式,并講解如何利用它們構(gòu)建PDF.NET的驅(qū)動程序,使得PDF.NET數(shù)據(jù)開發(fā)框架可以支持訪問PostgreSQL數(shù)據(jù)庫。

目前有兩種主要的PostgreSQL的.NET驅(qū)動程序,分別是Npgsql和dotConnector for PostgreSQL(以下簡稱dotConnector),這兩者都是第三方的.NET Provider,本文將大致講解一下這兩個驅(qū)動程序的安裝方式,并講解如何利用它們構(gòu)建PDF.NET的驅(qū)動程序,使得PDF.NET數(shù)據(jù)開發(fā)框架可以支持訪問PostgreSQL數(shù)據(jù)庫。

一、安裝PostgreSQL的.NET驅(qū)動程序

1,Npgsql的安裝:

PostgreSQL數(shù)據(jù)庫程序可以去官網(wǎng)http://www.postgresql.org/下載,在寫本篇文章的時候,***版本已經(jīng)是9.1了,我下載使用的是9.0.4. 下載安裝以后,打開程序 Application Stack Builder,選擇已經(jīng)安裝好的數(shù)據(jù)庫以后,單擊下一步進(jìn)入到如下界面

 

在Datase Drivers選項中,這里選擇Npgsql v2.0.11-1,其它驅(qū)動程序根據(jù)需要安裝。選擇好以后,按照提示一步步即可完整安裝好.NET的數(shù)據(jù)驅(qū)動程序。

2,dotConnect For PostgreSQL 安裝

在網(wǎng)上搜索一下這個驅(qū)動程序,我是從下面的地址安裝的:http://wzmcc.newhua.com/soft/92182.htm安裝文件名是 dcpostgresqlfree.exe,版本是 5.30.160,安裝的時候會選擇是否將程序集編譯到GAC中。安裝完成以后在安裝目錄會有幾個簡單的示例程序解決方案:

 

大家可以打開示例程序解決方案看看,都很簡單,具體如何使用可以看本篇文章的下面部分。

#p#

二、構(gòu)建PDF.NET For PostgreSQL驅(qū)動程序

根據(jù)上面的步驟,安裝了.NET的PostgreSQL驅(qū)動程序以后,就可以直接按照示例來訪問PostgreSQL數(shù)據(jù)庫了,但這兩種不同的驅(qū)動程序讓我們難以選擇使用哪一種,而且它們直接提供的ADO.NET實現(xiàn)用起來也不是十分方便,我們有必要將它們包裝一下,簡化使用方式。PDF.NET數(shù)據(jù)開發(fā)框架內(nèi)置了MS DAAB類似的AdoHelper數(shù)據(jù)訪問抽象類,所以只要繼承該類就可以擁有PDF.NET強(qiáng)大的數(shù)據(jù)訪問能力。

1,包裝Ngpsql驅(qū)動程序

下面以Npgsql為例,看看如何讓PDF.NET支持PostgreSQL。下面是貼出全部代碼:

  1. using System;  
  2. using System.Collections.Generic;  
  3. //using System.Linq;  
  4. using System.Text;  
  5. using System.Data;  
  6. using Npgsql ;  
  7.  
  8. namespace PWMIS.DataProvider.Data  
  9. {  
  10.     /// <summary>  
  11.     /// PostgreSQL數(shù)據(jù)訪問類  
  12.     /// </summary>  
  13.     public class PostgreSQL : AdoHelper  
  14.     {  
  15.         /// <summary>  
  16.         /// 默認(rèn)構(gòu)造函數(shù)  
  17.         /// </summary>  
  18.         public PostgreSQL()  
  19.         {  
  20.             //  
  21.             // TODO: 在此處添加構(gòu)造函數(shù)邏輯  
  22.             //  
  23.         }  
  24.         /// <summary>  
  25.         /// 獲取當(dāng)前數(shù)據(jù)庫類型的枚舉  
  26.         /// </summary>  
  27.         public override PWMIS.Common.DBMSType CurrentDBMSType  
  28.         {  
  29.             get { return PWMIS.Common.DBMSType.PostgreSQL ; }   
  30.         }  
  31.  
  32.         /// <summary>  
  33.         /// 創(chuàng)建并且打開數(shù)據(jù)庫連接  
  34.         /// </summary>  
  35.         /// <returns>數(shù)據(jù)庫連接</returns>  
  36.         protected override IDbConnection GetConnection()  
  37.         {  
  38.             IDbConnection conn = base.GetConnection();  
  39.             if (conn == null)  
  40.             {  
  41.                 conn = new NpgsqlConnection (base.ConnectionString);  
  42.                 //conn.Open ();  
  43.             }  
  44.             return conn;  
  45.         }  
  46.  
  47.         /// <summary>  
  48.         /// 獲取數(shù)據(jù)適配器實例  
  49.         /// </summary>  
  50.         /// <returns>數(shù)據(jù)適配器</returns>  
  51.         protected override IDbDataAdapter GetDataAdapter(IDbCommand command)  
  52.         {  
  53.             IDbDataAdapter ada = new NpgsqlDataAdapter((NpgsqlCommand)command);  
  54.             return ada;  
  55.         }  
  56.  
  57.         /// <summary>  
  58.         /// 獲取一個新參數(shù)對象  
  59.         /// </summary>  
  60.         /// <returns>特定于數(shù)據(jù)源的參數(shù)對象</returns>  
  61.         public override IDataParameter GetParameter()  
  62.         {  
  63.             return new NpgsqlParameter();  
  64.         }  
  65.  
  66.         /// <summary>  
  67.         ///  獲取一個新參數(shù)對象  
  68.         /// </summary>  
  69.         /// <param name="paraName">參數(shù)名</param>  
  70.         /// <param name="dbType">參數(shù)數(shù)據(jù)類型</param>  
  71.         /// <param name="size">參數(shù)大小</param>  
  72.         /// <returns>特定于數(shù)據(jù)源的參數(shù)對象</returns>  
  73.         public override IDataParameter GetParameter(string paraName, System.Data.DbType dbType, int size)  
  74.         {  
  75.             NpgsqlParameter para = new NpgsqlParameter();  
  76.             para.ParameterName = paraName;  
  77.             para.DbType = dbType;  
  78.             para.Size = size;  
  79.             return para;  
  80.         }  
  81.  
  82.         /// <summary>  
  83.         /// 返回此 NpgsqlConnection 的數(shù)據(jù)源的架構(gòu)信息。  
  84.         /// </summary>  
  85.         /// <param name="collectionName">集合名稱</param>  
  86.         /// <param name="restrictionValues">請求的架構(gòu)的一組限制值</param>  
  87.         /// <returns>數(shù)據(jù)庫架構(gòu)信息表</returns>  
  88.         public override DataTable GetSchema(string collectionName, string[] restrictionValues)  
  89.         {  
  90.             using (NpgsqlConnection conn = (NpgsqlConnection)this.GetConnection())  
  91.             {  
  92.                 conn.Open();  
  93.                 if (restrictionValues == null && string.IsNullOrEmpty(collectionName))  
  94.                     return conn.GetSchema();  
  95.                 else if (restrictionValues == null && !string.IsNullOrEmpty(collectionName))  
  96.                 {  
  97.                     if (collectionName == "Procedures")  
  98.                         return this.getProcedures();  
  99.                     else 
  100.                         return conn.GetSchema(collectionName); //Procedures  
  101.  
  102.                 }  
  103.                 else 
  104.                 {   
  105.                     if (collectionName == "ProcedureParameters")  
  106.                         return getFunctionArgsInfo(restrictionValues[2]);  
  107.                     else 
  108.                         return conn.GetSchema(collectionName, restrictionValues);  
  109.                 }  
  110.             }  
  111.         }  
  112.  
  113.         /// <summary>  
  114.         /// 預(yù)處理SQL語句,語句中不能包含"`"(反引號,tab鍵上面的那個符號)號,如果需要,請使用參數(shù)化查詢。  
  115.         /// </summary>  
  116.         /// <param name="SQL"></param>  
  117.         /// <returns></returns>  
  118.         protected override string PrepareSQL(ref string SQL)  
  119.         {  
  120.             return SQL.Replace("[""\"").Replace("]""\"");  
  121.         }  
  122.  
  123.         /// <summary>  
  124.         /// 獲取或者設(shè)置自增列對應(yīng)的序列名稱  
  125.         /// </summary>  
  126.         public override string InsertKey  
  127.         {  
  128.             get 
  129.             {  
  130.                 return string.Format("select currval('\"{0}\"')",base.InsertKey );  
  131.             }  
  132.             set 
  133.             {  
  134.                 base.InsertKey = value;  
  135.             }  
  136.         }  
  137.  
  138.         /// <summary>  
  139.         /// 定義獲取PostgreSQL的函數(shù)參數(shù)的函數(shù)  
  140.         /// <seealso cref="http://www.alberton.info/postgresql_meta_info.html"/>  
  141.         /// </summary>  
  142.         private void createFunctionArgsInfo()  
  143.         {  
  144.             //由于函數(shù)定義語句較長,放到了資源文件中  
  145.             string sql = PWMIS.PostgreSQLClient.Properties.Resources.sql_function_args;  
  146.             this.SqlServerCompatible = false;  
  147.             this.ExecuteNonQuery(sql);  
  148.         }  
  149.  
  150.         /// <summary>  
  151.         /// 獲取函數(shù)的參數(shù)信息  
  152.         /// </summary>  
  153.         /// <param name="functionName">函數(shù)名</param>  
  154.         /// <returns></returns>  
  155.         private DataTable  getFunctionArgsInfo(string functionName)  
  156.         {  
  157.             string sql = string.Format("select * from function_args('{0}','public');", functionName);  
  158.             DataSet ds = null;  
  159.             try 
  160.             {  
  161.                 ds= this.ExecuteDataSet(sql);  
  162.             }  
  163.             catch 
  164.             {  
  165.                 createFunctionArgsInfo();  
  166.                 ds = this.ExecuteDataSet(sql);  
  167.             }  
  168.              
  169.             DataTable dt = ds.Tables[0];  
  170.             dt.Columns["pos"].ColumnName = "ordinal_position";  
  171.             dt.Columns["argname"].ColumnName = "PARAMETER_NAME";  
  172.             dt.Columns["datatype"].ColumnName = "DATA_TYPE";  
  173.             dt.Columns["direction"].ColumnName = "PARAMETER_MODE";  
  174.             dt.Columns.Add("IS_RESULT"typeof(string));  
  175.             dt.Columns.Add("CHARACTER_MAXIMUM_LENGTH"typeof(int));  
  176.  
  177.             foreach (DataRow row in dt.Rows)  
  178.             {  
  179.                 if(row["PARAMETER_NAME"] == DBNull.Value)  row["PARAMETER_NAME"] =  "";   
  180.                 row["IS_RESULT"] = row["PARAMETER_NAME"].ToString() == "RETURN VALUE" ? "YES" : "NO";  
  181.                 row["PARAMETER_MODE"] = row["PARAMETER_MODE"].ToString() == "o" ? "OUT" : row["PARAMETER_MODE"].ToString() == "i" ? "IN" : row["PARAMETER_MODE"];  
  182.             }  
  183.             return dt;  
  184.         }  
  185.  
  186.         private DataTable getProcedures()  
  187.         {  
  188.             string sql = @"SELECT routine_name  
  189.   FROM information_schema.routines  
  190.  WHERE specific_schema NOT IN  
  191.        ('pg_catalog''information_schema')  
  192.    AND type_udt_name != 'trigger';";  
  193.             return this.ExecuteDataSet(sql).Tables[0];  
  194.         }  
  195.     }  
  196. }  

注意上面程序中的 PrepareSQL 方法,它將SQLSERVER格式的SQL語句轉(zhuǎn)換成PostgreSQL支持的格式,SQLSERVER使用成對的中括號來限定對象名,而PostgreSQL使用雙引號,尤其在對象名稱使用了大小寫混合的情況。另外程序為了支持獲取數(shù)據(jù)庫的架構(gòu)信息,重寫了AdoHelper的抽象方法GetSchema,有關(guān)PostgreSQL具體獲取表架構(gòu)信息的內(nèi)容,請參看 http://www.alberton.info/postgresql_meta_info.html 。

#p#

2,包裝dotConnect驅(qū)動程序

程序代碼與使用Npgsql類似,區(qū)別主要是將上面代碼中的Npgsql字樣替換成PgSql即可,引用Devart.Data.dll,Devart.Data.PostgreSql.dll,使用下面的名稱空間:

  1. using Devart.Data.PostgreSql;  

由于dotConnect的驅(qū)動程序采用Oracle驅(qū)動程序的風(fēng)格,要求SQL語句的參數(shù)使用“:”作為參數(shù)名稱,而不是SqlServer樣式的“@”,所以下面的方法需要重寫:

  1. /// <summary>  
  2. /// 預(yù)處理SQL語句,語句中不能包含中括號,如果需要,請使用參數(shù)化查詢。  
  3. /// </summary>  
  4. /// <param name="SQL"></param>  
  5. /// <returns></returns>  
  6. protected override string PrepareSQL(ref string SQL)  
  7. {  
  8.     return SQL.Replace("[""\"").Replace("]""\"").Replace("@",":");  
  9. }  
  10.  
  11. public override string GetParameterChar  
  12. {  
  13.     get 
  14.     {  
  15.         return ":";  
  16.     }  

到此為止,使用dotConnect做PDF.NET的PostgreSQL驅(qū)動程序也做好了。

三、使用PDF.NET For PostgreSQL驅(qū)動程序

1,使用配置

假定上面使用Npgsql和dotConnect驅(qū)動的程序分別是 PWMIS.PostgreSQLClient 程序集中的程序,名稱分別是

PWMIS.DataProvider.Data.PostgreSQL

PWMIS.DataProvider.Data.dotConnectPostgreSQL

那么我們在應(yīng)用程序配置文件里面如下使用即可:

使用Npgsql訪問:

  1. <add name="ConnectionSetting" connectionString="server=192.168.XX.XX;User Id=postgres;password=XXXX;DataBase=XXDB" providerName="PWMIS.DataProvider.Data.PostgreSQL,PWMIS.PostgreSQLClient"/> 

使用dotConnect訪問:

  1. <add name="ConnectionSetting" connectionString="server=192.168.XX.XX;User Id=postgres;password=XXXX;DataBase=XXDB" providerName="PWMIS.DataProvider.Data.dotConnectPostgreSQL,PWMIS.PostgreSQLClient"/> 

#p#

2,執(zhí)行效率區(qū)別

使用這兩個不同的提供程序數(shù)據(jù)訪問效率有什么區(qū)別呢?經(jīng)過測試,它們之間僅有細(xì)微的差別,Npgsql略微勝出,下面是測試程序建立過程:

首先在SqlMap.config文件中建立一個PostgreSQL的數(shù)據(jù)訪問腳本:

  1. <Select CommandName="GetFundFeat" Method="" CommandType="Text" Description="獲取業(yè)績" ResultClass="DataSet"> 
  2. <![CDATA[SELECT * FROM GetFundTrend_FundAnalysis_FundFeat (#currentJJDM:String#,#OtherJJDM:String#)]]> 
  3. </Select> 

然后使用集成開發(fā)工具的代碼生成器生成一個類中下面的方法:

  1. public DataSet GetFundFeat(String currentJJDM  , String OtherJJDM   )   
  2.     {   
  3.             //獲取命令信息  
  4.             CommandInfo cmdInfo=Mapper.GetCommandInfo("GetFundFeat");  
  5.             //參數(shù)賦值,推薦使用該種方式;  
  6.             cmdInfo.DataParameters[0].Value = currentJJDM;  
  7.             cmdInfo.DataParameters[1].Value = OtherJJDM;  
  8.             //參數(shù)賦值,使用命名方式;  
  9.             //cmdInfo.SetParameterValue("@currentJJDM", currentJJDM);  
  10.             //cmdInfo.SetParameterValue("@OtherJJDM", OtherJJDM);  
  11.             //執(zhí)行查詢  
  12.             return CurrentDataBase.ExecuteDataSet(CurrentDataBase.ConnectionString, cmdInfo.CommandType, cmdInfo.CommandText , cmdInfo.DataParameters);  
  13.         //  
  14.     }//End Function  

***以不同的Pgsql驅(qū)動程序運行程序,查看執(zhí)行的SQL日志:

使用dotConnect訪問:

  1. //2011/5/30 16:52:44 @AdoHelper 執(zhí)行命令:  
  2. SQL="SELECT * FROM GetFundTrend_FundAnalysis_FundFeat (:currentJJDM,:OtherJJDM)" 
  3. //命令類型:Text  
  4. //2個命令參數(shù):  
  5. Parameter["currentJJDM"]    =    "KF0355"              //DbType=AnsiString  
  6. Parameter["OtherJJDM"]    =    "000001,399001,H11020,000300"              //DbType=AnsiString  
  7. //2011/5/30 16:52:44 @AdoHelper :Execueted Time(ms):448  

使用Npgsql訪問:

  1. //2011/5/30 16:58:17 @AdoHelper 執(zhí)行命令:  
  2. SQL="SELECT * FROM GetFundTrend_FundAnalysis_FundFeat (@currentJJDM,@OtherJJDM)" 
  3. //命令類型:Text  
  4. //2個命令參數(shù):  
  5. Parameter["@currentJJDM"]    =    "KF0180"              //DbType=String  
  6. Parameter["@OtherJJDM"]    =    "000001,399001,H11020,000300"              //DbType=String  
  7. //2011/5/30 16:58:17 @AdoHelper :Execueted Time(ms):405  

原文鏈接:http://www.cnblogs.com/bluedoctor/archive/2011/05/30/2063494.html

 

【編者推薦】

  1. .net訪問PostgreSQL數(shù)據(jù)庫發(fā)生“找不到函數(shù)名”的問題追蹤
  2. PostgreSQL的.NET驅(qū)動程序Npgsql中參數(shù)對象的一個Bug
  3. PDF.NET數(shù)據(jù)開發(fā)框架實體類操作實例之在PostgreSQL中操作
  4. PostgreSQL數(shù)據(jù)庫管理入門之psql工具篇
責(zé)任編輯:艾婧 來源: 博客園
相關(guān)推薦

2011-05-19 15:14:49

PostgreSQL

2011-04-26 15:26:38

PostgreSQL

2009-07-06 18:17:46

JDBC驅(qū)動程序

2011-01-06 16:29:08

linuxtasklet機(jī)制

2013-10-31 16:29:10

Linux內(nèi)核

2021-11-29 07:55:45

Linux GPIO Linux 系統(tǒng)

2010-01-07 13:27:22

Linux驅(qū)動程序

2009-08-12 18:20:39

C#事件驅(qū)動程序

2017-03-03 08:40:32

2011-01-10 18:21:38

linux編寫程序

2009-07-20 18:01:38

Oracle JDBC

2018-11-19 10:15:26

Windows 10WiFi驅(qū)動程序

2021-12-06 07:47:36

Linux 驅(qū)動程序Linux 系統(tǒng)

2022-03-08 09:25:52

數(shù)據(jù)庫系統(tǒng)MongoDB

2009-06-15 14:18:00

netbeans配置JDBC驅(qū)動程序

2009-09-04 10:10:33

Visual Basi

2019-10-22 15:40:34

Windows 10驅(qū)動程序Windows

2009-12-07 09:39:04

Linux設(shè)備驅(qū)動硬件通信

2010-02-25 16:09:15

Fedora驅(qū)動程序

2009-07-15 15:30:12

MyEclipse J
點贊
收藏

51CTO技術(shù)棧公眾號