本文将介绍如何在C#应用中使用PolarDB .NET驱动连接PolarDB PostgreSQL版(兼容Oracle)数据库。

前提条件

  • 已经在PolarDB集群创建用户,如何创建用户请参见创建数据库账号

  • 已经将需要访问PolarDB集群的主机IP地址添加到白名单,如何添加白名单请参见设置集群白名单

背景信息

.NET(发音为"dot net")是一个由微软开发的软件框架,它提供了一种广泛的计算机编程环境。.NET框架的首个版本发布于2002年,旨在提供一套统一的编程模型,并支持多种编程语言,这样开发人员可以创建面向Windows平台的应用程序。随着时间的发展,.NET框架已经扩展到跨多种平台,包括Linux和macOS。

PolarDB提供了.net 2.0、.net 3.5、 .net 4.0、 .net 5.0、 .net 6.0、 .net 7.0、.net 8.0、netcoreapp3.1、netstandard2.0、netstandard2.1版本的.NET程序。

版本软件包

由于Npgsql与PolarDB存在着较复杂的对应关系,因此PolarDB目前支持以下版本的Npgsql,分别是v2.2.7、v5.0.10、v7.0.6.1和v8.0.4.1。同时,也维护了EntityFrameworkCore的一个版本,即v5.0.10,这提供了从.NET 2.0到7.0各个版本的平台支持。

程序名

v2.2.7

v.5.0.10

v7.0.6.1

v8.0.4.1

.net2.0

Mono.Security.dll

Npgsql.dll

.net3.5

Mono.Security.dll

Npgsql.dll

.net4.0

Mono.Security.dll

Npgsql.dll

.net5.0

Npgsql.dll

Npgsql.dll

.net6.0

Npgsql.dll

Npgsql.dll

.net7.0

Npgsql.dll

Npgsql.dll

.net8.0

Npgsql.dll

netcoreapp3.1

Npgsql.dll

Npgsql.dll

netstandard2.0

Npgsql.dll

Npgsql.dll

Npgsql.dll

netstandard2.1

Npgsql.dll

Npgsql.EntityFrameworkCore.PostgreSQL.dll

Npgsql.dll

Npgsql.dll

连接串参数

当您连接数据库时,应用程序需要提供连接字符串,字符串包含主机、用户名、密码等参数。

连接字符串的形式为keyword1=value; keyword2=value;,不区分大小写,包含特殊字符(例如分号)的值可以使用双引号("")。

以下是该驱动支持的连接字符串参数。

参数

示例

说明

Host

localhost

PolarDB集群的连接地址,如何查看连接地址请参见查看或申请连接地址

Port

1521

PolarDB集群的端口,默认为1521。

Database

sampledb

需要连接的数据库名称。

Username

polaruser

PolarDB集群的用户名。

Password

password

PolarDB集群用户名对应的密码。

Pooling

true

是否启用连接池。

Minimum Pool Size

0

连接池的最小大小。

Maximum Pool Size

100

连接池的最大大小。

Connection Idle Lifetime

300

当连接数量超出Minimum Pool Size时,关闭多余闲置连接的超时时间(秒)。

Connection Pruning Interval

10

清理闲置连接的间隔(秒)。

示例

示例如下所示:

using Npgsql;


var connString = "Host=xxxx;Port=xxxx;Username=xxx;Password=xxx;Database=xxxx";

await using var conn = new NpgsqlConnection(connString);
await conn.OpenAsync();

// Retrieve all rows
await using (var cmd = new NpgsqlCommand("SELECT sysdate FROM dual", conn))
await using (var reader = await cmd.ExecuteReaderAsync())
{
    while (await reader.ReadAsync())
        Console.WriteLine(reader.GetDateTime(0));
}

结果如下所示:

image.png

常见问题

  • Q:在Oracle上的表名都是大写,切换到PolarDB后,配置的表名找不到了该怎么处理?

    A:Nulget下载EFCore.NamingConventions,在项目配置连接串的位置添加UseSnakeCaseNamingConvention()可以解决所有非注解下,表名、列名自动的大小写问题。

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        => optionsBuilder
            .UseNpgsql(...)
            .UseSnakeCaseNamingConvention();
  • Q:项目有一些自定义的类型转换使用了Date类型,使用PolarDB的包后出现报错。

    A:如果在底层的类型使用过NpgsqlDbType.Date类型,可以替换成NpgsqlDbType.Sysdate。

    例如:

    case OracleDbType.Date: 
      return NpgsqlDbType.Date;

    可以替换为:

    case OracleDbType.Date:
      return NpgsqlDbType.Sysdate;

版本更新日志

  • V8.0.4.1更新日志(2024-09-18)

    • 新增功能:支持V8.0.4.1版本,兼容.NET 6.0.NET 7.0.NET 8.0版本。

  • V7.0.6.1更新日志(2024-08-23)

    • 新增功能:支持不带 $$符号执行PL/SQL存储过程。

    • 问题修复:

      • 修复了元信息中关于DBMS内置对象识别的相关问题。

      • 修正了因 ROWID导致的类型读取错误。

  • V7.0.6更新日志(2024-06-19)

    • 新增功能:新增对Oracle语法兼容 2.0中64位日期格式的识别支持。

专家面对面

关于.NET,如果您在使用过程中有任何问题,请进钉钉群咨询。

您可用钉钉扫描如下二维码,或搜索群号:78895009155

image.png