通过odp.net方式连接Oracle数据库

时间:2021-11-11 13:12:40

问题描述:
先说下基本开发环境:在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数据库
在网上我又找了好多方法都没有解决,只好采用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

}
}