本文將介紹如何在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專案中。
- 在Visual Studio的GUI介面右鍵專案,單擊添加引用。
- 在引用管理器對話方塊,單擊 。
- 在選擇要引用的檔案對話方塊,選中合適版本的驅動,單擊添加。
- 單擊確定。
操作樣本
在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 | 會話的時區。 |