大概幾年之前用PetaPoco做過一個Oracle的項目,開發的時候還需要安裝oracle的client,非常麻煩。調試好環境後,一直到項目結束都不敢重裝系統。最近又有一個需求需要讀取oracle,可是環境已經沒了……
再重新配置吧,先使用nuget下載安裝了PetaPoco,沒想到最新的版本變動比較大,貌似缺少幾個類,時間緊急沒時間折騰了,於是下載了一個舊版5.0.1。但是實在不想安裝oracle client那麼肥的東西,就想使用Oracle.DataAccess.dll來直接訪問。
在App.config文件裡添加數據庫字符串:
<connectionStrings>
<add name="MyDbContext"
connectionString="Data Source=(DESCRIPTION=
(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=xxx)(PORT=1521)))
(CONNECT_DATA=(SERVICE_NAME=ORCL)));
User Id=scott;Password=xxx;"
providerName="Oracle.DataAccess.Client" />
</connectionStrings>
修改T4模板Database.tt的以下幾個地方:
ConnectionStringName = "MyDbContext"; // Uses last connection string in config if not specified
Namespace = "Domain.Models";
RepoName = "MyDbContext";
保存,毫無疑問的報錯了:
// -----------------------------------------------------------------------------------------
// Failed to load provider `Oracle.DataAccess.Client` - 找不到請求的 .Net Framework Data Provider。可能沒有安裝。
// -----------------------------------------------------------------------------------------
肯定還是驅動沒裝好,在搜索解決辦法的時候,找到這兩篇文章:
原來Oracle已經推出了可托管的驅動,而且不區分32位還是64位了,這樣應該就更方便了。Oracle官網上的下載簡直要惡心死人。於是按照說明從nuget裡搜索odp.net.managed:
安裝後修改數據庫連接字符串的provider:
providerName="Oracle.ManagedDataAccess.Client"
又報錯了,還是相同的錯誤,找不到Oracle.ManagedDataAccess.Client這個驅動:
// -----------------------------------------------------------------------------------------
// Failed to load provider `Oracle.ManagedDataAccess.Client` - 找不到請求的 .Net Framework Data Provider。可能沒有安裝。
// -----------------------------------------------------------------------------------------
看來直接安裝nuget還是不行啊,還是得老老實實上官網下,找到這個頁面:
http://www.oracle.com/technetwork/database/windows/downloads/utilsoft-087491.html
一堆啊!!!下哪個啊???
我下的是這個:
解壓縮之後裡面有幾個文件夾和dll,dll我們已經通過nuget安裝了就不管了,裡面有一個install_odpm.bat,看來是得安裝一下了。直接運行,刷一下就沒了,再運行還是刷一下就沒了。
那就先開cmd吧。運行cmd找到這個bat,運行一下:
原來是不能直接運行的,還要加參數。按照第三種方式運行,又報錯了:
看來需要啟用管理員權限,使用管理員模式運行cmd,終於可以成功了。
打開這個bat可以看到其實就是copy了幾個文件到系統目錄,自動添加了tnsnames.ora這些文件。
再運行一下Database.tt,這次就報其他的錯了:
// -----------------------------------------------------------------------------------------
// Failed to read database schema - ' user id' 是無效的連接字符串屬性
// -----------------------------------------------------------------------------------------
看來驅動已經正常加載上了。那為什麼報這個錯呢?
找了半天原因,原來是數據庫連接字符串不能有換行!否則PetaPoco的T4模板就讀不到了……
還有,oracle官網最新的版本已經是12.1.0.2.4了,nuget上的版本貌似還沒更新。