成人午夜激情影院,小视频免费在线观看,国产精品夜夜嗨,欧美日韩精品一区二区在线播放

當前位置:首頁>>開發編程>>VS.NET>>新聞內容
通過.NET訪問Oracle數據庫
作者:破寶(percyboy) 發布時間:2004-8-13 13:24:00 文章來源:博客堂

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

1。System.Data.OracleClient 和 System.Data.OleDb 命名空間

  雖然通過這兩個命名空間的類都可以訪問 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 (數據提供程序)。

2。數據庫連接:

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

System Requirements:

  (1)如用 System.Data.OracleClient 訪問 Oracle,客戶端組件版本應在 Oracle 8i Client Release 3 (8.1.7)以上版本。MS 只確保訪問 Oracle 8.1.6、Oracle 8.1.7、Oracle 9i 服務器時的情況。MDAC 2.6 以上。

  (2)如用 System.Data.OleDb 訪問 Oracle,客戶端組件版本 7.3.3.4.0 以上或 8.1.7.4.1 以上。MDAC 2.6 以上。

  如服務器為 Oracle8i 以上,客戶端組件版本應為 8.0.4.1.1c。

  在 .NET 運行的機器中,安裝 Oracle 客戶端,然后打開 Net Manager (Oracle 9i) / Easy Config (Oracle 8i) 按你以前的經驗設置本地服務的映射(這里的服務名將用于數據庫連接串)。

  System.Data.OracleClient 中訪問 Oracle 數據庫的連接串是:

User ID=用戶名; Password=密碼; Data Source=服務名

  (上述為一般的連接串,詳細的連接串項目可以在 System.Data.OracleClient.OracleConnection.ConnectionString 屬性的文檔中找到。)

  System.Data.OleDb 中的訪問 Oracle 數據庫的連接串是:

Provider=MSDAORA.1; User ID=用戶名; Password=密碼; Data Source=服務名

3。Oracle 中的數據類型:

  Oracle 的數據類型和 SQL Server 相比,要“奇怪”一些:SQL Server 的大多數據類型很容易找到 .NET 中比較接近的類型,Oracle 中的類型就離 .NET 類型遠了許多,畢竟 Oracle 是和 Java 親近的數據庫。

  • number: 數字類型,一般是 Number(M,N),M是有效數字,N是小數點后的位數(默認0),這個是按十進制說的。
  • nvarchar2: 可變長字符型(Unicode),這個比較像 SQL Server 的 nvarchar(但不知 Oracle 為什么加了個“2”)。(去掉“n”為非 Unicode 的,下同。)
  • nchar: 定長字符型(Unicode)。
  • nclob: “寫作文”的字段,存儲大量字符(Unicode)時用。
  • date: 日期類型,比較接近 SQL Server 的 datetime。

  Oracle 中字段不能是 bit 或者 bool 之類的類型,一般是 number(1) 代替的。

  和 SQL Server 一樣在 SQL 命令中,字符類型需要用單引號(')隔開,兩個單引號('')是單引號的字符轉義(比如: I'm fat. 寫入一個 SQL 命令是: UPDATE ... SET ...='I''m fat.' ...)。

  比較特殊的是日期類型:比如要寫入 2004-7-20 15:20:07 這個時刻需要如下寫:

UPDATE ... SET ... = TIMESTAMP '2004-7-20 15:20:07' ...

注意這里使用了 TIMESTAMP 關鍵字,并使用單引號隔開;另外請注意日期格式,上面的格式是可識別的,Oracle 識別的格式沒有 SQL Server 那般多。這是和 SQL Server 不同的地方。

順便提一句:Access 中的日期類型是用井號(#)隔開的,UPDATE ... SET ... = #2004-7-20 15:20:07# ...

4。訪問 Oracle 過程/函數(1)

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

.NET 訪問 Oracle 過程/函數的方法很類似于 SQL Server,例如:

OracleParameter[] parameters = {
    new OracleParameter("ReturnValue", OracleType.Int32, 0, ParameterDirection.ReturnValue, true, 0, 0, "",
         DataRowVersion.Default, Convert.DBNull )
    new OracleParameter("參數1", OracleType.NVarChar, 10),
    new OracleParameter("參數2",  OracleType.DateTime),
    new OracleParameter("參數3",  OracleType.Number, 1)
 };

parameters[1].Value = "test";
parameters[2].Value = DateTime.Now;
parameters[3].Value = 1;                        // 也可以是 new OracleNumber(1);

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[0].Value; //接收函數返回值
connection.Close();

  Parameter 的 DbType 設定請參見 System.Data.OracleClient.OracleType 枚舉的文檔,比如:Oracle 數據庫中 Number 類型的參數的值可以用 .NET decimal 或 System.Data.OracleClient.OracleNumber 類型指定; Integer 類型的參數的值可以用 .NET int 或 OracleNumber 類型指定。等等。

  上面例子中已經看到函數返回值是用名為“ReturnValue”的參數指定的,該參數為 ParameterDirection.ReturnValue 的參數。

5。訪問 Oracle 過程/函數 (2)

  不返回記錄集(沒有 SELECT 輸出)的過程/函數,調用起來和 SQL Server 較為類似。但如果想通過過程/函數返回記錄集,在 Oracle 中就比較麻煩一些了。

在 SQL Server 中,如下的存儲過程:

CREATE PROCEDURE GetCategoryBooks
(
    @CategoryID int
)
AS
SELECT * FROM Books
WHERE CategoryID = @CategoryID
GO

  在 Oracle 中,請按以下步驟操作:

(1)創建一個包,含有一個游標類型:(一個數據庫中只需作一次)

CREATE OR REPLACE PACKAGE Test
  AS
       TYPE Test_CURSOR IS REF CURSOR;
END Test;

(2)過程:

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;

(3).NET 程序中:

OracleParameters parameters = {
     new OracleParameter("p_CURSOR", OracleType.CURSOR, 2000, ParameterDirection.Output, true, 0, 0, "",
          DataRowVersion.Default, Convert.DBNull),
     new OracleParameter("p_CatogoryID", OracleType.Int32)
};

parameters[1].Value = 22;

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 關閉之前,程序無法訪問輸出參數和返回值的數據。

  好了,先這些,總之 .NET 訪問 Oracle 還是有很多地方和 SQL Server 不同的,慢慢學習了。


最新更新
·C#中使用Split分隔字符串的技
·VS2008開發中Windows Mobile
·PC機和移動設備上絕對路徑的
·C#程序加殼的方法(使用Sixx
·當前上下文中不存在名稱Conf
·請插入磁盤:Visual Studio 2
·用VS.NET讀取Flash格式文件信
·在ASP.NET中使用AJAX的簡單方
·VS.NET 2005中常用的一些代碼
·安裝VS.NET 2005 SP1補丁全攻
相關信息
·.Net 中讀寫Oracle數據庫的兩種方式
畫心
愚愛
偏愛
火苗
白狐
畫沙
犯錯
歌曲
傳奇
稻香
小酒窩
獅子座
小情歌
全是愛
棉花糖
海豚音
我相信
甩蔥歌
這叫愛
shero
走天涯
琉璃月
Nobody
我愛他
套馬桿
愛是你我
最后一次
少女時代
灰色頭像
斷橋殘雪
美了美了
狼的誘惑
我很快樂
星月神話
心痛2009
愛丫愛丫
半城煙沙
旗開得勝
郎的誘惑
愛情買賣
2010等你來
我叫小沈陽
i miss you
姑娘我愛你
我們都一樣
其實很寂寞
我愛雨夜花
變心的玫瑰
犀利哥之歌
你是我的眼
你是我的OK繃
貝多芬的悲傷
哥只是個傳說
丟了幸福的豬
找個人來愛我
要嫁就嫁灰太狼
如果這就是愛情
我們沒有在一起
寂寞在唱什么歌
斯琴高麗的傷心
別在我離開之前離開
不是因為寂寞才想你
愛上你等于愛上了錯
在心里從此永遠有個你
一個人的寂寞兩個人的錯
主站蜘蛛池模板: 双桥区| 大英县| 金湖县| 呼图壁县| 合川市| 怀宁县| 乐陵市| 南部县| 永平县| 徐闻县| 岳阳县| 新余市| 潜山县| 卓尼县| 淮滨县| 堆龙德庆县| 芷江| 永城市| 贡嘎县| 静安区| 丹江口市| 运城市| 株洲市| 靖远县| 和龙市| 吉安县| 丰顺县| 义马市| 扶绥县| 广河县| 麻城市| 邛崃市| 新泰市| 甘泉县| 二连浩特市| 新建县| 铜梁县| 黄大仙区| 盐源县| 门头沟区| 汉寿县|