1 常用數(shù)據(jù)庫訪問類
一般來說,C#連接Oracle數(shù)據(jù)庫,我們通常會通過封裝好的dll調(diào)用,目前常用的有三個:
(1)System.Data.OracleClient.dll(微軟)
(2)Oracle.DataAccess.Client.dll(Oracle,也稱ODP.NET)
(3)Oracle.ManagedDataAccess.dll(Oracle)
1.1 System.Data.OracleClient.dll
首先需安裝Oracle客戶端,然后可直接直接引用微軟的System.Data.OracleClient,但VS會提示“System.Data.OracleClient.OracleConnection”已過時。經(jīng)測試雖然提示過時但仍可正常使用,微軟已經(jīng)很久沒有更新過這個訪問類了,安全性方面無保障。
1.2 Oracle.DataAccess.Client.dll
Oracle提供的數(shù)據(jù)庫訪問類庫,簡稱ODP.NET,其功能和效率上都有所保證,訪問效率和速度都要比微軟的System.Data.OracleClient優(yōu)秀。
優(yōu)點:
(1)無需安裝Oracle客戶端,程序也能訪問服務(wù)器上的Oracle
(2)不需要配置tnsnames.ora文件
缺點:
(1)要區(qū)分用區(qū)分x86/x64版本
1.3 Oracle.ManagedDataAccess.dll
推薦這一種,Oracle官方出品,日常更新維護,無需安裝Oracle客戶端,不用區(qū)分操作系統(tǒng)位數(shù)。

2 踩過的坑
2.1 從System.Data.OracleClient到Oracle.ManagedDataAccess
一般來講,我們會把數(shù)據(jù)庫的連接信息寫在config文件中,通過System.Configuration.dll讀取,然后執(zhí)行操作。
<!--tnsnames.ora中的服務(wù)名-->
xxx =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = x.xx.xx.xxx)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = orcl)
)
)
<!--System.Data.OracleClient的數(shù)據(jù)庫鏈接-->
<connectionStrings>
<add name="OracleConn" connectionString="Data Source=xxx(tnsnames.ora中配置的服務(wù)名);User ID=xxx;Password=xxx"/>
</connectionStrings>
/// <summary>
/// 獲取Oracle連接字符串
/// </summary>
public class PubConstant
{
public static string GetOracleConString(string conval)
{
string connectionString = ConfigurationManager.ConnectionStrings[conval].ToString();
return connectionString;
}
}
//從config文件里面獲取數(shù)據(jù)庫連接信息
private static readonly string connectionString = PubConstant.GetOracleConString("OracleConn");
/// <summary>
/// 執(zhí)行參數(shù)化查詢語句,返回DataSet
/// </summary>
public DataSet QueryByCSH(string SQLString, string cphm, string dlyszh)
{
using (OracleConnection connection = new OracleConnection(connectionString))
{
DataSet ds = new DataSet();
try
{
connection.Open();
OracleDataAdapter command = new OracleDataAdapter(SQLString, connection);
command.SelectCommand.Parameters.Add(":cphm", cphm);
command.SelectCommand.Parameters.Add(":dlyszh", dlyszh);
command.Fill(ds, "ds");
}
catch (OracleException ex)
{
throw new Exception(ex.Message);
}
finally
{
connection.Close();
}
return ds;
}
}
經(jīng)過上面的一些列操作之后發(fā)現(xiàn),每次在connection.Open()出都會報“無法識別連接字符串”的異常,已安裝Oracle客戶端,數(shù)據(jù)庫服務(wù)器IP、端口、用戶名、密碼都正確,百度了好久沒有結(jié)果。
2.2 從連接服務(wù)名到連接字符串
終于,無意間看見一篇名為“C#使用Oracle.ManagedDataAccess.dll”的文章,于是將連接服務(wù)名改為了連接字符串,結(jié)果成功打開數(shù)據(jù)庫連接。
<!--Oracle.ManagedDataAccess的數(shù)據(jù)庫鏈接-->
<connectionStrings>
<add name="OracleConn" connectionString="Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=x.xx.xx.xxx)(PORT=1521)))(CONNECT_DATA=(SERVICE_NAME=orcl)));User ID=xxx;Password=xxx"/>
</connectionStrings>
至此,記錄下了我使用Oracle.ManagedDataAccess.dll遇到的問題,希望能給小伙伴們提供一點幫助!
參考鏈接:點擊前往