問題描述:
先說下基本開發環境:在winserver2008 r2 上安裝了oracle 32位Client,通過vs2012 新建C# 網站工程連接服務器端的oracle。
連接字符串爲:”Provider=OraOLEDB.Oracle;data source=ccenter;user id=query;password=query”
在調用 constring.Open();時報錯:“未在本地計算機上註冊“OraOLEDB.Oracle”提供程序。”
覺得這個問題很奇葩,我又用vs2012 新建了一個控制檯的C#工程,同樣的連接方式就能成功的連上Oracle Server.
網上也百度提問了一下,給的結果如下:
在網上我又找了好多方法都沒有解決,只好採用odp.net的方式連接數據庫。
在此補充一下,因爲之前連接oracle一直都是安裝好oracle client 之後才能往下連接。
參考地址如下:
http://www.cnblogs.com/yjmyzz/archive/2013/11/01/3400999.html
然後我也寫了一個自己的共通類庫,代碼如下:
using Oracle.ManagedDataAccess.Client;
using System;
using System.Collections.Generic;
using System.Data;
using System.Text;
namespace DataHelp
{
public class ODPOracle
{
#region 類變量
/// <summary>
/// 連接數據庫類
/// </summary>
protected OracleConnection constring;
/// <summary>
/// 連接字符串
/// </summary>
private string strcon = "";
#endregion
#region 構造方法
public ODPOracle()
{
}
public ODPOracle(string constr)
{
strcon = constr;
}
#endregion
#region 打開數據庫連接
/// <summary>
/// 打開數據庫連接
/// </summary>
public void Open()
{
try
{
constring = new OracleConnection(strcon == "" ? System.Configuration.ConfigurationSettings.AppSettings["constrOrcl"] : strcon);
// <add key="constrOrcl" value="Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.0.101)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=dat))));Persist Security Info=True;User ID=userTest;Password=Pass@word*;"/>
constring.Open();
}
catch (Exception ex)
{
LogService.Write("ODP類庫的Open方法發生異常:" + ex.Message);
constring.Dispose();
}
}
#endregion
#region 關閉Oracle數據庫連接
/// <summary>
/// 關閉數據庫連接
/// </summary>
/// <param name="constring"></param>
public void CloseConn()
{
if (constring == null) { return; }
try
{
if (constring.State != ConnectionState.Closed)
{
constring.Close();
}
}
catch (Exception ex)
{
LogService.Write("ODP類庫的CloseConn方法發生異常:" + ex.Message);
}
finally
{
constring.Dispose();
}
}
#endregion
#region 執行SQL語句,返回DataTable
/// <summary>
/// 執行Select語句,返回DataTable
/// </summary>
/// <param name="CmdString">sql語句</param>
/// <returns></returns>
public DataTable GetDateTable(string CmdString)
{
DataTable dt = new DataTable();
Open();
OracleDataAdapter MyDa = new OracleDataAdapter(CmdString, constring);
try
{
MyDa.Fill(dt);
MyDa.Dispose();
CloseConn();
}
catch (Exception ex)
{
LogService.Write("ODPOracle類庫的GetDateTable方法:" + ex.Message);
}
return dt;
}
#endregion
#region 執行sql語句,返回唯一的數據
/// <summary>
/// 執行sql語句,返回唯一的數據,失敗返回0
/// </summary>
/// <param name="sql"></param>
/// <returns></returns>
public string ExecuteSale(string CmdString)
{
OracleCommand myCmd = new OracleCommand();
try
{
Open();
myCmd = new OracleCommand(CmdString, constring);
return myCmd.ExecuteScalar().ToString();
}
catch (System.Exception ex)
{
LogService.Write("ODPOracle類庫的ExecuteSale方法:" + ex.Message);
}
finally
{
myCmd.Dispose();
CloseConn();
}
return "";
}
#endregion
}
}