全部產品
Search
文件中心

PolarDB:.NET

更新時間:Jul 06, 2024

本文將介紹如何在C#應用中使用PolarDB .NET驅動串連PolarDB PostgreSQL版(相容Oracle)資料庫。

前提條件

  • 已經在PolarDB叢集建立使用者,如何建立使用者請參見建立資料庫帳號
  • 已經將需要訪問PolarDB叢集的主機IP地址添加到白名單,如何添加白名單請參見設定叢集白名單

背景資訊

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驅動

  1. 下載.NET驅動
  2. 解壓.NET驅動。
    unzip polardb_oracle_.net.zip
  3. 將驅動匯入到Visual Studio專案中。
    1. 在Visual Studio的GUI介面右鍵專案,單擊添加引用
    2. 引用管理器對話方塊,單擊瀏覽 > 瀏覽
      Visual Studio-1
    3. 選擇要引用的檔案對話方塊,選中合適版本的驅動,單擊添加
      Visual Studio-2
    4. 單擊確定

操作樣本

在Samples目錄中,您可以看到一個PolarDBSample.sql檔案以及多個樣本專案檔,以下操作將指導您如何運行這些樣本專案。

  1. 串連資料庫,具體操作請參見串連資料庫叢集
  2. 執行如下命令建立一個名為sampledb的資料庫。
    CREATE DATABASE sampledb;
  3. 將測試所需要的資料庫、表、資料、函數匯入到sampledb資料庫。
    \i ${your path}/PolarDBSample.sql
  4. 資料匯入完成後,您可以開始編寫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;,不區分大小寫,包含特殊字元(例如分號)的值可以使用雙引號("")。

以下是該驅動支援的連接字串參數。

表 1. 基本串連
參數樣本說明
HostlocalhostPolarDB叢集的串連地址,如何查看串連地址請參見查看或申請串連地址
Port1521PolarDB叢集的連接埠,預設為1521。
Databasesampledb需要串連的資料庫名稱。
UsernamepolaruserPolarDB叢集的使用者名稱。
PasswordpasswordPolarDB叢集使用者名稱對應的密碼。
表 2. 串連池
參數樣本說明
Poolingtrue是否啟用串連池。
Minimum Pool Size0串連池的最小大小。
Maximum Pool Size100串連池的最大大小。
Connection Idle Lifetime300當串連數量超出Minimum Pool Size時,關閉多餘閒置串連的逾時時間(秒)。
Connection Pruning Interval10清理閑置串連的間隔(秒)。
表 3. 其他參數
參數說明
application_name應用程式名稱。
search_pathSchema的搜尋路徑。
client_encoding用戶端編碼。
timezone會話的時區。