本是做一个小工具,需要连接ORACLE数据库(小工具是基于.net Framework 4.5框架 开发的)。
最初是使用Oracle.DataAccess.dll来访问数据库,但在随后使用中发现服务器安装的oracle客户端既有32位的又有64位的而且版本也不一定一致,就导致连接数据库各种问题,但使用Oracle.ManagedDataAccess就可以忽略客户端是多少位的甚至可以不要客户端。
连接数据库
使用Oracle.ManagedDataAccess连接数据库,首先当然是先引用Oracle.ManagedDataAccess.dll了。
引用Oracle.ManagedDataAccess.dll,使用方式同ADO.NET区别不大。调试运行提示:“OracleInternal.MTS.PSPEManager”的类型初始值设定项引发异常。
各种搜索发现缺少一个Oracle.ManagedDataAccess.EntityFramework.DLL的引用。
本机调试正常,程序独立运行正常,拷贝到服务器上运行又出现问题。
The type initializer for ‘OracleInternal.MTS.DTCPSPEManager’ threw an exception.
又是一通搜索直到看到这两个帖子,突然有点恍然大明白了。
https://stackoverflow.com/questions/30961508/oracleinternal-mts-dtcpspemanager-error
https://blog.csdn.net/pmy_c_l/article/details/78202606
因为程序连接oracle用的是Oracle.ManagedDataAccess.Client,程序运行时需要调用Oracle.ManagedDataAccessDTC.dll,但是这个程序集又不需要显示调用,仅需要把Oracle.ManagedDataAccessDTC.dll放到程序运行目录下(注意区分64位和32位)。
示例
App.config中配置连接字符串。
<add name="xxx" connectionString="user id=xxx;password=xxx;data source=8.8.8.8:1521/orcl; Pooling=false;"/>
引用:Oracle.ManagedDataAccess.Client
using Oracle.ManagedDataAccess.Client;
程序中连接Oracle查询数据。(此处基本大同小异)
private string connString = ConfigurationManager.ConnectionStrings["xxx"].ToString();//获取连接字符串
private void button1_Click(object sender, EventArgs e)
{
OracleConnection con = new OracleConnection(connString);//实例化
con.ConnectionString = connString;
con.Open();//建立连接,打开数据库
OracleCommand cmd = con.CreateCommand();// 创建数据库对象
cmd.CommandText = "select * from log";
OracleDataReader reader = cmd.ExecuteReader();
while (reader.Read())//读取每行数据
{
MessageBox.Show("txt: " + reader.GetString(0));
}
}
最终程序其实用到了三个DLL,写于此一来留以备用,而来为后来的小伙伴们少走弯路。
dll下载地址:https://download.csdn.net/download/a137185067/11069474
有些朋友加载了对应的DLL后还是提示错误可能是缺少了运行时库,下载一个vcredist.exe安装后试试。
vcredist_x64下载地址:https://download.csdn.net/download/a137185067/11236926