在.NET開發麵向Oracle資料庫的應用程式

来源:http://www.cnblogs.com/chenxizhang/archive/2016/04/21/5415442.html
-Advertisement-
Play Games

其實這個不是一個什麼新的話題。但是之前在多次項目中,總是遇到大家針對Oracle資料庫的訪問時,會有各種各樣的問題,最基本的就是要在客戶端安裝各種client,版本不一樣的話還有各種問題。 靜下心來看看,其實也沒有那麼難。我這裡總結一下,如何在.NET應用程式中,簡單優雅地使用Oracle資料庫。 ... ...


其實這個不是一個什麼新的話題。但是之前在多次項目中,總是遇到大家針對Oracle資料庫的訪問時,會有各種各樣的問題,最基本的就是要在客戶端安裝各種client,版本不一樣的話還有各種問題。

靜下心來看看,其實也沒有那麼難。我這裡總結一下,如何在.NET應用程式中,簡單優雅地使用Oracle資料庫。

第一個原則:不要依賴

最好的情況就是,程式自己就可以完成數據訪問,不需要額外地安裝所謂的Oracle Client,那是一個很麻煩而且痛苦的事情。

我們首先看看,如果不裝任何東西,是否可以實現Oracle資料庫訪問?

其實,.NET本身是自帶了針對Oracle資料庫訪問的組件的,就是下麵這個System.Data.OracleClient

image

我們的代碼如下(這是最原始的ADO.NET代碼,只是做演示)

using System;
using System.Data.OracleClient;

namespace ConsoleApplication
{
    class Program
    {
        static void Main(string[] args)
        {
            var connectionString = "user id=system;password=password;data source=192.168.56.101:1521/orcl";

            using (var connection = new OracleConnection(connectionString))
            {
                var cmd = connection.CreateCommand();
                cmd.CommandText = "select * from sys.dba_all_tables";
                connection.Open();
                var reader = cmd.ExecuteReader();
                while (reader.Read())
                {
                    Console.WriteLine(reader.GetString(0));

                }

                reader.Close();
                connection.Close();

            }
           
        }
    }
}

 

看起來應該是沒有問題的,運行起來卻會報錯

Additional information: System.Data.OracleClient requires Oracle client software version 8.1.7 or greater.

image

這裡的提示就是說,需要有Oracle Client。

這不是我們希望看到的結果。實際上原理上說,我們這麼理解吧,可能是這個組件只是一個wrapper,它實際去操作資料庫,還需要通過Oracle Client才能實現。

 

使用Oracle提供的組件

更好的建議就是,使用Oracle 官方提供的托管代碼組件。Oracle.ManagedDataAccess.dll

image

image

只要添加了這個Nuget Package,代碼幾乎不需要任何改動,直接就可以復用。

using System;
using Oracle.ManagedDataAccess.Client;

namespace ConsoleApplication
{
    class Program
    {
        static void Main(string[] args)
        {
            var connectionString = "user id=system;password=password;data source=192.168.56.101:1521/orcl";

            using (var connection = new OracleConnection(connectionString))
            {
                var cmd = connection.CreateCommand();
                cmd.CommandText = "select * from sys.dba_all_tables";
                connection.Open();
                var reader = cmd.ExecuteReader();
                while (reader.Read())
                {
                    Console.WriteLine(reader.GetString(0));

                }

                reader.Close();
                connection.Close();

            }
           
        }
    }
}

 

當然比較理想的情況是將連接字元串之類的,可以放在配置文件中去。這個很簡單,這裡就不說明瞭。

 

結合Entity Framework使用

Entity Framework 出來已經好多年了,幾乎成了所有.NET應用程式中的標配(不管有沒有用到)。現在的最新版本應該是 6.1.3 .同時,需要註意的是,以後會有一個所謂的Entity Framework Core ,而且開源了 https://github.com/aspnet/EntityFramework

回到正題,之前的代碼寫法其實還是比較原始的,那麼如何結合Entity Framework進行Oracle資料庫方面的編程呢?

首先,安裝下麵的這個組件:Oracle.ManagedDataAccess.EntityFramework

image

然後,可以使用Code first的方式編寫如下代碼

using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Data.Entity;

namespace ConsoleApplication
{
    public class OracleContext : DbContext
    {
        public OracleContext() : base("OracleDbContext")
        {

        }

        public DbSet<Employee> Employees { get; set; }

    }

    [Table("EMPLOYEES", Schema = "SYSTEM")]
    public class Employee
    {
        [Key()]
        [Column("EMPLOYEEID")]
        public int EmployeeID { get; set; }

        [Column("FIRSTNAME")]
        public string FirstName { get; set; }
        [Column("LASTNAME")]
        public string LastName { get; set; }
    }
}

 

 

這裡的代碼沒有什麼出奇的。配置文件需要有如下的設置(一般在添加Oracle.ManagedDataAccess.EntityFramework 這個組件的時候,會自動修改配置文件)

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <section name="oracle.manageddataaccess.client" type="OracleInternal.Common.ODPMSectionHandler, Oracle.ManagedDataAccess, Version=4.121.2.0, Culture=neutral, PublicKeyToken=89b483f429c47342" />
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
  </configSections>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
  </startup>
  <oracle.manageddataaccess.client>
    <version number="*">
      <dataSources>
        <dataSource alias="oracle" descriptor="(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.56.101)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=ORCL))) " />
             </dataSources>
    </version>
  </oracle.manageddataaccess.client>
  <connectionStrings>
    <add name="OracleDbContext" connectionString="user id=system;password=password;data source=oracle" providerName="Oracle.ManagedDataAccess.Client" />
  </connectionStrings>
  <system.data>
    <DbProviderFactories>
      <remove invariant="Oracle.ManagedDataAccess.Client" />
      <add name="ODP.NET, Managed Driver" invariant="Oracle.ManagedDataAccess.Client" description="Oracle Data Provider for .NET, Managed Driver" type="Oracle.ManagedDataAccess.Client.OracleClientFactory, Oracle.ManagedDataAccess, Version=4.121.2.0, Culture=neutral, PublicKeyToken=89b483f429c47342" />
    </DbProviderFactories>
  </system.data>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <publisherPolicy apply="no" />
        <assemblyIdentity name="Oracle.ManagedDataAccess" publicKeyToken="89b483f429c47342" culture="neutral" />
        <bindingRedirect oldVersion="4.121.0.0 - 4.65535.65535.65535" newVersion="4.121.2.0" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
  <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
      <parameters>
        <parameter value="v13.0" />
      </parameters>
    </defaultConnectionFactory>
    <providers>
      <provider invariantName="Oracle.ManagedDataAccess.Client" type="Oracle.ManagedDataAccess.EntityFramework.EFOracleProviderServices, Oracle.ManagedDataAccess.EntityFramework, Version=6.121.2.0, Culture=neutral, PublicKeyToken=89b483f429c47342" />
      <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
    </providers>
  </entityFramework>
</configuration>

後臺資料庫的表格設計也是很簡單。

image

需要註意的是,經過實驗,我發現目前這個Entity Framework要求所操作的表必須要有主鍵,而且主鍵必須是一個identity column(即自己綁定一個序列,實現自動增長),否則會報錯

實際上後臺會通過一個觸發器來實現這個功能

create or replace TRIGGER EMPLOYEES_TRG
BEFORE INSERT ON EMPLOYEES
FOR EACH ROW
BEGIN
  <<COLUMN_SEQUENCES>>
  BEGIN
    IF INSERTING AND :NEW.EMPLOYEEID IS NULL THEN
      SELECT EMPLOYEES_SEQ.NEXTVAL INTO :NEW.EMPLOYEEID FROM SYS.DUAL;
    END IF;
  END COLUMN_SEQUENCES;
END;

 

接下來在前端程式中就簡單多了,下麵是一個代碼片段

var ctx = new OracleContext();

ctx.Employees.Add(new Employee() {FirstName = "ares", LastName = "chen" });
ctx.SaveChanges();

var query = ctx.Employees.ToArray();
foreach (var item in query)
{
    Console.WriteLine(item);
}

 

需要註意的是,如果需要使用Entity Frmaework的Database first或Model first的功能,還是需要安裝Oracle Client,或者準確地說應該是ODAC組件

http://www.oracle.com/technetwork/developer-tools/visual-studio/downloads/index.html


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 懶載入的定義: 所謂的懶載入可以定義為: 延時載入,即當對象需要用到的時候再去載入。其實就是所謂的重寫對象的get方法, 當系統或者開發者調用對象的get方法時,再去載入對象。 懶載入的優點: 1.不需將對象的實例化寫到viewDidLoad,可以簡化代碼,增強代碼的可讀性 2.對象的實例化在get ...
  • HashMap和SparseArray可以實現相似的功能。 但SparseArray是Android定義的,在鍵是整數時,他比HashMap的性能更高,因為HashMap使用的是Integer對象, 而SparseArray使用的是int型,因此使用HashMap會創建很多的Integer對象,而使 ...
  • 逐幀顯示一張圖片,連起來成為動畫 在res/drawable/目錄下,創建一個xxx.xml的文件 添加<animation-list>節點,設置是否迴圈android:oneshot:”false” 添加條目<item>節點,設置資源android:drawable=”@drawable/xxx” ...
  • 完成情況:瞭解as界面,以及基礎功能 制定個人模塊基本計劃 截圖及鏈接:運行helloworld:http://jingyan.baidu.com/album/90895e0fce970264ec6b0bf2.html?picindex=5 as入門知識介紹:http://blog.csdn.net ...
  • 說什麼都是蒼白的,直接上圖~ 在某些情況下,我們需要獲取用戶周邊的位置,來讓用戶選取。例如微信的朋友圈,在發一條朋友圈時可以選擇地點,就是使用這樣的功能。 基於以上的情況(其實也就是為了模仿微信),有了這個簡單的demo。 #-1 說明 其中使用了高德地圖的開發包,用了定位和搜索兩個模塊。demo中 ...
  • 今天主要學了幾個android控制項和使用兩個適配器 ListView DatePicker和TimePicker GridView 適配器:SimpleAdapter和ArrayAdapter 都是常見的控制項 學到現在就越來越發現,其實基本功打扎實了,學起這些很簡單,就是屬性和事件。 關於這些控制項有 ...
  • 【轉載】 Axc註:版本為AFNetWorking 2.6 3.0需要修改大部分對象 一:聲明本 人以前一直是使用ASI網路請求類庫的。最近才開始瞭解使用AFNetworing這個類庫。網上也肯定會有更好的介紹AFN的博客文章,希望大家辯證閱 讀,取之精華,去其糟粕。本人的認識可能有錯誤或者不全的地 ...
  • select distinct s.database_name, s.first_lsn,s.last_lsn,s.database_backup_lsn,s.backup_finish_date,s.type,f.physical_drive from msdb..backupset s join ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...