本文将介绍如何在C#应用中使用PolarDB .NET驱动连接PolarDB PostgreSQL版(兼容Oracle)数据库。
前提条件
背景信息
PolarDB .NET(全称为ADO.NET Data Provider for PolarDB)是使用C#、Visual Basic、F#等语言访问PolarDB的驱动,驱动提供了对Entity Framework Core和Entity Framework 6.x的兼容能力,您可以使用本驱动结合Entity Framework快速开发应用程序。
当前的驱动程序使用了PostgreSQL 3.0版本协议 ,与.NETFramework 2.0,.NET Framework 4.0,.NET Framework 4.5,.NET Core 2.0版本兼容。
旧版本的PolarDB .NET驱动中,很多驱动内的类型都是POLARDB开头的,现在都已经变更为PolarDB,需要进行代码适配(文本替换),驱动内的逻辑并未发生变化,可以放心升级。
Entity Framework简介
Entity Framework是.NET平台上流行的ORM框架。在使用C#编写后端应用时,Entity Framework以及LINQ技术极大地加速了后端应用的开发。
PolarDB .NET驱动提供了PolarDB的EF5、EF6的dll,用于使用Entity Framework。
关于Entity Framework的更多介绍,请参见Entity Framework官网。
安装.NET驱动
- 下载.NET驱动。
- 解压.NET驱动。
unzip polardb_oracle_.net.zip
- 将驱动导入到Visual Studio项目中。
操作示例
在Samples目录中,您可以看到一个PolarDBSample.sql文件以及多个示例项目文件,以下操作将指导您如何运行这些示例项目。
- 连接数据库,具体操作请参见连接数据库集群。
- 执行如下命令创建一个名为
sampledb
的数据库。CREATE DATABASE sampledb;
- 将测试所需要的数据库、表、数据、函数导入到
sampledb
数据库。\i ${your path}/PolarDBSample.sql
- 数据导入完成后,您可以开始编写C#代码了。
下列代码示例中展示了如何进行查询、更新以及存储过程调用。
using System; using System.Data; using PolarDB.PolarDBClient; /* * This class provides a simple way to perform DML operation in PolarDB * * @revision 1.0 */ namespace PolarDBClientTest { class SAMPLE_TEST { static void Main(string[] args) { PolarDBConnection conn = new PolarDBConnection("Server=localhost;Port=5432;User Id=polaruser;Password=password;Database=sampledb"); try { conn.Open(); //Simple select statement using PolarDBCommand object PolarDBCommand PolarDBSeletCommand = new PolarDBCommand("SELECT EMPNO,ENAME,JOB,MGR,HIREDATE FROM EMP",conn); PolarDBDataReader SelectResult = PolarDBSeletCommand.ExecuteReader(); while (SelectResult.Read()) { Console.WriteLine("Emp No" + " " + SelectResult.GetInt32(0)); Console.WriteLine("Emp Name" + " " + SelectResult.GetString(1)); if (SelectResult.IsDBNull(2) == false) Console.WriteLine("Job" + " " + SelectResult.GetString(2)); else Console.WriteLine("Job" + " null "); if (SelectResult.IsDBNull(3) == false) Console.WriteLine("Mgr" + " " + SelectResult.GetInt32(3)); else Console.WriteLine("Mgr" + "null"); if (SelectResult.IsDBNull(4) == false) Console.WriteLine("Hire Date" + " " + SelectResult.GetDateTime(4)); else Console.WriteLine("Hire Date" + " null"); Console.WriteLine("---------------------------------"); } //Insert statement using PolarDBCommand Object SelectResult.Close(); PolarDBCommand PolarDBInsertCommand = new PolarDBCommand("INSERT INTO EMP(EMPNO,ENAME) VALUES((SELECT COUNT(EMPNO) FROM EMP),'JACKSON')",conn); PolarDBInsertCommand.ExecuteScalar(); Console.WriteLine("Record inserted"); //Update using PolarDBCommand Object PolarDBCommand PolarDBUpdateCommand = new PolarDBCommand("UPDATE EMP SET ENAME ='DOTNET' WHERE EMPNO < 100",conn); PolarDBUpdateCommand.ExecuteNonQuery(); Console.WriteLine("Record has been updated"); PolarDBCommand PolarDBDeletCommand = new PolarDBCommand("DELETE FROM EMP WHERE EMPNO < 100",conn); PolarDBDeletCommand.CommandType= CommandType.Text; PolarDBDeletCommand.ExecuteScalar(); Console.WriteLine("Record deleted"); //procedure call example try { PolarDBCommand callable_command = new PolarDBCommand("emp_query(:p_deptno,:p_empno,:p_ename,:p_job,:p_hiredate,:p_sal)", conn); callable_command.CommandType = CommandType.StoredProcedure; callable_command.Parameters.Add(new PolarDBParameter("p_deptno",PolarDBTypes.PolarDBDbType.Numeric,10,"p_deptno",ParameterDirection.Input,false ,2,2,System.Data.DataRowVersion.Current,20)); callable_command.Parameters.Add(new PolarDBParameter("p_empno", PolarDBTypes.PolarDBDbType.Numeric,10,"p_empno",ParameterDirection.InputOutput,false ,2,2,System.Data.DataRowVersion.Current,7369)); callable_command.Parameters.Add(new PolarDBParameter("p_ename", PolarDBTypes.PolarDBDbType.Varchar,10,"p_ename",ParameterDirection.InputOutput,false ,2,2,System.Data.DataRowVersion.Current,"SMITH")); callable_command.Parameters.Add(new PolarDBParameter("p_job", PolarDBTypes.PolarDBDbType.Varchar,10,"p_job",ParameterDirection.Output,false ,2,2,System.Data.DataRowVersion.Current,null)); callable_command.Parameters.Add(new PolarDBParameter("p_hiredate", PolarDBTypes.PolarDBDbType.Date,200,"p_hiredate",ParameterDirection.Output,false ,2,2,System.Data.DataRowVersion.Current,null)); callable_command.Parameters.Add(new PolarDBParameter("p_sal", PolarDBTypes.PolarDBDbType.Numeric,200,"p_sal",ParameterDirection.Output,false ,2,2,System.Data.DataRowVersion.Current,null)); callable_command.Prepare(); callable_command.Parameters[0].Value = 20; callable_command.Parameters[1].Value = 7369; PolarDBDataReader result = callable_command.ExecuteReader(); int fc = result.FieldCount; for(int i=0;i<fc;i++) Console.WriteLine("RESULT["+i+"]="+ Convert.ToString(callable_command.Parameters[i].Value)); result.Close(); } // 如果是.NET 2.0驱动,此处需要进行适当修改 catch(PolarDBException exp) { if(exp.ErrorCode.Equals("01403")) Console.WriteLine("No data found"); else if(exp.ErrorCode.Equals("01422")) Console.WriteLine("More than one rows were returned by the query"); else Console.WriteLine("There was an error Calling the procedure. \nRoot Cause:\n"); Console.WriteLine(exp.Message.ToString()); } //Prepared statement string updateQuery = "update emp set ename = :Name where empno = :ID"; PolarDBCommand Prepared_command = new PolarDBCommand(updateQuery, conn); Prepared_command.CommandType = CommandType.Text; Prepared_command.Parameters.Add(new PolarDBParameter("ID", PolarDBTypes.PolarDBDbType.Integer)); Prepared_command.Parameters.Add(new PolarDBParameter("Name", PolarDBTypes.PolarDBDbType.Text)); Prepared_command.Prepare(); Prepared_command.Parameters[0].Value = 7369; Prepared_command.Parameters[1].Value = "Mark"; Prepared_command.ExecuteNonQuery(); Console.WriteLine("Record Updated..."); } catch(PolarDBException exp) { Console.WriteLine(exp.ToString() ); } finally { conn.Close(); } } } }
连接串参数
当您连接数据库时,应用程序需要提供连接字符串,字符串包含主机、用户名、密码等参数。
连接字符串的形式为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 | 清理闲置连接的间隔(秒)。 |
参数 | 说明 |
---|---|
application_name | 应用程序名称。 |
search_path | Schema的搜索路径。 |
client_encoding | 客户端编码。 |
timezone | 会话的时区。 |