PostgreSQL的.NET驱动程序Npgsql

2019-11-26 15:01 来源:未知

当前有两种主要的PostgreSQL的.NET驱动程序,分别是Npgsql和dotConnector for PostgreSQL(以下简单的称呼dotConnector卡塔尔,那三头都以第三方的.NET Provider,本文将大意讲授一下那七个驱动程序的装置格局,并主讲怎样利用它们创设PDF.NET的驱动程序,使得PDF.NET数据开辟框架可以支撑访谈PostgreSQL数据库。

Npgsql是PostgreSQL的一个.NET数据提供程序,它可以随意获取。它能够因此下列选项得到独立的下载,也足以安装PostgreSQL数据库程序时精选设置。 最新的_npgsql2 Npgsql2.0.13.91 已经修复二个重中之重bug:Replace Mono SslClientStream with .NET SslStream to fix SSL-related errors,何况还移除对Mono.Security的信任性。

生机勃勃、安装PostgreSQL的.NET驱动程序

Npgsql2 has initial Entity Framework 6 support

1,Npgsql的安装:

 

PostgreSQL数据库程序能够去官网  下载,在写本篇作品的时候,最新版本已然是9.1了,小编下载应用的是9.0.4. 下载安装以往,张开程序 Application Stack Builder,选用已经设置好的数据库以往,单击下一步步入到如下分界面 图片 1

PostgreSQL的PDF.NET驱动程序塑造进程

在Datase Drivers选项中,这里接受Npgsql v2.0.11-1,此外驱动程序遵照需求设置。选择好现在,遵照提醒一步步就能够完整安装好.NET的多少驱动程序。

C#连接Postgre SQL

 

PostgreSQL 8.0.2 应用告诉

2,dotConnect For PostgreSQL 安装

Npgsql是PostgreSQL的三个.NET数量提供程序

在网络查找一下以此驱动程序,我是从下边包车型大巴地方安装的:

Npgsql - .Net Data Provider for Postgresql

Backup/Restore PostgreSQL databases

安装文件名是 dcpostgresqlfree.exe,版本是 5.30.160,安装的时候会筛选是还是不是将次第集编写翻译到GAC中。安装完结之后在设置目录会有多少个简单的身先士卒程序实施方案:

 

图片 2

咱们能够展开示例程序建设方案看看,都很简单,具体如何利用可以看本篇作品的底下部分。

 

二、营造PDF.NET For PostgreSQL驱动程序

 

听别人说下边包车型地铁步骤,安装了.NET的PostgreSQL驱动程序以后,就足以间接依照示例来做客PostgreSQL数据库了,但那三种差异的驱动程序让咱们难以抉择接受哪黄金年代种,何况它们平昔提供的ADO.NET实现用起来亦不是可怜便利,大家有须要将它们包装一下,简化使用情势。PDF.NET数据开辟框架内置了MS DAAB相同的AdoHelper数据访问抽象类,所以假诺继续该类就能够具有PDF.NET强盛的数量访问技术。

1,包装Ngpsql驱动程序

下边以Npgsql为例,看看哪些让PDF.NET帮衬PostgreSQL。上边是贴出全部代码:

 

using System;
using System.Collections.Generic;
//using System.Linq;
using System.Text;
using System.Data;
using Npgsql ;

namespace PWMIS.DataProvider.Data
{
    /// <summary>
    /// PostgreSQL数据访问类
    /// </summary>
    public class PostgreSQL : AdoHelper
    {
        /// <summary>
        /// 暗中认可构造函数
        /// </summary>
        public PostgreSQL()
        {
            //
            // TODO: 在这里地加多构造函数逻辑
            //
        }
        /// <summary>
        /// 获取当前数据库类型的枚举
        /// </summary>
        public override PWMIS.Common.DBMSType CurrentDBMSType
        {
            get { return PWMIS.Common.DBMSType.PostgreSQL ; } 
        }

        /// <summary>
        /// 创造而且张开数据库连接
        /// </summary>
        /// <returns>数据库连接</returns>
        protected override IDbConnection GetConnection()
        {
            IDbConnection conn = base.GetConnection();
            if (conn == null)
            {
                conn = new NpgsqlConnection (base.ConnectionString);
                //conn.Open ();
            }
            return conn;
        }

        /// <summary>
        /// 获取数据适配器实例
        /// </summary>
        /// <returns>数据适配器</returns>
        protected override IDbDataAdapter GetDataAdapter(IDbCommand command)
        {
            IDbDataAdapter ada = new NpgsqlDataAdapter((NpgsqlCommand)command);
            return ada;
        }

        /// <summary>
        /// 获取八个新参数对象
        /// </summary>
        /// <returns>特定于数据源的参数对象</returns>
        public override IDataParameter GetParameter()
        {
            return new NpgsqlParameter();
        }

        /// <summary>
        ///  获取八个新参数对象
        /// </summary>
        /// <param name="paraName">参数名</param>
        /// <param name="dbType">参数数据类型</param>
        /// <param name="size">参数大小</param>
        /// <returns>特定于数据源的参数对象</returns>
        public override IDataParameter GetParameter(string paraName, System.Data.DbType dbType, int size)
        {
            NpgsqlParameter para = new NpgsqlParameter();
            para.ParameterName = paraName;
            para.DbType = dbType;
            para.Size = size;
            return para;
        }

        /// <summary>
        /// 重回此 NpgsqlConnection 的数据源的架构新闻。
        /// </summary>
        /// <param name="collectionName">群集名称</param>
        /// <param name="restrictionValues">央求的架构的生机勃勃组约束值</param>
        /// <returns>数据库架构音讯表</returns>
        public override DataTable GetSchema(string collectionName, string[] restrictionValues)
        {
            using (NpgsqlConnection conn = (NpgsqlConnection)this.GetConnection())
            {
                conn.Open();
                if (restrictionValues == null && string.IsNullOrEmpty(collectionName))
                    return conn.GetSchema();
                else if (restrictionValues == null && !string.IsNullOrEmpty(collectionName))
                {
                    if (collectionName == "Procedures")
                        return this.getProcedures();
                    else
                        return conn.GetSchema(collectionName); //Procedures

                }
                else
                { 
                    if (collectionName == "ProcedureParameters")
                        return getFunctionArgsInfo(restrictionValues[2]);
                    else
                        return conn.GetSchema(collectionName, restrictionValues);
                }
            }
        }

        /// <summary>
        /// 预管理SQL语句,语句中不可能富含"`"(反引号,tab键上面包车型地铁充裕暗记)号,如若需求,请使用参数化查询。
        /// </summary>
        /// <param name="SQL"></param>
        /// <returns></returns>
        protected override string PrepareSQL(ref string SQL)
        {
            return SQL.Replace("[", """).Replace("]", """);
        }

        /// <summary>
        /// 获取恐怕设置自增列对应的种类名称
        /// </summary>
        public override string InsertKey
        {
            get
            {
                return string.Format("select currval('"{0}"')",base.InsertKey );
            }
            set
            {
                base.InsertKey = value;
            }
        }

        /// <summary>
        /// 定义获取PostgreSQL的函数参数的函数
        /// <seealso cref=";
        /// </summary>
        private void createFunctionArgsInfo()
        {
            //由于函数定义语句较长,放到了财富文件中
            string sql = PWMIS.PostgreSQLClient.Properties.Resources.sql_function_args;
            this.SqlServerCompatible = false;
            this.ExecuteNonQuery(sql);
        }

        /// <summary>
        /// 获取函数的参数新闻
        /// </summary>
        /// <param name="functionName">函数名</param>
        /// <returns></returns>
        private DataTable  getFunctionArgsInfo(string functionName)
        {
            string sql = string.Format("select * from function_args('{0}','public');", functionName);
            DataSet ds = null;
            try
            {
                ds= this.ExecuteDataSet(sql);
            }
            catch
            {
                createFunctionArgsInfo();
                ds = this.ExecuteDataSet(sql);
            }
           
            DataTable dt = ds.Tables[0];
            dt.Columns["pos"].ColumnName = "ordinal_position";
            dt.Columns["argname"].ColumnName = "PARAMETER_NAME";
            dt.Columns["datatype"].ColumnName = "DATA_TYPE";
            dt.Columns["direction"].ColumnName = "PARAMETER_MODE";
            dt.Columns.Add("IS_RESULT", typeof(string));
            dt.Columns.Add("CHARACTER_MAXIMUM_LENGTH", typeof(int));

            foreach (DataRow row in dt.Rows)
            {
                if(row["PARAMETER_NAME"] == DBNull.Value)  row["PARAMETER_NAME"] =  ""; 
                row["IS_RESULT"] = row["PARAMETER_NAME"].ToString() == "RETURN VALUE" ? "YES" : "NO";
                row["PARAMETER_MODE"] = row["PARAMETER_MODE"].ToString() == "o" ? "OUT" : row["PARAMETER_MODE"].ToString() == "i" ? "IN" : row["PARAMETER_MODE"];
            }
            return dt;
        }

        private DataTable getProcedures()
        {
            string sql = @"SELECT routine_name
  FROM information_schema.routines
 WHERE specific_schema NOT IN
       ('pg_catalog', 'information_schema')
   AND type_udt_name != 'trigger';";
            return this.ExecuteDataSet(sql).Tables[0];
        }
    }
}

 

 注意下面程序中的 PrepareSQL 方法,它将SQLSE奥迪Q5VEEvoque格式的SQL语句调换成PostgreSQL支持的格式,SQLSE凯雷德VEEvoque使用成没有错中括号来约束对象名,而PostgreSQL使用双引号,特别在对象名称使用了尺寸写混合的意况。其它程序为了援助获取数据库的框架结构新闻,重写了AdoHelper的虚幻方法GetSchema,有关PostgreSQL具体获取表架构音讯的原委,请参见 。

 

2,包装dotConnect驱动程序

程序代码与使用Npgsql相像,区别主假使将上面代码中的Npgsql字样替换来PgSql就可以,援引Devart.Data.dll,Devart.Data.PostgreSql.dll,使用下边包车型客车称号空间:

 

using Devart.Data.PostgreSql;

 

鉴于dotConnect的驱动程序接收Oracle驱动程序的品格,供给SQL语句的参数使用“:”作为参数名称,并非SqlServer样式的“@”,所以下边包车型地铁方法供给重写:

 

        /// <summary>
        /// 预管理SQL语句,语句中不可能包罗中括号,倘若急需,请使用参数化查询。
        /// </summary>
        /// <param name="SQL"></param>
        /// <returns></returns>
        protected override string PrepareSQL(ref string SQL)
        {
            return SQL.Replace("[", """).Replace("]", """).Replace("@",":");
        }

        public override string GetParameterChar
        {
            get
            {
                return ":";
            }
        }

到此停止,使用dotConnect做PDF.NET的PostgreSQL驱动程序也压实了。

 

三、使用PDF.NET For PostgreSQL驱动程序

1,使用安顿

比如下面运用Npgsql和dotConnect驱动的次序分别是 PWMIS.PostgreSQLClient 程序集中的次第,名称分别是

PWMIS.DataProvider.Data.PostgreSQL

PWMIS.DataProvider.Data.dotConnectPostgreSQL

那么大家在应用程序配置文件之中如下使用就能够:

使用Npgsql访问:

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

 

使用dotConnect访问:

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

 

2,推行功效分裂

应用那五个例外的提供程序数据访问效能有怎样分别呢?经过测试,它们中间唯有微小的差别,Npgsql略微胜出,下边是测量检验程序建构进程:

 

首先在SqlMap.config文本中国建工业总会公司立三个PostgreSQL的多少访谈脚本:

 

<Select CommandName="GetFundFeat" Method="" CommandType="Text" Description="获取业绩" ResultClass="DataSet">

<![CDATA[SELECT * FROM GetFundTrend_FundAnalysis_FundFeat (#currentJJDM:String#,#OtherJJDM:String#)]]>

</Select>

接下来利用购并开辟工具的代码生成器生成三个类中上边包车型大巴艺术:

 

public DataSet GetFundFeat(String currentJJDM  , String OtherJJDM   ) 
    { 
            //获取命令新闻
            CommandInfo cmdInfo=Mapper.GetCommandInfo("GetFundFeat");
            //参数赋值,推荐应用该种方式;
            cmdInfo.DataParameters[0].Value = currentJJDM;
            cmdInfo.DataParameters[1].Value = OtherJJDM;
            //参数赋值,使用命名情势;
            //cmdInfo.SetParameterValue("@currentJJDM", currentJJDM);
            //cmdInfo.SetParameterValue("@OtherJJDM", OtherJJDM);
            //实施查询
            return CurrentDataBase.ExecuteDataSet(CurrentDataBase.ConnectionString, cmdInfo.CommandType, cmdInfo.CommandText , cmdInfo.DataParameters);
        //
    }//End Function

 

最终以分化的Pgsql驱动程序运路程序,查看实践的SQL日志:

使用dotConnect访问:

 

//二零一三/5/30 16:52:44 @AdoHelper 实践命令:
SQL="SELECT * FROM GetFundTrend_FundAnalysis_FundFeat (:currentJJDM,:OtherJJDM)"
//命令类型:Text
//2个指令参数:
Parameter["currentJJDM"]    =    "KF0355"              //DbType=AnsiString
Parameter["OtherJJDM"]    =    "000001,399001,H11020,000300"              //DbType=AnsiString
//2011/5/30 16:52:44 @AdoHelper :Execueted Time(ms):448

 

使用Npgsql访问:

 

//二零一二/5/30 16:58:17 @AdoHelper 奉行命令:
SQL="SELECT * FROM GetFundTrend_FundAnalysis_FundFeat (@currentJJDM,@OtherJJDM)"
//命令类型:Text
//2个指令参数:
Parameter["@currentJJDM"]    =    "KF0180"              //DbType=String
Parameter["@OtherJJDM"]    =    "000001,399001,H11020,000300"              //DbType=String
//2011/5/30 16:58:17 @AdoHelper :Execueted Time(ms):405

 

 

至于PDF.NET数据开垦框架的详细新闻,请看官方网站证实:

 

 

 

 

 

 

TAG标签:
版权声明:本文由32450新蒲京网站发布于葡萄游戏厅_体育游戏,转载请注明出处:PostgreSQL的.NET驱动程序Npgsql