SystemDataOracleClient 和 SystemDataOleDb 命名空間 雖然通過這兩個命名空間的類都可以訪問 Oracle 數據庫
但和 SQL Server 類似的(System
Data
SqlClient 命名空間的類效率要比 System
Data
OleDb 命名空間中的類高一些)
System
Data
OracleClient 命名空間中的類要比 System
Data
OleDb 命名空間的類效率高一些(這一點我沒有親自驗證
但大多數地方都會這麼說
而且既然專門為 Oracle 作的東西理論上也應該專門作過針對性的優化)
當然還有另一點就是從針對性上說
System
Data
OracleClient 要更好一些
比如數據類型
System
Data
OleDb
OleDbType 枚舉中所列的就沒有 System
Data
OracleClient
OracleType 枚舉中的那些有針對性
另外
Oracle 的 Number 類型如果數字巨大
超出
NET 數據類型范圍的情況中
就必須使用 System
Data
OracleClient 中的專門類
OracleNumber 類型
好了
不再贅述這兩個的比較
下面主要討論 System
Data
OracleClient 命名空間中的類型
即 ADO
NET for Oracle Data Provider (數據提供程序)
數據庫連接 無論是 System
Data
OleDb 還是 System
Data
OracleClient 訪問 Oracle 都需要在
NET 運行的機器(ASP
NET 中就是 Web 服務器)安裝 Oracle 客戶端組件
(這一點是和 MS 的兩種數據庫不同的
MS 的東西安裝 MDAC: Microsoft Data Access Component
以上版本後
就無須再安裝 SQL Server 客戶端或者 Office 軟件
就能訪問
)
System Requirements
(
)如用 System
Data
OracleClient 訪問 Oracle
客戶端組件版本應在 Oracle
i Client Release
(
)以上版本
MS 只確保訪問 Oracle
Oracle
Oracle
i 服務器時的情況
MDAC
以上
(
)如用 System
Data
OleDb 訪問 Oracle
客戶端組件版本
以上或
以上
MDAC
以上
如服務器為 Oracle
i 以上
客戶端組件版本應為
c
在
NET 運行的機器中
安裝 Oracle 客戶端
然後打開 Net Manager (Oracle
i) / Easy Config (Oracle
i) 按你以前的經驗設置本地服務的映射(這裡的服務名將用於數據庫連接串)
System
Data
OracleClient 中訪問 Oracle 數據庫的連接串是
User ID=用戶名; Password=密碼; Data Source=服務名
(上述為一般的連接串
詳細的連接串項目可以在 System
Data
OracleClient
OracleConnection
ConnectionString 屬性的文檔中找到
)
System
Data
OleDb 中的訪問 Oracle 數據庫的連接串是
Provider=MSDAORA
; User ID=用戶名; Password=密碼; Data Source=服務名
Oracle 中的數據類型 Oracle 的數據類型和 SQL Server 相比
要
奇怪
一些
SQL Server 的大多數據類型很容易找到
NET 中比較接近的類型
Oracle 中的類型就離
NET 類型遠了許多
畢竟 Oracle 是和 Java 親近的數據庫
number: 數字類型
一般是 Number(M
N)
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 命令中
字符類型需要用單引號(
)隔開
兩個單引號(
)是單引號的字符轉義(比如
I
m fat
寫入一個 SQL 命令是
UPDATE
SET
=
I
m 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
OracleType
Int
ParameterDirection
ReturnValue
true
DataRowVersion
Default
Convert
DBNull )
new OracleParameter(
參數
OracleType
NVarChar
)
new OracleParameter(
參數
OracleType
DateTime)
new OracleParameter(
參數
OracleType
Number
)
};
parameters[
]
Value =
test
;
parameters[
]
Value = DateTime
Now;
parameters[
]
Value =
; // 也可以是 new OracleNumber(
);
OracleConnection connection = new OracleConnection( ConnectionString );
OracleCommand command = new OracleCommand(
函數/程名
connection);
command
CommandType = CommandType
StoredProcedure;
foreach(OracleParameter parameter in parameters)
command
Parameters
Add( parameter );
connection
Open();
command
ExecuteNonQuery();
int returnValue = parameters[
]
Value; //接收函數返回值
connection
Close();
Parameter 的 DbType 設定請參見 System
Data
OracleClient
OracleType 枚舉的文檔
比如
Oracle 數據庫中 Number 類型的參數的值可以用
NET decimal 或 System
Data
OracleClient
OracleNumber 類型指定
Integer 類型的參數的值可以用
NET int 或 OracleNumber 類型指定
等等
上面例子中已經看到函數返回值是用名為
ReturnValue
的參數指定的
該參數為 ParameterDirection
ReturnValue 的參數
訪問 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 Test
Test_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
OracleType
CURSOR
ParameterDirection
Output
true
DataRowVersion
Default
Convert
DBNull)
new OracleParameter(
p_CatogoryID
OracleType
Int
)
};
parameters[
]
Value =
;
OracleConnection connection = new OracleConnection( ConnectionString );
OracleCommand command = new OracleCommand(
GetCategoryBooks
connection);
command
CommandType = CommandType
StoredProcedure;
foreach(OracleParameter parameter in parameters)
command
Parameters
Add( parameter );
connection
Open();
OracleDataReader dr = command
ExecuteReader();
while(dr
Read())
{
// 你的具體操作
這個就不需要我教吧?
}
connection
Close();
另外有一點需要指出的是
如果使用 DataReader 取得了一個記錄集
那麼在 DataReader 關閉之前
程序無法訪問輸出參數和返回值的數據
From:http://tw.wingwit.com/Article/program/Oracle/201311/18128.html