熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Oracle >> 正文

.NET訪問Oracle數據庫相關

2022-06-13   來源: Oracle 

  長期以來我一直用的是 MS SQL Server / Access 數據庫通過 NET 訪問 MS 自家的東西幾乎沒碰到過什麼麻煩最近項目中要用 Oracle 作為數據庫學習研究了一些 NET 訪問 Oracle 的東西發現問題倒真的不少

SystemDataOracleClient 和 SystemDataOleDb 命名空間

雖然通過這兩個命名空間的類都可以訪問 Oracle 數據庫但和 SQL Server 類似的(SystemDataSqlClient 命名空間的類效率要比 SystemDataOleDb 命名空間中的類高一些)SystemDataOracleClient 命名空間中的類要比 SystemDataOleDb 命名空間的類效率高一些(這一點我沒有親自驗證但大多數地方都會這麼說而且既然專門為 Oracle 作的東西理論上也應該專門作過針對性的優化)
當然還有另一點就是從針對性上說SystemDataOracleClient 要更好一些
比如數據類型SystemDataOleDbOleDbType 枚舉中所列的就沒有SystemDataOracleClientOracleType 枚舉中的那些有針對性另外Oracle 的 Number 類型如果數字巨大超出 NET 數據類型范圍的情況中就必須使用 SystemDataOracleClient 中的專門類  OracleNumber 類型
好了不再贅述這兩個的比較下面主要討論 SystemDataOracleClient 命名空間中的類型即 ADONET for Oracle Data Provider (數據提供程序)

數據庫連接

無論是 SystemDataOleDb 還是 SystemDataOracleClient 訪問 Oracle 都需要在 NET 運行的機器(ASPNET 中就是 Web 服務器)安裝 Oracle 客戶端組件(這一點是和 MS 的兩種數據庫不同的MS 的東西安裝 MDAC: Microsoft Data Access Component  以上版本後就無須再安裝 SQL Server 客戶端或者 Office 軟件就能訪問
System Requirements

()如用 SystemDataOracleClient 訪問 Oracle客戶端組件版本應在 Oracle i Client Release  ()以上版本MS 只確保訪問 Oracle Oracle Oracle i 服務器時的情況MDAC  以上

()如用 SystemDataOleDb 訪問 Oracle客戶端組件版本  以上或  以上MDAC  以上
如服務器為 Oraclei 以上客戶端組件版本應為 c
在 NET 運行的機器中安裝 Oracle 客戶端然後打開 Net Manager (Oracle i) / Easy Config (Oracle i) 按你以前的經驗設置本地服務的映射(這裡的服務名將用於數據庫連接串)
SystemDataOracleClient 中訪問 Oracle 數據庫的連接串是
User ID=用戶名; Password=密碼; Data Source=服務名
(上述為一般的連接串詳細的連接串項目可以在 SystemDataOracleClientOracleConnectionConnectionString 屬性的文檔中找到)
SystemDataOleDb 中的訪問 Oracle 數據庫的連接串是
Provider=MSDAORA; User ID=用戶名; Password=密碼; Data Source=服務名

Oracle 中的數據類型
Oracle 的數據類型和 SQL Server 相比奇怪一些SQL Server 的大多數據類型很容易找到 NET 中比較接近的類型Oracle 中的類型就離 NET 類型遠了許多畢竟 Oracle 是和 Java 親近的數據庫
number: 數字類型一般是 Number(MN)M是有效數字N是小數點後的位數(默認這個是按十進制說的 
nvarchar: 可變長字符型(Unicode)這個比較像 SQL Server 的 nvarchar(但不知 Oracle 為什麼加了個(去掉n為非 Unicode 的下同) 
nchar: 定長字符型(Unicode) 
nclob: 寫作文的字段存儲大量字符(Unicode)時用 
date: 日期類型比較接近 SQL Server 的 datetime
Oracle 中字段不能是 bit 或者 bool 之類的類型一般是 number() 代替的
和 SQL Server 一樣在 SQL 命令中字符類型需要用單引號()隔開兩個單引號()是單引號的字符轉義(比如 Im fat 寫入一個 SQL 命令是 UPDATE  SET =Im fat 
比較特殊的是日期類型比如要寫入  :: 這個時刻需要如下寫
UPDATE  SET  = TIMESTAMP  :: 
注意這裡使用了 TIMESTAMP 關鍵字並使用單引號隔開另外請注意日期格式上面的格式是可識別的Oracle 識別的格式沒有 SQL Server 那般多這是和 SQL Server 不同的地方
順便提一句Access 中的日期類型是用井號(#)隔開的UPDATE  SET  = # ::

訪問 Oracle 過程/函數(
SQL Server 作程序時經常使用存儲過程Oracle 裡也可以使用過程還可以使用函數Oracle 的過程似乎是不能有返回值的有返回值的就是函數了(這點有些像 BASIC函數/過程區分的很細致SQL Server 存儲過程是可以有返回值的)

NET 訪問 Oracle 過程/函數的方法很類似於 SQL Server例如
OracleParameter[] parameters = {
    new OracleParameter(ReturnValue OracleTypeInt  ParameterDirectionReturnValue true   
         DataRowVersionDefault ConvertDBNull )
    new OracleParameter(參數 OracleTypeNVarChar )
    new OracleParameter(參數  OracleTypeDateTime)
    new OracleParameter(參數  OracleTypeNumber )
 };
parameters[]Value = test;
parameters[]Value = DateTimeNow;
parameters[]Value = ;                        // 也可以是 new OracleNumber();
OracleConnection connection = new OracleConnection( ConnectionString );
OracleCommand command = new OracleCommand(函數/程名 connection);
commandCommandType = CommandTypeStoredProcedure;
foreach(OracleParameter parameter in parameters)
     commandParametersAdd( parameter );
connectionOpen();
commandExecuteNonQuery();
int returnValue = parameters[]Value; //接收函數返回值
connectionClose();
Parameter 的 DbType 設定請參見 SystemDataOracleClientOracleType 枚舉的文檔比如Oracle 數據庫中 Number 類型的參數的值可以用 NET decimal 或 SystemDataOracleClientOracleNumber 類型指定 Integer 類型的參數的值可以用 NET int 或 OracleNumber 類型指定等等
上面例子中已經看到函數返回值是用名為ReturnValue的參數指定的該參數為 ParameterDirectionReturnValue 的參數
訪問 Oracle 過程/函數 ()
不返回記錄集(沒有 SELECT 輸出)的過程/函數調用起來和 SQL Server 較為類似但如果想通過過程/函數返回記錄集在 Oracle 中就比較麻煩一些了
在 SQL Server 中如下的存儲過程
CREATE PROCEDURE GetCategoryBooks
(
    @CategoryID int
)
AS
SELECT * FROM Books
WHERE CategoryID = @CategoryID
GO
在 Oracle 中請按以下步驟操作
()創建一個包含有一個游標類型(一個數據庫中只需作一次)
CREATE OR REPLACE PACKAGE Test
  AS
       TYPE Test_CURSOR IS REF CURSOR;
END Test;
()過程
CREATE OR REPLACE PROCEDURE GetCategoryBooks
(
     p_CURSOR out TestTest_CURSOR     這裡是上面包中的類型輸出參數
     p_CatogoryID INTEGER
)
AS
BEGIN
     OPEN p_CURSOR FOR
           SELECT * FROM Books
           WHERE CategoryID=p_CatogoryID;
END GetCategoryBooks;
()NET 程序中
OracleParameters parameters = {
     new OracleParameter(p_CURSOR OracleTypeCURSOR  ParameterDirectionOutput true   
          DataRowVersionDefault ConvertDBNull)
     new OracleParameter(p_CatogoryID OracleTypeInt)
};
parameters[]Value = ;
OracleConnection connection = new OracleConnection( ConnectionString );
OracleCommand command = new OracleCommand(GetCategoryBooks connection);
commandCommandType = CommandTypeStoredProcedure;
foreach(OracleParameter parameter in parameters)
     commandParametersAdd( parameter );
connectionOpen();
OracleDataReader dr = commandExecuteReader();
while(drRead())
{
    // 你的具體操作這個就不需要我教吧?
}
connectionClose();
另外有一點需要指出的是如果使用 DataReader 取得了一個記錄集那麼在 DataReader 關閉之前程序無法訪問輸出參數和返回值的數據


From:http://tw.wingwit.com/Article/program/Oracle/201311/17063.html
  • 上一篇文章:

  • 下一篇文章:
  • 推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.