1. 程式人生 > 其它 >Oracle 免費的資料庫--Database 快捷版 11g 安裝使用與SOD框架對Oracle的CodeFirst支援

Oracle 免費的資料庫--Database 快捷版 11g 安裝使用與SOD框架對Oracle的CodeFirst支援

一、Oracle XE 資料庫與連線工具安裝使用

Oracle資料庫歷來以價格昂貴出名,當然貴有貴的道理,成為一個Oracle DBA也是令人羨慕的事情,如果程式設計師熟悉Oracle使用也有機會接觸到大型的專案,但是Oracle似乎對一般程式設計師不怎麼友好,因為其繁瑣的安裝配置過程和對系統硬體的苛求,另一般人望而止步,我最早從Oracle 9i開始接觸它,深有感受,特別是熟悉了SqlServer的開發人員,初次接觸Oracle還是很不習慣的。比如它沒有SqlServer資料“庫”的概念,一個sa賬號管理很多資料庫,在Oracle裡面,它叫做“資料服務”,通過不同的資料庫使用者來區分資料。

1.1 資料庫服務安裝

現在,Oracle推出了一個免費的資料庫產品,Database 快捷版 11g ,這個就像SqlServer Express版本一樣,都是免費的,與收費版在功能沒有任何區別,但是有些使用條件限制,比如僅支援一個CPU,資料檔案組大小有限制等,但是一般中小企業的一些中小應用還是夠了。Database 快捷版 11g下載地址請點選這裡。不過下載之前要先註冊Oracle賬號,並同意下載許可宣告。

適用於 Windows x64 的 Oracle Database 快捷版 11g 第 2 版

- 解壓縮下載檔案,然後執行 DISK1/setup.exe

適用於 Windows x32 的 Oracle Database 快捷版 11g 第 2 版

- 解壓縮下載檔案,然後執行 DISK1/setup.exe

適用於 Linux x64 的 Oracle Database 快捷版 11g 第 2 版 - 解壓縮下載檔案,可以像往常一樣安裝 RPM 檔案

根據你的情況,選擇下載32位的或者64位的,我下載了64位的,安裝很簡單,中途沒有什麼特別注意的地方,一路“下一步” 即可,這比起Oracle其他版本的資料庫安裝來說,實在很簡單,安裝完成後,即可使用了,不過千萬記住不要忘記了Sys,System 使用者的密碼。安裝完成之後,在桌面會有一個快捷方式:Oracle Database 11g Express Edition 入門 ,單擊,進入Web的管理介面:

如果要檢視其它介面,需要輸入管理員密碼,比如檢視儲存的介面:

如果要進行建立資料庫使用者,建表等操作,還得啟動SQL plus 程式,不用做額外的配置,可以直接啟動,這相比收費版,又簡單了不少:

具體建立使用者,建立表的工作,可以使用Oracle的SQL語句來做,但我們這裡通過另外一個工具來做,還是在之前的Oracle XE 下載頁面:

Oracle SQL Developer

Oracle SQL Developer Data Modeler

Oracle Application Express

針對 Java 開發人員的 JDeveloper

Oracle Developer Tools for Visual Studio .NET

Zend Server

到這裡下載一個最新版本的Oracle VS外掛,有好幾個版本,下載最上面的就好了,不過下載一樣需要Oracle使用者賬號。

1.2 Oracle VS外掛安裝使用

安裝這個外掛的時候,注意安裝提示,首先管理員賬號Sys和密碼,然後是要連線的Oracle服務名,輸入相關的服務名,這裡預設是 XE,然後儲存為一個TNS名字,我用的是mydb,最後還有一個ODP.Net的安裝,詢問是否安裝程式集到GAC,這裡選擇安裝。

安裝好後,在VS的“伺服器資源管理器”--》“資料連線”,新建一個連線:

在圖例中,我們選擇以SysDba的角色進行登入,之後,就可以建立使用者,查詢表和編輯資料了,很方便,這裡我建立了一個名字為SOD的使用者,然後用這個使用者登入:

功能很多,具體內容留給大家去研究了。不過從這裡新增的使用者不太方便設定成DBA角色,還是用命令列來設定。

至此,Oracle XE 的資料服務和開發工具外掛,基本上安裝好了。

1.3 PDF.NET整合開發工具連線Oracle

不過,我們也可以使用SOD框架的整合開發工具來連線,該工具連線過程如下:

最後點選確定,回到下面的介面,展開XE資料庫,選擇資料表,右鍵選單查詢資料:

至此,Oracle 的安裝,連線過程就完成了,很簡單。

二、SOD框架的Oracle CodeFirst支援

SOD框架是PDF.NET開發框架的資料框架,目前已經支援了SqlServer,SqlServerCe,Access,MySQL,PostgreSQL等主流資料庫的Code First,但PDF.NET_SOD Ver 5.2.1.0307 還未實現Oracle的Code First支援,主要原因是我對 Oracle 目前使用較少,如果不是SOD會員使用者的強烈要求,可能SOD對Oracle Code First支援還要往後推延一段時間。

2.1 Oracle自增列處理

實際上SOD框架對Oracle Code First的支援並不複雜,主要需要解決的問題就是Oracle資料庫自增欄位的處理,大部分情況下,這都是通過觸發器來實現的。

改寫下 EntityCommand 類的建立表的方法,新增Oracle的處理:

 public string CreateTableCommand
        {
            get {
                if (_createTableCommand == null)
                {
                    string script = @"
CREATE TABLE @TABLENAME(
@FIELDS
)
";

                    if (this.currDb.CurrentDBMSType == PWMIS.Common.DBMSType.PostgreSQL && !string.IsNullOrEmpty(currEntity.IdentityName))
                    {
                        string seq =
                            "CREATE SEQUENCE " + currEntity.TableName + "_" + currEntity.IdentityName + "_" + "seq INCREMENT 1 MINVALUE 1 MAXVALUE 9223372036854775807 START 1 CACHE 1;";

                        script = seq + script;
                    }
                    else if (this.currDb.CurrentDBMSType == PWMIS.Common.DBMSType.Oracle && !string.IsNullOrEmpty(currEntity.IdentityName))
                    {
                        // --; 語句分割符號
                        string seqTemp = @"

CREATE SEQUENCE @TableName_@IDName_SEQ MINVALUE 1 NOMAXVALUE INCREMENT BY 1 START WITH 1 NOCACHE
;--

CREATE OR REPLACE TRIGGER @TableName_INS_TRG BEFORE
  INSERT ON [@TableName] FOR EACH ROW WHEN(new.[@IDName] IS NULL)
BEGIN
  SELECT @TableName_@IDName_SEQ.NEXTVAL INTO :new.[@IDName] FROM DUAL; 
END;
;--
";
                        script = script + ";--rn" + seqTemp.Replace("@TableName", currEntity.TableName).Replace("@IDName", currEntity.IdentityName);
                    }

                    var entityFields = EntityFieldsCache.Item(this.currEntity.GetType());
                    string fieldsText = "";
                    foreach (string field in this.currEntity.PropertyNames)
                    {
                        string columnScript =entityFields.CreateTableColumnScript(this.currDb as AdoHelper, this.currEntity, field);
                        fieldsText = fieldsText + "," + columnScript+"rn";
                    }
                    string tableName =this.currDb.GetPreparedSQL("["+ currTableName+"]");
                    _createTableCommand = script.Replace("@TABLENAME", tableName).Replace("@FIELDS", fieldsText.Substring(1));
                }
                return _createTableCommand;
            }
        }

2.2 SOD Oracle Code First實現過程

由於Oracle 資料庫的欄位型別名稱,對應DbType的名字並不完全相符,所以需要對AdoHelper類的Oracle實現類稍加修改:

public class Oracle : AdoHelper
{
  //其它略
        public override string GetNativeDbTypeName(IDataParameter para)
        {
            OracleParameter oraPara = (OracleParameter)para;
            OracleType oraType = oraPara.OracleType;
            if (oraType == OracleType.DateTime)
                return "Date";
            else if (oraType == OracleType.Int32)
                return "INT";
            else
                return oraType.ToString();
           
        }
}

能夠根據實體類,得到生成表的建表指令碼,任務已經完成了一半,不過SOD提供了一個DbContext類的封裝,可以自動完成這個過程,下面就來實現一個Oracle的DbContext:

namespace PWMIS.Core.Extensions
{
    public abstract class OracleDbContext :DbContext
    {
        /// <summary>
        /// 用連線字串名字初始化本類
        /// </summary>
        /// <param name="connName"></param>
        public OracleDbContext(string connName)
            : base(connName)
        { 
        
        }
        /// <summary>
        /// 檢查實體類對應的資料表是否在資料庫中存在
        /// </summary>
        protected override void CheckTableExists<T>()
        {
            //建立表
            if (CurrentDataBase.CurrentDBMSType == PWMIS.Common.DBMSType.Oracle)
            {
                var entity = new T();
                var dsScheme = CurrentDataBase.GetSchema("Tables", null);
                string owner = CurrentDataBase.ConnectionUserID;
                var rows = dsScheme.Select("OWNER='"+ owner +"' and table_name='" + entity.GetTableName() + "'");
                if (rows.Length == 0)
                {
                    EntityCommand ecmd = new EntityCommand(entity, CurrentDataBase);
                    string sql = ecmd.CreateTableCommand;
                    //OracleClient 不能批量執行多條SQL語句
                    string[] sqlArr = sql.Split(new string[] {";--" }, StringSplitOptions.RemoveEmptyEntries);
                    foreach (string item in sqlArr)
                    {
                        if(item.Length >10) //去除回車行
                            CurrentDataBase.ExecuteNonQuery(item);
                    }
                   
                }
            }
        }
    }
}

2.3 Code First 使用示例

將SOD框架原始碼的 SampleORMTest 測試專案的LocalDbContext 的程式碼稍加修改:

namespace SampleORMTest
{
    /// <summary>
    /// 用來測試的本地SqlServer 資料庫上下文類
    /// </summary>
    public class LocalDbContext : DbContext  //OracleDbContext, SqlServerDbContext 會根據 local連線字串自動決定內部使用
    {
        public LocalDbContext()
            : base("local")
        {
            //local 是連線字串名字
        }

        #region 父類抽象方法的實現

        protected override bool CheckAllTableExists()
        {
            //建立使用者表
            CheckTableExists<User>();
            return true;
        }

        #endregion
    }
}

只需要在OracleDbContext 實現類的CheckAllTableExists 方法內,實現各個實體類的表建立工作即可,比如本例建立使用者表。

修改下App.config 檔案的連線配置:

<connectionStrings>
    <!--<add name="local" connectionString="Data Source=.;Initial Catalog=LocalDB;Integrated Security=True" providerName="SqlServer" />-->
    <!--下面的配置適應於 Oracle.Client-->
    <add name="local" connectionString="Data Source=XE;User Id=SOD;Password=sod123;Integrated Security=no;" providerName="Oracle" />
 </connectionStrings>

然後,像下面這樣使用,即可自動建立資料庫和表,並且新增一條初始資料:

LocalDbContext context = new LocalDbContext();//自動建立表
User zhang_san = new User() { Name = "zhang san", Pwd = "123" };
            count += context.Add<User>(zhang_san);//採用 DbContext 方式插入資料

當然插入資料的方式很多,具體請看本文提供的原始碼下載。

最後,像下面這樣使用查詢即可:

User user = new User(){  Name="zhang san";};
OQL q=OQL.From(user)
  .Select()
  .Where(user.Name)
.END;
List<User> users = EntityQuery<User>.QueryList(OQL);

這種方式適合簡單的相等條件查詢,如果需要複雜的條件,可以修改成下面這個樣子:

User user = new User();
OQL q = OQL.From(user)
              .Select()
              .Where(cmp => cmp.Comparer(user.Name, "=", "zhang san") )
            .END;
List<User> users = EntityQuery<User>.QueryList(q);

示例程式碼中的 可以修改成 >,<,like 等SQL支援的比較符號。

如果需要更多條件,可以使用 &表示SQL的AND,| 表示 SQL的OR 邏輯關係,比如:

User user = new User();
 OQL q = OQL.From(user)
               .Select()
               .Where(cmp => cmp.Comparer(user.Name, "=", "zhang san")  &
                             cmp.Comparer(user.Pwd, "=", "123")  )
             .END;

這樣,一個簡單的ORM使用例項就做好了。上面這段ORM例子,不僅僅適用於Oracle,使用在其它資料庫都是可以得,只需要修改 連線字串配置的 providerName和 connectionString 即可,比如 privideName="SqlServer"

三、使用ODP.Net 訪問Oracle資料庫

3.1 建立SOD的ODP.Net擴充套件程式集

在本文中,已經說到安裝了Oracle 的.net資料訪問元件ODP.Net,MS也建議用這個元件來代替MS自己的Oracle.Client,下面,我們只需要新建立一個專案,引用下ODP.Net元件即可:

把SOD框架的核心程式集PWMIS.Core 的Oracle.cs 檔案拷貝下來,只需要修改下名稱空間即可使用。

編譯這個專案,讓SampleORMTest 測試專案引用它,或者直接拷貝DLL到測試專案,

3.2 執行32位的ODP.Net

重新修改下App.config檔案的連線配置:

<add name="local" connectionString="Data Source=XE;User Id=SOD;Password=sod123" 
         providerName="PWMIS.DataProvider.Data.OracleDataAccess.Oracle,PWMIS.OracleClient" />

執行專案,首先丟擲下面這樣一個異常:

其他資訊: 未能載入檔案或程式集“Oracle.DataAccess, Version=2.121.2.0, Culture=neutral, PublicKeyToken=89b483f429c47342”或它的某一個依賴項。試圖載入格式不正確的程式。

第一反應,應該是32位於6位程式不相容的問題,仔細回想下,這可能是 Oracle VS外掛安裝時候安裝到GAC裡面的程式集。於是將測試程式修改成32位的(編譯目標為x86),執行良久,再次報錯,說TNS無法解析。 奇怪,使用MS Oracle Client都沒有問題,為何用了ODP.Net缺不行了呢?百度了下,但覺得別人說的跟我當前不太一樣。

檢查Oracle的VS外掛程式的安裝目錄,在 E:appclientdthproduct12.1.0client_1NetworkAdmin 目錄中發現TSN配置檔案 tnsnames.ora ,開啟,原來是這樣的內容:

mydb =
   (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = XE) 
    )
  )

分析內容,這應該是安裝VS外掛的時候,配置生成的。 那麼原來的XE服務的監聽名字是怎麼來的? 在搜尋下Oracle服務的安裝目錄,在 E:oraclexeapporacleproduct11.2.0servernetworkADMIN 下面找到了 tnsnames.ora 檔案,開啟:

XE =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = dth-home)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = XE)
    )
  )

EXTPROC_CONNECTION_DATA =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1))
    )
    (CONNECT_DATA =
      (SID = PLSExtProc)
      (PRESENTATION = RO)
    )
  )

ORACLR_CONNECTION_DATA = 
  (DESCRIPTION = 
    (ADDRESS_LIST = 
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1)) 
    ) 
    (CONNECT_DATA = 
      (SID = CLRExtProc) 
      (PRESENTATION = RO) 
    ) 
  ) 

原來預設的Oracle XE 監聽服務名是這樣定義的。

重新配置連線,將服務名從XE更改為mydb,順利通過。

<add name="local" connectionString="Data Source=mydb;User Id=SOD;Password=sod123" 
 providerName="PWMIS.DataProvider.Data.OracleDataAccess.Oracle,PWMIS.OracleClient" />

如果不配置mydb這個TNS名字,可否直接使用呢?答案是可以,只需要將連線字串做如下修改即可:

 <add name="local" connectionString="Data Source=(DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = XE) 
    )
  );User Id=SOD;Password=sod123"
        providerName="PWMIS.DataProvider.Data.OracleDataAccess.Oracle,PWMIS.OracleClient" />

測試執行,成功,可惜目前為止,還是基於32位的ODP.Net做的測試。

3.3 64位ODP.Net 使用

回憶之前安裝XE資料庫服務,確認當時安裝的是64位的資料庫,那麼去它的安裝目錄,看看有沒有ODP,一看,果然有: E:oraclexeapporacleproduct11.2.0serverodp.netbin2.x 這裡的 Oracle.DataAccess.dll 是64位的。 將它拷貝到SOD框架下面,再執行,終於看到了成功介面:

四、免安裝Oracle客戶端,使用ODP.Net

前面使用ODP.Net的過程,都是在本地機器安裝了Oracle XE資料庫和Oracle VS 開發外掛的情況下進行的,但是,如果把訪問Oracle的程式部署到一臺沒有裝過Oracle程式的機器上,程式是無法使用的,這還得做下Oracle 環境的部署,過程如下:

4.1,下載ODAC

開啟下面的連結:

http://www.oracle.com/technetwork/topics/dotnet/downloads/index-2235287.html?ssSourceSiteId=otncn

這裡提供了2種下載安裝方式,前一種,Oracle Universal Installer安裝包比較大,略過,我們選擇第二種,XCopy方式來部署。

根據你的需要,下載32位或者 64位的ODAC,並且下載 ODP.Net ,Managed Driver.

4.2,安裝ODAC

比如我下載的是 64位的ODAC,以管理員許可權啟動命令列

第一步,輸入下面的命令:

install.bat all c:oracle odac

這裡表示將Oracle客戶端程式複製到 c:oracle 目錄下面

第二步,安裝ODP.Net,輸入下面的命令:

install_odpm.bat c:oracle x64 true

注意:c:oracle目錄是第一步命令裡面指定的路徑。

第三步,關鍵,在系統環境變數裡面,Path變數裡面,包含Oracle程式的路徑:

c:oracle;c:oraclebin;

這樣設定以後,本文的Oracle訪問程式,就可以正常運行了。

五、獲取Oracle SOD Code First支援

當前程式的全部程式碼已經簽入SOD框架的開源專案,地址 http://pwmis.codeplex.com ,你在原始碼欄目可以檢視到當前最新的更改,如果你有codeplex賬號,可以直接連線TFS下載,如果沒有,可以用SVN下載,獨立下載包,

Oracle_ORM_Sample

PDFNetTools20150324

下載說明,請看 https://pwmis.codeplex.com/releases/view/612310

如果你們有Oracle伺服器,但不再本地機器,可能需要單獨下載ODP並安裝, 64位程式下載地址:http://www.oracle.com/technetwork/database/windows/downloads/index-090165.html

SOD框架開發團隊一直致力於廣大程式設計師的CRUD解放工作,打造最輕,最方便而又靈活的資料開發框架,感謝你的支援!

歡迎加入SOD開發者團隊,更多詳細資訊,請看框架官網 http://www.pwmis.com/sqlmap