在刚接触C#的时候由于公司使用的就是Oracle数据库,那么C#怎么连接Oracle数据库就成了首要去掌握的知识点了。在那时没有ODP.NET,但visual studio却对Oralce数据库的调用进行了集成,就是下图中的这个,尽管现在使用这个的时候visual studio提醒过时的,但在那时却是非常好用的。

为什么现在visual studio中这个程序集依然能使用,有ODP.NET,单单要拿出Oracle.ManagedDataAccess.dll进行本文的重点呢?

1、visual studio中提醒过时,因为微软和甲骨文存在数据库的竞争关系,并且从.NET的更新来看这个程序集没有再更新过,对于数据库一直在更新而调用的程序集一直不更新敢用下去么?还有一个我认为非常重要的原因就是使用这个程序集,摆脱不了每一个运行程序的客户机上都要去安装Oracle客户端的事实,试想一下,如果用户数量巨大的时候,安装客户端的工作量就相当的大,很耗费资源;

2、甲骨文后来出了ODP.NET,各种资料以及官网上都说需要安装ODP.NET,然后引用Oracle.ManagedDataAccess.dll,他和visual studio中的程序集最大的区别在于会随着数据库更新,是oracle官方出的驱动;

3、其实经过测试,ODP.NET的安装完全是没有必要的,直接在网上下载一个Oracle.ManagedDataAccess.dll,按如下方式引用即可,使用此种方式减少了ODP.NET的安装,无视操作系统的位数,最重要的是减少了Oracle客户端的安装;

那在哪里下载Oracle.ManagedDataAccess.dll呢?如果Oracle.ManagedDataAccess.dll有更新怎么知道呢?这个时候全宇宙最强大开发工具登场了!

安装完成就可以撸代码了,并且如果有更新可以随时能看到。并且在编程方面和以前使用System.Data.OracleClient程序集没有多大的不同,基本上拿以前使用System.Data.OracleClient程序集的代码做少许的改动即可。

1、使用了连接字符串,而不是用oracle客户端的服务名了;

2、几个命名空间的变化;

下面是对数据库常用操作的封装

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Configuration;
  6. using Oracle.ManagedDataAccess.Client;
  7. using System.Data;
  8. using System.IO;
  9. using System.Collections;
  10. using System.Diagnostics;
  11. using Oracle.ManagedDataAccess.Types;
  12.  
  13. namespace OracleDemo
  14. {
  15. public class OracleHelper
  16. {
  17. private static string connStr = "User Id=admin;Password=123;Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.0.1)(PORT=1521)))(CONNECT_DATA=(SERVICE_NAME=test)))";
  18.  
  19. #region 执行SQL语句,返回受影响行数
  20. public static int ExecuteNonQuery(string sql, params OracleParameter[] parameters)
  21. {
  22. using (OracleConnection conn = new OracleConnection(connStr))
  23. {
  24. conn.Open();
  25. using (OracleCommand cmd = conn.CreateCommand())
  26. {
  27. cmd.CommandText = sql;
  28. cmd.Parameters.AddRange(parameters);
  29. return cmd.ExecuteNonQuery();
  30. }
  31. }
  32. }
  33. #endregion
  34. #region 执行SQL语句,返回DataTable;只用来执行查询结果比较少的情况
  35. public static DataTable ExecuteDataTable(string sql, params OracleParameter[] parameters)
  36. {
  37. using (OracleConnection conn = new OracleConnection(connStr))
  38. {
  39. conn.Open();
  40. using (OracleCommand cmd = conn.CreateCommand())
  41. {
  42. cmd.CommandText = sql;
  43. cmd.Parameters.AddRange(parameters);
  44. OracleDataAdapter adapter = new OracleDataAdapter(cmd);
  45. DataTable datatable = new DataTable();
  46. adapter.Fill(datatable);
  47. return datatable;
  48. }
  49. }
  50. }
  51. #endregion
  52. }
  53. }

以下代码是调用部分

  1. string sqlString = "Select a.col1,a.col2 From test a Where a.id=:id";
  2. DataTable dt = OracleHelper.ExecuteDataTable(sqlString,new OracleParameter(":id",));

程序编写完成,生成完成后,目录大概如下:

这时候拷贝Debug文件夹到目标客户电脑上即可直接运行了(前提是目标客户电脑上有.NET Framework),完全摆脱安装Oracle客户端。

出处:https://www.cnblogs.com/goldenbridge/p/7812081.html

===========================================================

一、学习背景:

1)微软自vs2010后放弃了自家的system.data.oracleClient驱动,推荐使用oracle提供的驱动。

2)微软提供的system.data.oracleClient驱动存在oracle32位与64位连接兼容性的问题,解决起来费时费力。

二、Oracle推荐的驱动:oracle.DataAccess.dll与oracle.ManagedDataAccess.dll

1)oracle.DataAccess.dll的缺陷。oracle.DataAccess.dll需要几个dll文件,在实际使用中发现,oracle.DataAccess.dll无客户端连接方式同样存在所使用的dll文件的32位与64位和oracle数据库或系统本身存在的dll存在连接兼容性问题。所以不推荐使用该驱动。

2)推荐使用oracle.ManagedDataAccess.dll(oracle.ManagedDataAccess.Client)全托管驱动。实际使用发现,oracle全托管驱动对32位和64位oracle数据库具有很好的连接兼容性。可采用无客户端远程连接oracle,或在本机使用连接。可通过visual studio 2010 nuget安装,或直接下载dll文件,然后引用oracle.ManagedDataAccess.dll文件。在项目数据访问层中引用命名空间using oracle.ManagedDataAccess.Client,如图2-1

图 2-1引用oracle.ManagedDataAccess.Client命名空间

三、Web.config连接字符串

NET提供的链接字符串connectionString="DataSource=192.168.1.2:1521/orcl;Persist Security Info=True;User ID=scott;Password=tiger";

四、关于command.BindByName = true;(重点敲黑板)

1)在使用全托管驱动oracle.ManagedDataAccess.dll后,ado.net的增删查语句都执行正常,但是在执行修改语句(update语句)时,会引发异常。

2)默认情况下ODP.Net 绑定变量时,sql语句中的变量顺序必须和变量绑定顺序一致,否则Fill查不到数据,cmd.ExecuteNonQuery()返回0无法执行,将BindByName 设为true后,sql变量顺序和绑定顺序即可不一致

 

出处:https://blog.csdn.net/windows_xp_guule/article/details/80565243

===========================================================

基于C#语言Oracle.ManagedDataAccess操作Oracle数据库连接语句

Oracle.ManagedDataAccess下载地址: https://download.csdn.net/download/u012949335/10643367

  1. using System;
  2. using System.Collections;
  3. using System.Collections.Specialized;
  4. using System.Data;
  5. using System.Configuration;
  6. using Oracle.ManagedDataAccess;
  7. using Oracle.ManagedDataAccess.Types;
  8. using Oracle.ManagedDataAccess.Client;
  9.  
  10. namespace DB
  11. {
  12. /// <summary>
  13. /// 数据访问基础类(基于Oracle) Copyright (C) Maticsoft
  14. /// 可以用户可以修改满足自己项目的需要。
  15. /// </summary>
  16. public abstract class DbHelperOra
  17. {
  18. //数据库连接字符串(web.config来配置),可以动态更改connectionString支持多数据库.
  19. public static string connectionString = PubConstant.ConnectionString;
  20. public DbHelperOra()
  21. {
  22. }
  23.  
  24. #region 公用方法
  25.  
  26. public static int GetMaxID(string FieldName, string TableName)
  27. {
  28. string strsql = "select max(" + FieldName + ")+1 from " + TableName;
  29. object obj = GetSingle(strsql);
  30. if (obj == null)
  31. {
  32. return ;
  33. }
  34. else
  35. {
  36. return int.Parse(obj.ToString());
  37. }
  38. }
  39. public static bool Exists(string strSql)
  40. {
  41. object obj = GetSingle(strSql);
  42. int cmdresult;
  43. if ((Object.Equals(obj, null)) || (Object.Equals(obj, System.DBNull.Value)))
  44. {
  45. cmdresult = ;
  46. }
  47. else
  48. {
  49. cmdresult = int.Parse(obj.ToString());
  50. }
  51. if (cmdresult == )
  52. {
  53. return false;
  54. }
  55. else
  56. {
  57. return true;
  58. }
  59. }
  60.  
  61. public static bool Exists(string strSql, params OracleParameter[] cmdParms)
  62. {
  63. object obj = GetSingle(strSql, cmdParms);
  64. int cmdresult;
  65. if ((Object.Equals(obj, null)) || (Object.Equals(obj, System.DBNull.Value)))
  66. {
  67. cmdresult = ;
  68. }
  69. else
  70. {
  71. cmdresult = int.Parse(obj.ToString());
  72. }
  73. if (cmdresult == )
  74. {
  75. return false;
  76. }
  77. else
  78. {
  79. return true;
  80. }
  81. }
  82.  
  83. #endregion
  84.  
  85. #region 执行简单SQL语句
  86.  
  87. /// <summary>
  88. /// 执行SQL语句,返回影响的记录数
  89. /// </summary>
  90. /// <param name="SQLString">SQL语句</param>
  91. /// <returns>影响的记录数</returns>
  92. public static int ExecuteSql(string SQLString)
  93. {
  94. using (OracleConnection connection = new OracleConnection(connectionString))
  95. {
  96. using (OracleCommand cmd = new OracleCommand(SQLString,connection))
  97. {
  98. try
  99. {
  100. connection.Open();
  101. int rows=cmd.ExecuteNonQuery();
  102. return rows;
  103. }
  104. catch(OracleException E)
  105. {
  106. connection.Close();
  107. throw new Exception(E.Message);
  108. }
  109. }
  110. }
  111. }
  112.  
  113. /// <summary>
  114. /// 执行多条SQL语句,实现数据库事务。
  115. /// </summary>
  116. /// <param name="SQLStringList">多条SQL语句</param>
  117. public static void ExecuteSqlTran(ArrayList SQLStringList)
  118. {
  119. using (OracleConnection conn = new OracleConnection(connectionString))
  120. {
  121. conn.Open();
  122. OracleCommand cmd = new OracleCommand();
  123. cmd.Connection=conn;
  124. OracleTransaction tx=conn.BeginTransaction();
  125. cmd.Transaction=tx;
  126. try
  127. {
  128. for(int n=;n<SQLStringList.Count;n++)
  129. {
  130. string strsql=SQLStringList[n].ToString();
  131. if (strsql.Trim().Length>)
  132. {
  133. cmd.CommandText=strsql;
  134. cmd.ExecuteNonQuery();
  135. }
  136. }
  137. tx.Commit();
  138. }
  139. catch(OracleException E)
  140. {
  141. tx.Rollback();
  142. throw new Exception(E.Message);
  143. }
  144. }
  145. }
  146. /// <summary>
  147. /// 执行带一个存储过程参数的的SQL语句。
  148. /// </summary>
  149. /// <param name="SQLString">SQL语句</param>
  150. /// <param name="content">参数内容,比如一个字段是格式复杂的文章,有特殊符号,可以通过这个方式添加</param>
  151. /// <returns>影响的记录数</returns>
  152. public static int ExecuteSql(string SQLString,string content)
  153. {
  154. using (OracleConnection connection = new OracleConnection(connectionString))
  155. {
  156. OracleCommand cmd = new OracleCommand(SQLString,connection);
  157. OracleParameter myParameter = new OracleParameter("@content", OracleDbType.Varchar2);
  158. myParameter.Value = content ;
  159. cmd.Parameters.Add(myParameter);
  160. try
  161. {
  162. connection.Open();
  163. int rows=cmd.ExecuteNonQuery();
  164. return rows;
  165. }
  166. catch(OracleException E)
  167. {
  168. throw new Exception(E.Message);
  169. }
  170. finally
  171. {
  172. cmd.Dispose();
  173. connection.Close();
  174. }
  175. }
  176. }
  177. /// <summary>
  178. /// 向数据库里插入图像格式的字段(和上面情况类似的另一种实例)
  179. /// </summary>
  180. /// <param name="strSQL">SQL语句</param>
  181. /// <param name="fs">图像字节,数据库的字段类型为image的情况</param>
  182. /// <returns>影响的记录数</returns>
  183. public static int ExecuteSqlInsertImg(string strSQL,byte[] fs)
  184. {
  185. using (OracleConnection connection = new OracleConnection(connectionString))
  186. {
  187. OracleCommand cmd = new OracleCommand(strSQL,connection);
  188. OracleParameter myParameter = new OracleParameter("@fs", OracleDbType.LongRaw);
  189. myParameter.Value = fs ;
  190. cmd.Parameters.Add(myParameter);
  191. try
  192. {
  193. connection.Open();
  194. int rows=cmd.ExecuteNonQuery();
  195. return rows;
  196. }
  197. catch(OracleException E)
  198. {
  199. throw new Exception(E.Message);
  200. }
  201. finally
  202. {
  203. cmd.Dispose();
  204. connection.Close();
  205. }
  206. }
  207. }
  208.  
  209. /// <summary>
  210. /// 执行一条计算查询结果语句,返回查询结果(object)。
  211. /// </summary>
  212. /// <param name="SQLString">计算查询结果语句</param>
  213. /// <returns>查询结果(object)</returns>
  214. public static object GetSingle(string SQLString)
  215. {
  216. using (OracleConnection connection = new OracleConnection(connectionString))
  217. {
  218. using(OracleCommand cmd = new OracleCommand(SQLString,connection))
  219. {
  220. try
  221. {
  222. connection.Open();
  223. object obj = cmd.ExecuteScalar();
  224. if((Object.Equals(obj,null))||(Object.Equals(obj,System.DBNull.Value)))
  225. {
  226. return null;
  227. }
  228. else
  229. {
  230. return obj;
  231. }
  232. }
  233. catch(OracleException e)
  234. {
  235. connection.Close();
  236. throw new Exception(e.Message);
  237. }
  238. }
  239. }
  240. }
  241. /// <summary>
  242. /// 执行查询语句,返回OracleDataReader ( 注意:调用该方法后,一定要对SqlDataReader进行Close )
  243. /// </summary>
  244. /// <param name="strSQL">查询语句</param>
  245. /// <returns>OracleDataReader</returns>
  246. public static OracleDataReader ExecuteReader(string strSQL)
  247. {
  248. OracleConnection connection = new OracleConnection(connectionString);
  249. OracleCommand cmd = new OracleCommand(strSQL,connection);
  250. try
  251. {
  252. connection.Open();
  253. OracleDataReader myReader = cmd.ExecuteReader(CommandBehavior.CloseConnection);
  254. return myReader;
  255. }
  256. catch(OracleException e)
  257. {
  258. throw new Exception(e.Message);
  259. }
  260.  
  261. }
  262. /// <summary>
  263. /// 执行查询语句,返回DataSet
  264. /// </summary>
  265. /// <param name="SQLString">查询语句</param>
  266. /// <returns>DataSet</returns>
  267. public static DataSet Query(string SQLString)
  268. {
  269. using (OracleConnection connection = new OracleConnection(connectionString))
  270. {
  271. DataSet ds = new DataSet();
  272. try
  273. {
  274. connection.Open();
  275. OracleDataAdapter command = new OracleDataAdapter(SQLString,connection);
  276. command.Fill(ds,"ds");
  277. }
  278. catch(OracleException ex)
  279. {
  280. throw new Exception(ex.Message);
  281. }
  282. return ds;
  283. }
  284. }
  285.  
  286. #endregion
  287.  
  288. #region 执行带参数的SQL语句
  289.  
  290. /// <summary>
  291. /// 执行SQL语句,返回影响的记录数
  292. /// </summary>
  293. /// <param name="SQLString">SQL语句</param>
  294. /// <returns>影响的记录数</returns>
  295. public static int ExecuteSql(string SQLString,params OracleParameter[] cmdParms)
  296. {
  297. using (OracleConnection connection = new OracleConnection(connectionString))
  298. {
  299. using (OracleCommand cmd = new OracleCommand())
  300. {
  301. try
  302. {
  303. PrepareCommand(cmd, connection, null,SQLString, cmdParms);
  304. int rows=cmd.ExecuteNonQuery();
  305. cmd.Parameters.Clear();
  306. return rows;
  307. }
  308. catch(OracleException E)
  309. {
  310. throw new Exception(E.Message);
  311. }
  312. }
  313. }
  314. }
  315.  
  316. /// <summary>
  317. /// 执行多条SQL语句,实现数据库事务。
  318. /// </summary>
  319. /// <param name="SQLStringList">SQL语句的哈希表(key为sql语句,value是该语句的OracleParameter[])</param>
  320. public static void ExecuteSqlTran(Hashtable SQLStringList)
  321. {
  322. using (OracleConnection conn = new OracleConnection(connectionString))
  323. {
  324. conn.Open();
  325. using (OracleTransaction trans = conn.BeginTransaction())
  326. {
  327. OracleCommand cmd = new OracleCommand();
  328. try
  329. {
  330. //循环
  331. foreach (DictionaryEntry myDE in SQLStringList)
  332. {
  333. string cmdText=myDE.Key.ToString();
  334. OracleParameter[] cmdParms=(OracleParameter[])myDE.Value;
  335. PrepareCommand(cmd,conn,trans,cmdText, cmdParms);
  336. int val = cmd.ExecuteNonQuery();
  337. cmd.Parameters.Clear();
  338.  
  339. trans.Commit();
  340. }
  341. }
  342. catch
  343. {
  344. trans.Rollback();
  345. throw;
  346. }
  347. }
  348. }
  349. }
  350.  
  351. /// <summary>
  352. /// 执行一条计算查询结果语句,返回查询结果(object)。
  353. /// </summary>
  354. /// <param name="SQLString">计算查询结果语句</param>
  355. /// <returns>查询结果(object)</returns>
  356. public static object GetSingle(string SQLString,params OracleParameter[] cmdParms)
  357. {
  358. using (OracleConnection connection = new OracleConnection(connectionString))
  359. {
  360. using (OracleCommand cmd = new OracleCommand())
  361. {
  362. try
  363. {
  364. PrepareCommand(cmd, connection, null,SQLString, cmdParms);
  365. object obj = cmd.ExecuteScalar();
  366. cmd.Parameters.Clear();
  367. if((Object.Equals(obj,null))||(Object.Equals(obj,System.DBNull.Value)))
  368. {
  369. return null;
  370. }
  371. else
  372. {
  373. return obj;
  374. }
  375. }
  376. catch(OracleException e)
  377. {
  378. throw new Exception(e.Message);
  379. }
  380. }
  381. }
  382. }
  383.  
  384. /// <summary>
  385. /// 执行查询语句,返回OracleDataReader ( 注意:调用该方法后,一定要对SqlDataReader进行Close )
  386. /// </summary>
  387. /// <param name="strSQL">查询语句</param>
  388. /// <returns>OracleDataReader</returns>
  389. public static OracleDataReader ExecuteReader(string SQLString,params OracleParameter[] cmdParms)
  390. {
  391. OracleConnection connection = new OracleConnection(connectionString);
  392. OracleCommand cmd = new OracleCommand();
  393. try
  394. {
  395. PrepareCommand(cmd, connection, null,SQLString, cmdParms);
  396. OracleDataReader myReader = cmd.ExecuteReader(CommandBehavior.CloseConnection);
  397. cmd.Parameters.Clear();
  398. return myReader;
  399. }
  400. catch(OracleException e)
  401. {
  402. throw new Exception(e.Message);
  403. }
  404.  
  405. }
  406.  
  407. /// <summary>
  408. /// 执行查询语句,返回DataSet
  409. /// </summary>
  410. /// <param name="SQLString">查询语句</param>
  411. /// <returns>DataSet</returns>
  412. public static DataSet Query(string SQLString,params OracleParameter[] cmdParms)
  413. {
  414. using (OracleConnection connection = new OracleConnection(connectionString))
  415. {
  416. OracleCommand cmd = new OracleCommand();
  417. PrepareCommand(cmd, connection, null,SQLString, cmdParms);
  418. using( OracleDataAdapter da = new OracleDataAdapter(cmd) )
  419. {
  420. DataSet ds = new DataSet();
  421. try
  422. {
  423. da.Fill(ds,"ds");
  424. cmd.Parameters.Clear();
  425. }
  426. catch(OracleException ex)
  427. {
  428. throw new Exception(ex.Message);
  429. }
  430. return ds;
  431. }
  432. }
  433. }
  434.  
  435. private static void PrepareCommand(OracleCommand cmd,OracleConnection conn,OracleTransaction trans, string cmdText, OracleParameter[] cmdParms)
  436. {
  437. if (conn.State != ConnectionState.Open)
  438. conn.Open();
  439. cmd.Connection = conn;
  440. cmd.CommandText = cmdText;
  441. if (trans != null)
  442. cmd.Transaction = trans;
  443. cmd.CommandType = CommandType.Text;//cmdType;
  444. if (cmdParms != null)
  445. {
  446. foreach (OracleParameter parm in cmdParms)
  447. cmd.Parameters.Add(parm);
  448. }
  449. }
  450.  
  451. #endregion
  452.  
  453. #region 存储过程操作
  454.  
  455. /// <summary>
  456. /// 执行存储过程 返回SqlDataReader ( 注意:调用该方法后,一定要对SqlDataReader进行Close )
  457. /// </summary>
  458. /// <param name="storedProcName">存储过程名</param>
  459. /// <param name="parameters">存储过程参数</param>
  460. /// <returns>OracleDataReader</returns>
  461. public static OracleDataReader RunProcedure(string storedProcName, IDataParameter[] parameters )
  462. {
  463. OracleConnection connection = new OracleConnection(connectionString);
  464. OracleDataReader returnReader;
  465. connection.Open();
  466. OracleCommand command = BuildQueryCommand( connection,storedProcName, parameters );
  467. command.CommandType = CommandType.StoredProcedure;
  468. returnReader = command.ExecuteReader(CommandBehavior.CloseConnection);
  469. return returnReader;
  470. }
  471.  
  472. /// <summary>
  473. /// 执行存储过程
  474. /// </summary>
  475. /// <param name="storedProcName">存储过程名</param>
  476. /// <param name="parameters">存储过程参数</param>
  477. /// <param name="tableName">DataSet结果中的表名</param>
  478. /// <returns>DataSet</returns>
  479. public static DataSet RunProcedure(string storedProcName, IDataParameter[] parameters, string tableName )
  480. {
  481. using (OracleConnection connection = new OracleConnection(connectionString))
  482. {
  483. DataSet dataSet = new DataSet();
  484. connection.Open();
  485. OracleDataAdapter sqlDA = new OracleDataAdapter();
  486. sqlDA.SelectCommand = BuildQueryCommand(connection, storedProcName, parameters );
  487. sqlDA.Fill( dataSet, tableName );
  488. connection.Close();
  489. return dataSet;
  490. }
  491. }
  492.  
  493. /// <summary>
  494. /// 构建 OracleCommand 对象(用来返回一个结果集,而不是一个整数值)
  495. /// </summary>
  496. /// <param name="connection">数据库连接</param>
  497. /// <param name="storedProcName">存储过程名</param>
  498. /// <param name="parameters">存储过程参数</param>
  499. /// <returns>OracleCommand</returns>
  500. private static OracleCommand BuildQueryCommand(OracleConnection connection,string storedProcName, IDataParameter[] parameters)
  501. {
  502. OracleCommand command = new OracleCommand( storedProcName, connection );
  503. command.CommandType = CommandType.StoredProcedure;
  504. foreach (OracleParameter parameter in parameters)
  505. {
  506. command.Parameters.Add( parameter );
  507. }
  508. return command;
  509. }
  510.  
  511. /// <summary>
  512. /// 执行存储过程,返回影响的行数
  513. /// </summary>
  514. /// <param name="storedProcName">存储过程名</param>
  515. /// <param name="parameters">存储过程参数</param>
  516. /// <param name="rowsAffected">影响的行数</param>
  517. /// <returns></returns>
  518. public static int RunProcedure(string storedProcName, IDataParameter[] parameters, out int rowsAffected )
  519. {
  520. using (OracleConnection connection = new OracleConnection(connectionString))
  521. {
  522. int result;
  523. connection.Open();
  524. OracleCommand command = BuildIntCommand(connection,storedProcName, parameters );
  525. rowsAffected = command.ExecuteNonQuery();
  526. result = (int)command.Parameters["ReturnValue"].Value;
  527. //Connection.Close();
  528. return result;
  529. }
  530. }
  531.  
  532. /// <summary>
  533. /// 创建 OracleCommand 对象实例(用来返回一个整数值)
  534. /// </summary>
  535. /// <param name="storedProcName">存储过程名</param>
  536. /// <param name="parameters">存储过程参数</param>
  537. /// <returns>OracleCommand 对象实例</returns>
  538. private static OracleCommand BuildIntCommand(OracleConnection connection,string storedProcName, IDataParameter[] parameters)
  539. {
  540. OracleCommand command = BuildQueryCommand(connection,storedProcName, parameters );
  541. command.Parameters.Add( new OracleParameter ( "ReturnValue",
  542. OracleDbType.Int32, , ParameterDirection.ReturnValue,
  543. false,,,string.Empty,DataRowVersion.Default,null ));
  544. return command;
  545. }
  546. #endregion
  547.  
  548. }
  549. }

出处:https://blog.csdn.net/u012949335/article/details/82378210

===========================================================

今天调用webservice的时候,运行程序后开始报错以下的错误信息

  1. “/”应用程序中的服务器错误。
  2.  
  3. 未能加载文件或程序集“Oracle.DataAccess”或它的某一个依赖项。试图加载格式不正确的程序。
  4. 说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。 
  5.  
  6. 异常详细信息: System.BadImageFormatException: 未能加载文件或程序集“Oracle.DataAccess”或它的某一个依赖项。试图加载格式不正确的程序。
  7.  
  8. 源错误: 
  9. 执行当前 Web 请求期间生成了未处理的异常。可以使用下面的异常堆栈跟踪信息确定有关异常原因和发生位置的信息。
  10.  
  11. 程序集加载跟踪: 下列信息有助于确定程序集“Oracle.DataAccess”无法加载的原因......。
  1. 然后百度上搞了很久,各种方法试遍了,最后尝试用了Oracle.ManagedDataAccess Oracle全托管驱动,添加到项目的引用中,再配置一下Web.config,大功告成了。
    下面贴上代码,以备以后需要。
  1. <configSections>
  2. <section name="oracle.manageddataaccess.client"
  3. type="OracleInternal.Common.ODPMSectionHandler, Oracle.ManagedDataAccess, Version=4.121.2.0, Culture=neutral, PublicKeyToken=89b483f429c47342"/>
  4. </configSections>
  5. <system.web>
  6. <compilation debug="true" targetFramework="4.0" />
  7. </system.web>
  8. <system.data>
  9. <DbProviderFactories>
  10. <remove invariant="Oracle.ManagedDataAccess.Client"/>
  11. <add name="ODP.NET, Managed Driver" invariant="Oracle.ManagedDataAccess.Client" description="Oracle Data Provider for .NET, Managed Driver"
  12. type="Oracle.ManagedDataAccess.Client.OracleClientFactory, Oracle.ManagedDataAccess, Version=4.121.2.0, Culture=neutral, PublicKeyToken=89b483f429c47342"/>
  13. </DbProviderFactories>
  14. </system.data>
  15. <runtime>
  16. <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
  17. <dependentAssembly>
  18. <publisherPolicy apply="no"/>
  19. <assemblyIdentity name="Oracle.ManagedDataAccess" publicKeyToken="89b483f429c47342" culture="neutral"/>
  20. <bindingRedirect oldVersion="4.121.0.0 - 4.65535.65535.65535" newVersion="4.121.2.0"/>
  21. </dependentAssembly>
  22. </assemblyBinding>
  23. </runtime>
  24. <oracle.manageddataaccess.client>
  25. <version number="*">
  26. <dataSources>
  27. <dataSource alias="SampleDataSource" descriptor="(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=localhost)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=ORCL))) "/>
  28. </dataSources>
  29. </version>
  30. </oracle.manageddataaccess.client>
  1.  

ORACLE全托管驱动Oracle.ManagedDataAccess.dll ,支持EF 支持分布式事务,连接数据库再也不需要安装oracle 客户端了,也不用区分32位,64位了。

Oracle.ManagedDataAccess.dll下载地址:http://download.csdn.net/detail/w3800/7360331

出处:https://www.cnblogs.com/handsomeso/p/5623146.html

===========================================================

ODP.NET Managed web.config 配置

<connectionStrings>
    <add name="OracleConnectionString" providerName="Oracle.ManagedDataAccess.Client" connectionString="User Id=scott;Password=tiger;Data Source=MyDataSource;PERSIST SECURITY INFO=True" />
  </connectionStrings>

<oracle.manageddataaccess.client>

<version number="*">
      <dataSources>
        <dataSource alias="SampleDataSource"
            descriptor="(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=localhost)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=ORCL))) "/>
        <dataSource alias="MyDataSource"
             descriptor="(DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = tcp)(HOST = 192.168.0.1)(PORT = 1521))  (ADDRESS = (PROTOCOL = tcp)(HOST = 192.168.0.2)(PORT = 1521))  (LOAD_BALANCE = ON) (FAILOVER = ON) ) (CONNECT_DATA =(SERVICE_NAME = oradb)(GLOBAL_NAME
= oradb)(FAILOVER_MODE = (TYPE = SELECT) (METHOD = BASIC)))) " />
      </dataSources>
      <settings>
        <setting name="TNS_ADMIN" value="C:\oracle\product\10.2.0\client_1\NETWORK\ADMIN\"/>
      </settings>

</version>

</oracle.manageddataaccess.client>

c#

public static string connectionString = ConfigurationManager.ConnectionStrings["OracleConnectionString"].ConnectionString;// "连接字符串";

出处:https://blog.csdn.net/deepblue1974/article/details/52639396

==========================================================

C#使用ODP.NET(Oracle.ManagedDataAccess.dll)操作Oracle数据库的更多相关文章

  1. Oracle.ManagedDataAccess.dll 连接Oracle数据库不需要安装客户端

    最开始,连接Oracle 数据是需要安装客户端的,ado.net 后来由于微软未来不再支持 System.Data.OracleClient 这个 Data Provider 的研发,从 .NET 4 ...

  2. NHibernate4使用Oracle.ManagedDataAccess.dll连接oracle及配置多个数据库连接

    NHibernate数据库配置参数在hibernate.cfg.xml中 <?xml version="1.0" encoding="utf-8"?> ...

  3. C#使用托管程序连接Oracle数据库(Oracle.ManagedDataAccess.dll)

    一.概述 Oracle Data Provider for  .NET, Managed Driver: Oracle官方的托管数据库访问组件,单DLL,Oracle.ManagedDataAcces ...

  4. (转) C#使用ODP.NET(Oracle.ManagedDataAccess.dll)操作Oracle数据库

    原贴链接:https://www.cnblogs.com/mq0036/p/11052359.html C#使用ODP.NET(Oracle.ManagedDataAccess.dll)操作Oracl ...

  5. 在代码生成工具Database2Sharp中使用ODP.NET(Oracle.ManagedDataAccess.dll)访问Oracle数据库,实现免安装Oracle客户端,兼容32位64位Oracle驱动

    由于我们开发的辅助工具Database2Sharp需要支持多种数据库,虽然我们一般使用SQLServer来开发应用较多,但是Oracle等其他数据库也是常用的数据库之一,因此也是支持使用Oracle等 ...

  6. Oracle.ManagedDataAccess.dll方式操作oracle数据库

    Oracle.ManagedDataAccess.dll方式操作oracle数据库 一.查询语句: using (OracleConnection conn = new OracleConnectio ...

  7. C#连接Oracle数据库的方法(System.Data.OracleClient、Oracle.DataAccess.Client也叫ODP.net、Oracle.ManagedDataAccess.dll)

    官方下载地址(ODP.net)(中文):http://www.oracle.com/technetwork/cn/topics/dotnet/downloads/index.html 官方下载地址(O ...

  8. 在开发框架中扩展微软企业库,支持使用ODP.NET(Oracle.ManagedDataAccess.dll)访问Oracle数据库

    在前面随笔<在代码生成工具Database2Sharp中使用ODP.NET(Oracle.ManagedDataAccess.dll)访问Oracle数据库,实现免安装Oracle客户端,兼容3 ...

  9. C#使用Oracle.ManagedDataAccess.dll

    在刚接触C#的时候由于公司使用的就是Oracle数据库,那么C#怎么连接Oracle数据库就成了首要去掌握的知识点了.在那时没有ODP.NET,但visual studio却对Oralce数据库的调用 ...

随机推荐

  1. Android MVP模式简单介绍:以一个登陆流程为例

    老的项目用的MVC的模式,最近完成了全部重构成MVP模式的工作,虽然比较麻烦,好处是代码逻辑更加清楚.简洁,流程更加清晰,对于后续版本迭代维护都挺方便.对于一些想要学习MVP模式的同学来讲,百度搜出来 ...

  2. Ajax返回的数据存放到js数组

    js定义数组比较简单: var  array = [ ] ; 即可 今天记录一下 js 数组的常用规则: 1. b = [1,'da',"sdaf"]; //定义数组给数组添加默认 ...

  3. 记事本 该文件含有unicode格式的字符 点确定就变乱码了,notePad++,UltraEditor等编辑器打开也变乱码?

    --问题 之前一直都是好的 今天电脑打开,发现电脑所有的TXT记事本,点开来全是乱码,甚至下过来的TXT,或者自己新建的TXT,打上中文字,点保存会弹出 该文件含有unicode格式的字符什么什么的, ...

  4. react中的ref在input中的详解

    当我们在项目中遇见文本输入框的时候,获取时刻输入框中的值 1.受控组件 class NameForm extends React.Component { constructor(props) { su ...

  5. Data-Structure-Notes

    Data Structure Notes Chapter-1 Sorting Algorithm Selection Sorting: /* * Selection Sort */ template& ...

  6. 56 容器(十)——Iterator迭代器遍历容器

    迭代器的获取 LIst与Set容器统一使用他们的对象.Iterator()方法获得迭代器对象,然后使用while循环配合迭代器的方法hasNext()及next()来遍历容器. List<Str ...

  7. RHEL6.5 移植使用CentOS 的YUM 步骤

    问题:使用 Red Hat Enterprise Linux Server(RHEL) yum安装软件时显示 This system is not registered with RHN. RHN s ...

  8. 解决clover配置文件conf.plist中nv_disable=1或者nvda_drv=1不生效或者说不能删除的问题

    情况一:U盘安装MacOS的时候conf.plist中设置了nv_disable=1,但是启动的时候任然显示nvda_drv=1. 这种情况一般出现在该机器曾经安装过MacOS,MacOS会将这个参数 ...

  9. oracle学习笔记(三)

    索引: drop table test1 purge; drop table test2 purge; drop table test3 purge; drop table t purge; crea ...

  10. kube-state-metrics 详解

    原文:https://mp.weixin.qq.com/s/176eyFBknzdA5wpiJrxDSg 概述 已经有了 cadvisor.heapster.metric-server,几乎容器运行的 ...