Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >PostgreSQL的PDF.NET驱动程序构建过程

PostgreSQL的PDF.NET驱动程序构建过程

作者头像
用户1177503
发布于 2018-02-26 10:24:53
发布于 2018-02-26 10:24:53
1.4K00
代码可运行
举报
文章被收录于专栏:程序员的SOD蜜程序员的SOD蜜
运行总次数:0
代码可运行

目前有两种主要的PostgreSQL的.NET驱动程序,分别是Npgsql和dotConnector for PostgreSQL(以下简称dotConnector),这两者都是第三方的.NET Provider,本文将大致讲解一下这两个驱动程序的安装方式,并讲解如何利用它们构建PDF.NET的驱动程序,使得PDF.NET数据开发框架可以支持访问PostgreSQL数据库

一、安装PostgreSQL的.NET驱动程序

1,Npgsql的安装:

PostgreSQL数据库程序可以去官网 http://www.postgresql.org/ 下载,在写本篇文章的时候,最新版本已经是9.1了,我下载使用的是9.0.4. 下载安装以后,打开程序 Application Stack Builder,选择已经安装好的数据库以后,单击下一步进入到如下界面 

在Datase Drivers选项中,这里选择Npgsql v2.0.11-1,其它驱动程序根据需要安装。选择好以后,按照提示一步步即可完整安装好.NET的数据驱动程序。

2,dotConnect For PostgreSQL 安装

在网上搜索一下这个驱动程序,我是从下面的地址安装的:

http://wzmcc.newhua.com/soft/92182.htm

安装文件名是 dcpostgresqlfree.exe,版本是 5.30.160,安装的时候会选择是否将程序集编译到GAC中。安装完成以后在安装目录会有几个简单的示例程序解决方案:

大家可以打开示例程序解决方案看看,都很简单,具体如何使用可以看本篇文章的下面部分。

二、构建PDF.NET For PostgreSQL驱动程序

根据上面的步骤,安装了.NET的PostgreSQL驱动程序以后,就可以直接按照示例来访问PostgreSQL数据库了,但这两种不同的驱动程序让我们难以选择使用哪一种,而且它们直接提供的ADO.NET实现用起来也不是十分方便,我们有必要将它们包装一下,简化使用方式。PDF.NET数据开发框架内置了MS DAAB类似的AdoHelper数据访问抽象类,所以只要继承该类就可以拥有PDF.NET强大的数据访问能力。

1,包装Ngpsql驱动程序

下面以Npgsql为例,看看如何让PDF.NET支持PostgreSQL。下面是贴出全部代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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="http://www.alberton.info/postgresql_meta_info.html"/>
        /// </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 方法,它将SQLSERVER格式的SQL语句转换成PostgreSQL支持的格式,SQLSERVER使用成对的中括号来限定对象名,而PostgreSQL使用双引号,尤其在对象名称使用了大小写混合的情况。另外程序为了支持获取数据库的架构信息,重写了AdoHelper的抽象方法GetSchema,有关PostgreSQL具体获取表架构信息的内容,请参看 http://www.alberton.info/postgresql_meta_info.html

2,包装dotConnect驱动程序

程序代码与使用Npgsql类似,区别主要是将上面代码中的Npgsql字样替换成PgSql即可,引用Devart.Data.dll,Devart.Data.PostgreSql.dll,使用下面的名称空间:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
using Devart.Data.PostgreSql;

由于dotConnect的驱动程序采用Oracle驱动程序的风格,要求SQL语句的参数使用“:”作为参数名称,而不是SqlServer样式的“@”,所以下面的方法需要重写:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/// <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访问:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<add name="ConnectionSetting" connectionString="server=192.168.XX.XX;User Id=postgres;password=XXXX;DataBase=XXDB" providerName="PWMIS.DataProvider.Data.PostgreSQL,PWMIS.PostgreSQLClient"/>

使用dotConnect访问:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<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的数据访问脚本:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<Select CommandName="GetFundFeat" Method="" CommandType="Text" Description="获取业绩" ResultClass="DataSet">
<![CDATA[SELECT * FROM GetFundTrend_FundAnalysis_FundFeat (#currentJJDM:String#,#OtherJJDM:String#)]]>
</Select>

然后使用集成开发工具的代码生成器生成一个类中下面的方法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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访问:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//2011/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访问:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//2011/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数据开发框架的详细信息,请看官网说明:http://www.pwmis.com/sqlmap

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
PDF.NET数据开发框架实体类操作实例(for PostgreSQL,并且解决自增问题) PDF.NET数据开发框架实体类操作实例(MySQL)
本篇是 PDF.NET数据开发框架实体类操作实例(MySQL) 的姊妹篇,两者使用了同一个测试程序,不同的只是使用的类库和数据库不同,下面说说具体的使用过程。 1,首先在App.config文件中配置
用户1177503
2018/02/27
1.6K0
抽象SQL查询:SQL-MAP技术的使用
什么是参数化查询?我们来看百科对此的定义和示例: 一,定义 ------------------------------------------------------------------ 参数化查询(Parameterized Query 或 Parameterized Statement)是指在设计与数据库链接并访问数据时,在需要填入数值或数据的地方,使用参数 (Parameter) 来给值,这个方法目前已被视为最有效可预防SQL注入攻击 (SQL Injection) 的攻击手法的防御方式。
用户1177503
2018/02/27
2.3K0
PDF.NET数据开发框架实体类操作实例
本篇是 PDF.NET数据开发框架实体类操作实例(MySQL) 的姊妹篇,两者使用了同一个测试程序,不同的只是使用的类库和数据库不同,下面说说具体的使用过程。 1,首先在App.config文件中配置
用户1177503
2018/02/26
9760
ORM查询语言(OQL)简介--实例篇
相关文章内容索引: ORM查询语言(OQL)简介--概念篇 ORM查询语言(OQL)简介--实例篇 ORM查询语言(OQL)简介--高级篇:脱胎换骨 ORM查询语言(OQL)简介--高级篇(续):庐山真貌 [概念回顾]     我们在前一篇《ORM查询语言(OQL)简介--概念篇》中了解到,SQL跟ORM的关系,ORM会自动生成SQL语句并执行,但普通的ORM框架却不能灵活的生成需要的SQL语句,我们需要一种具有SQL灵活性的的但却能够面向对象的ORM查询语言(ORM Query Language)--OQ
用户1177503
2018/02/27
5.3K0
PDF.NET数据开发框架操作MySQL实体类操作实例
在我们最近的项目中,SQL-MAP使用较多,但是实体类用的很少,实际上,“PDF.NET数据开发框架”的实体类相当强大,下面的测试程序是在MySQL中操作的实例。 1,首先在App.config文件中
用户1177503
2018/02/26
1K0
Net连接mysql的公共Helper类MySqlHelper.cs带MySql.Data.dll下载
MySqlHelper.cs代码如下: using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Text; using System.Data; using System.Collections; using MySql.Data.MySqlClient; using MySql.Data.Types; using System.Configuration; using
磊哥
2018/05/08
2.3K0
使用“消息服务框架”(MSF)实现分布式事务的三阶段提交协议(电商创建订单的示例)
1,示例解决方案介绍 在上一篇 《消息服务框架(MSF)应用实例之分布式事务三阶段提交协议的实现》中,我们分析了分布式事务的三阶段提交协议的原理,现在我们来看看如何使用消息服务框架(MSF)来具体实现
用户1177503
2018/02/27
1.4K0
使用“消息服务框架”(MSF)实现分布式事务的三阶段提交协议(电商创建订单的示例)
PostgreSQL的.NET驱动程序Npgsql中参数对象的一个Bug
最近将公司的项目从SqlServer移植到PostgreSQL数据库上来,在调用数据库的存储过程(自定义函数)的时候,发现一个奇怪的问题,老是报函数无法找到。 先看一个PgSQL存储过程: CREATE OR REPLACE FUNCTION updateattention(dm citext)   RETURNS void AS $BODY$ DECLARE    BEGIN   update ZB set gzd=COALESCE(gzd,0)+1 where ZB.dm=$1 ; END; $BODY
用户1177503
2018/02/26
1.4K0
PDF.NET的SQL日志 ASP.net 路径问题 详解
PDF.NET(PWMIS数据开发框架)是一个基于SQL-MAP(将SQL语句映射成数据访问代码)和OQL(对象化的SQL查询表达式)技术的数据开发框架,兼有SQL和ORM的特点。尽管有些数据库系统能够提供SQL监视,比如SQLSERVER的事务日志跟踪,但好多数据库都没有提供这样的功能,所以很多数据(或者ORM)框架都会有一个记录执行的SQL日志的功能,PDF.NET也不例外,下面讲讲它是怎么实现的。 1,SQL日志功能代码介绍 PDF.NET 底层访问数据库使用的是兼容MS DAAB 3.1的AdoHe
用户1177503
2018/02/26
8340
PDF.NET(PWMIS数据开发框架)之SQL-MAP目标和规范
SQL-MAP的目标: 集中管理SQL语句,所有SQL语句放在专门的配置文件中进行管理; 通过替换SQL配置文件,达到平滑切换数据库到另外一个数据库,比如从Oracle的应用移植到SQLSERVER; 由DBA来写程序,对于复杂的查询,DBA写的SQL语句和存储过程更有保障更有效率,SQL-MAP工具让DBA也能够写.NET程序; 代码自动生成,由于在SQL配置文件中指定了很多编程特性,所以可以使用专用工具将配置文件映射到.NET代码; PDF.NET 数据开发框架介绍(含实例程序下载)请看: http
用户1177503
2018/02/26
1.1K0
PDF.NET(PWMIS数据开发框架)之SQL-MAP目标和规范
AdoHelper使用MySQL存储过程示例
AdoHelper是MS DAAB中的一个抽象数据访问类,由它派生出的SqlHelper使用很广泛,PDF.NET数据开发框架内部按照AdoHelper的接口做了一个自己的实现,下面简单说明一下怎么用它使用存储过程。 PDF.NET的两个功能:SQL-MAP和OQL在我们的项目和框架的示例程序用的都比较多,但是直接使用AdoHelper的人还很少,所以新来的同事为了简便,自己又去找了一个SqlHelper,实际上没有这个必要。 假设有一个MySQL数据库test,有一个存储过程proc_user1,下面是使
用户1177503
2018/02/26
1.3K0
CodeSmith 创建Ado.Net自定义模版(三)
CodeSmith 创建Ado.Net自定义模版(三) 接上一篇:   CodeSmith 创建Ado.Net自定义模版(二) 写数据访问层模版:Step3_DAL.cst (接口一这步在这套模版中省略,可以自行补充) 写几个通用方法,比如:得到全部实体集合、通过ID得实体、添加、删除、修改几个方法 我这里没有使用sqlhelper之类的帮助类 <%@ CodeTemplate Language="C#" TargetLanguage="C#" ResponseEncoding="UTF-8" Descri
Porschev
2018/01/16
9000
将复杂查询写到SQL配置文件--SOD框架的SQL-MAP技术简介
引言 今天看到一片热门的博客, .NET高级工程师面试题之SQL篇 ,要求找出每一个系的最高分,并且按系编号,学生编号升序排列。这个查询比较复杂,也比较典型,自从用了ORM后,很久没有写过SQL语句了,于是我研究了下,自己也写了一个: WITH cte1 as ( select stu.deptID, D.depName, stu.stuid , stu.stuName, score_sum.AllScore from dbo.S
用户1177503
2018/02/27
1.7K0
将复杂查询写到SQL配置文件--SOD框架的SQL-MAP技术简介
PDF.NET数据开发框架 之SQL-MAP使用存储过程
有关SQL-MAP的规范性介绍,请看下面的文章: PDF.NET(PWMIS数据开发框架)之SQL-MAP目标和规范 在SQL-MAP中使用存储过程 1,存储过程的输出参数在SQL MAP 中的使用: 我们先创建一个存储过程CountUser ,它有一个输入参数和一个输出参数: Create Procedure CountUser         @CountNum int  output,         @Field varchar(10)         AS         SELECT @
用户1177503
2018/02/26
7880
PDF.NET SOD 开源框架红包派送活动 && 新手快速入门指引
一、框架的由来  快速入门 有关框架的更多信息,请看框架官方主页! 本套框架的思想是借鉴Java平台的Hibernate 和 iBatis 而来,兼有ORM和SQL-MAP的特性,同时还参考了后来.NET的LINQ(本框架成型于2006年,当时还未听说过LINQ)使用风格,设计了OQL查询表达式。本框架的设计思想是通用的,完全可以移植到Java 平台,现在只提供了.NET平台的实现,暂且将本框架命名为 PDF.NET 从2013.10.1日起,原PDF.NET 将更名为 SOD o
用户1177503
2018/02/27
1.6K0
.net访问PostgreSQL数据库发生“找不到函数名”的问题追踪
    PostgreSQL是一个使用广泛的免费开源的数据库,与MySQL比较,它更适合复杂的企业计算任务,而MySQL在互联网领域应用更为广泛,究其原因,可能是PostgreSQL拥有支持最多的数据类型,甚至包括数组类型,IP地址类型等,可以使用C,SQL,PL/Pgsql,Phython等多种方式编写强大的自定义函数,因此特别适合处理复杂的计算问题。如果想要将SqlServer数据库迁移到其它类型的数据库,PostgreSQL是比较好的选择。     尽管PostgreSQL使用比较广泛,但在国内相关资
用户1177503
2018/02/27
1.7K0
不使用DalFactory和IDAL,支持多种数据库应用
MS的PetShop示例应用程序的“多层架构”被很多.NET开发人员奉为经典的架构,我以前做的项目团队的Leader也是照搬它的,甚至来到现在这个公司后,好几个新来的同事建解决方案也是照搬PetSho
用户1177503
2018/02/26
6560
不使用DalFactory和IDAL,支持多种数据库应用
2024年了还有人玩DbHelper?- 确实很6
时光荏苒,转眼已是2024年。在这个技术日新月异的时代,有些经典却永远不会过时。DbHelper,这个在开发者社区中一直备受瞩目的名字,如今依然熠熠生辉。最近,一位技术大佬再次展示了DbHelper的强大魅力,让我们一起来欣赏一下吧!
沙漠尽头的狼
2024/01/26
1550
2024年了还有人玩DbHelper?- 确实很6
.NET ORM 的 “SOD蜜”--零基础入门篇
PDF.NET SOD框架不仅仅是一个ORM,但是它的ORM功能是独具特色的,我在博客中已经多次介绍,但都是原理性的,可能不少初学的朋友还是觉得复杂,其实,SOD的ORM是很简单的。下面我们就采用流行的 Code First的方式,一步步来了解下。 一、准备工作 1.1,添加SOD包引用 首先建立一个控制台项目(支持.NET2.0的项目),并使用程序包管理器添加PDF.NET SOD的程序引用: PM> Install-Package PDF.NET.SOD 更多详细使用信息说明,请参考nuget 网站说明
用户1177503
2018/02/27
1.2K0
.NET ORM 的 “SOD蜜”--零基础入门篇
调用PostgreSQL存储过程,找不到函数名的问题
PostgreSQL的表,函数名称都是严格区分大小写的,所以在使用的时候没有注意大小写问题容易导致找不到函数名的错误,但最近两天我们发现,如果函数参数使用了自定义的数据类型,也会发生这个问题。 问题描述: 下面的示例测试代码: PWMIS.DataProvider.Data.AdoHelper db = MyDB.GetDBHelperByConnectionName("PostgreSQL");             IDataParameter para = db.GetParameter();   
用户1177503
2018/02/26
2K0
推荐阅读
相关推荐
PDF.NET数据开发框架实体类操作实例(for PostgreSQL,并且解决自增问题) PDF.NET数据开发框架实体类操作实例(MySQL)
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验