1. 引入库类

Oracle.ManagedDataAccess.dll

using Oracle.ManagedDataAccess.Client;

2. 粗暴封装


namespace xx
{
public class OracleSqlDao
{
public OracleSqlDao(string connStr)
{
ConnectionString = connStr;
} /// <summary>
/// 数据库连接字符串
/// </summary>
public string ConnectionString; /// <summary>
/// 使用固定连接进行数据库的操作,默认false,表示每次操作都使用新的连接
/// </summary>
public bool UseSpecifiedConn = false; /// <summary>
/// 使用指定连接执行数据库操作时所用的数据库连接,使用前需设置UseSpecifiedConn
/// </summary>
public OracleConnection OrasqlConn; /// <summary>
/// 打开数据库连接
/// </summary>
/// <returns></returns>
public bool OpenConn()
{
try
{
if (OrasqlConn.State == ConnectionState.Open)
{
return true;
}
else
{
OrasqlConn.Open();
return OrasqlConn.State == ConnectionState.Open;
}
}
catch (Exception ex)
{
Common.WriteLog.Error("打开数据库连接出错!", ex);
return false;
}
} /// <summary>
/// 关闭数据库连接
/// </summary>
/// <returns></returns>
public bool CloseConn()
{
try
{
OrasqlConn.Close();
return OrasqlConn.State == ConnectionState.Closed;
}
catch (Exception ex)
{
Common.WriteLog.Error("关闭数据库连接出错!", ex);
return false;
}
} /// <summary>
/// 检查数据库连接是否正常
/// </summary>
/// <returns></returns>
public bool TryOpenConn()
{
bool result = false;
using (OracleConnection Conn = new OracleConnection(ConnectionString))
{
try
{
Conn.Open();
result = Conn.State == ConnectionState.Open;
}
catch (Exception ex)
{
Common.WriteLog.Error("打开数据库连接出错!", ex);
}
}
return result;
} /// <summary>
/// 查询 postgre 数据库,返回 DataTable 数据
/// </summary>
/// <param name="sqlText">sql查询语句</param>
/// <returns></returns>
public DataTable ExecuteQuery(string sqlText)
{
return ExecuteQuery(sqlText, null);
} /// <summary>
/// 查询 postgre 数据库,返回 DataTable 数据
/// </summary>
/// <param name="sqlText">sql查询语句</param>
/// <param name="param">参数集合</param>
/// <returns></returns>
public DataTable ExecuteQuery(string sqlText, OracleParameter[] param)
{
var dt = new DataTable();
OracleConnection conn = UseSpecifiedConn ? OrasqlConn : new OracleConnection(ConnectionString);
using (var nda = new OracleDataAdapter(sqlText, conn))
{
try
{
if (param != null)
{
SetParmDBNull(param);
nda.SelectCommand.Parameters.AddRange(param);
}
var ds = new DataSet();
nda.Fill(ds);
dt = ds.Tables[0];
}
catch (Exception ex)
{
Common.WriteLog.Error("查询数据库出错!查询语句:" + sqlText, ex);
}
finally
{
if (!UseSpecifiedConn)
{
conn.Dispose();
}
}
}
return dt;
} /// <summary>
/// 查询唯一值(用来查总记录数等等..)
/// </summary>
/// <param name="sqlText"></param>
/// <returns></returns>
public int QueryOnly(string sqlText)
{
OracleConnection conn = UseSpecifiedConn ? OrasqlConn : new OracleConnection(ConnectionString);
try
{
if (conn.State != ConnectionState.Open)
{
conn.Open();
}
OracleCommand objCommand = new OracleCommand(sqlText, conn);
int count = Convert.ToInt32(objCommand.ExecuteScalar());
return count;
}
catch (Exception e)
{
Console.WriteLine(e.Message);
return 0;
}
finally
{
if (!UseSpecifiedConn)
{
conn.Dispose();
}
}
} /// <summary>
/// 增删改 postgre 数据库,返回是否成功标识
/// </summary>
/// <param name="sqlText"></param>
/// <returns></returns>
public int ExecuteNonQuery(string sqlText)
{
return ExecuteNonQuery(sqlText, null);
} /// <summary>
/// 增删改 postgre 数据库,返回是否成功标识
/// </summary>
/// <param name="sqlText"></param>
/// <param name="param">参数集合</param>
/// <returns></returns>
public int ExecuteNonQuery(string sqlText, OracleParameter[] param)
{
int result = int.MinValue;
OracleConnection conn = UseSpecifiedConn ? OrasqlConn : new OracleConnection(ConnectionString);
using (var nSqlCommand = new OracleCommand(sqlText, conn))
{
try
{
if (conn.State != ConnectionState.Open)
{
conn.Open();
}
// 添加参数
if (param != null)
{
SetParmDBNull(param);
nSqlCommand.Parameters.AddRange(param);
}
// 执行查询并返回受影响的行数
result = nSqlCommand.ExecuteNonQuery();
}
catch (OracleException ex)
{
Common.WriteLog.Error("执行数据库语句出错!执行语句:" + sqlText, ex);
if (ex != null)
{
result = ex.ErrorCode;
}
}
finally
{
if (!UseSpecifiedConn)
{
conn.Dispose();
}
}
}
return result;
}
/// <summary>
/// 执行多条SQL语句,实现数据库事务。
/// </summary>
/// <param name="SQLStringList">多条SQL语句</param>
public bool ExecuteTransSQL(List<String> SQLStringList)
{
using (OracleConnection conn = UseSpecifiedConn ? OrasqlConn : new OracleConnection(ConnectionString))
{
if (conn.State != ConnectionState.Open)
conn.Open();
OracleCommand cmd = new OracleCommand();
cmd.Connection = conn;
OracleTransaction tx = conn.BeginTransaction();
cmd.Transaction = tx;
try
{
int count = 0;
for (int n = 0; n < SQLStringList.Count; n++)
{
string strsql = SQLStringList[n];
if (strsql.Trim().Length > 1)
{
cmd.CommandText = strsql;
count += cmd.ExecuteNonQuery();
}
}
tx.Commit();
return true;
}
catch
{
tx.Rollback();
return false;
}
finally
{
if (!UseSpecifiedConn)
{
conn.Dispose();
}
}
}
} /// <summary>
/// 将参数中null值转换为DBNull
/// </summary>
/// <param name="param"></param>
public void SetParmDBNull(OracleParameter[] param)
{
foreach (var p in param)
{
if (p.Value == null)
{
p.Value = DBNull.Value;
}
}
} /// <summary>
/// DataTable转换List,反射机制
/// </summary>
/// <param name="dt"></param>
/// <returns></returns>
public IList<T> DataTableToList<T>(DataTable dt) where T : new()
{ IList<T> list = new List<T>();// 定义集合
Type type = typeof(T); // 获得此模型的类型
var tempName = string.Empty;
foreach (DataRow dr in dt.Rows)
{
T t = new T();
PropertyInfo[] propertys = t.GetType().GetProperties();// 获得此模型的公共属性
foreach (PropertyInfo pi in propertys)
{
tempName = pi.Name;
if (dt.Columns.Contains(tempName))
{
if (!pi.CanWrite) continue;
object value = dr[tempName];
if (value != DBNull.Value)
pi.SetValue(t, value, null);
}
}
list.Add(t);
}
return list;
}
}
}

3. 代码实例

/// <summary>
/// oracle
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnOra_Click(object sender, RoutedEventArgs e)
{
OracleSqlDao ora = new OracleSqlDao("Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.37.175)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=c3mits)));Persist Security Info=True;User ID=gosun;Password=video;");
var result=ora.TryOpenConn();
var table=ora.ExecuteQuery("select * from yunxingtest");
}

C# 应用 - 封装类访问 Oracle 数据库的更多相关文章

  1. .net(C#)访问Oracle数据库的几种免安装组件的对比

    Oracle 数据存取组件(ODAC) 库为Borland Delphi,C++ Builder 以及 Kylix提供了一些非可视化的组件.它们用来存取Oracle关系数据库系统.与BDE类似, OD ...

  2. 用JDBC访问ORACLE数据库 关于commit 增快效率 大数据 等的整理

    1.问:用JDBC访问ORACLE数据库,做DELETE操作,能用JAVA多线程实现吗? ORACLE服务器要怎么配?(以下答案来自网络,仅供参考) 答: Oracle有自己的锁机制.就算你开100条 ...

  3. .net(C#)访问Oracle数据库的几种免安装组件的对比(转)

    原文地址 [内容为转载,个人推荐还是用官方的组件,推荐使用 Oracle.DataAccess.dll ] .net(C#)编程过程中,使用到了以下三种免安装的Oracle访问组件,能够不安装Orac ...

  4. 运行于64操作系统上的C#客户端通过WCF访问Oracle数据库不兼容问题

    运行平台: Windows 7  64位操作系统 运行环境: IIS 7 编程语言:C# 数据库: 32位的Oracle 10g 运行原因:64位操作系统C#客户端程序通过WCF访问ORACLE数据库 ...

  5. ODP.NET 之访问 Oracle 数据库

    ODP.NET 之访问 Oracle 数据库 要相使用 Oracle Data Provider For .NET(ODP.NET), 必须先安装 ODP.NET 或者是 ODAC(Oracle Da ...

  6. 【方法】如何限定IP访问Oracle数据库

    [方法]如何限定IP访问Oracle数据库 1.1  BLOG文档结构图 1.2  前言部分 1.2.1  导读和注意事项 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知 ...

  7. c#访问oracle数据库

    想在c#中访问oracle数据库,毕竟是开发,想要轻量级访问oracle,客户机上无需安装oracle环境就能正常运行程序. 在网上找了相关资料,只需要引用一个dll即可实现. 访问代码(需引用dll ...

  8. WebService访问oracle数据库本地调试

    WebService访问oracle数据库本地调试-一步一个坑 上篇文章提到我们额数据库挂了,重装了数据库,然后呢我需要在本地调试WebService,看看那些数据结构缺失,迁移到新数据库中去.踩坑之 ...

  9. Winform 利用 Oracle.ManagedDataAccess访问Oracle数据库

    Winform 利用 Oracle.ManagedDataAccess访问Oracle数据库时出现以下错误: Message = "每个配置文件中只允许存在一个 <configSect ...

随机推荐

  1. Zabbix 自动发现 & 自动注册

    自动发现 Zabbix 为用户提供了高效灵活的网络自动发现功能,有以下优点: 加快 Zabbix 部署 简化管理 无需过多管理,也能在快速变化的环境中使用 Zabbix Zabbix 网络发现基于以下 ...

  2. 系统找不到C:\ProgramData\Oracle\Java\javapath\java.exe问题及解决方案

    一.问题由来 前一段时间本人的电脑崩溃了,系统还原之后,eclipse就用不了,也找不大原因.eclipse报错原因是jvm出现问题:JVM terminated Exit code=2 C:\Pro ...

  3. spring再学习之基本概念

    二.spring之IOC与DI 注入的方式: set方法注入: 构造方法注入: 字段注入: 注入类型: 值类型注入:8中基本类型 引用类型注入: BeanFaactory是原始接口:功能比较单一. A ...

  4. P2P协议初步

    今天看到一个问题,如何把一个文件快速下发到100w个服务器 如果我们将文件集中式地放在一个服务器或缓存上的话,带宽.连接都会遇到问题. 树状:        1. 每个服务器既具有文件存储能力也应具有 ...

  5. C# 数据类型(3)

    动态类型 dynamic types 动态类型是后来引进的,他其实是一个static type,但是不像其他的静态类型,编译器不会检查你到底是啥类型(也不会检查你能不能去call某个'method') ...

  6. 记录一个状压DP用到的骚操作

    不断的让i=i^lowbit(i)就可以枚举i二进制里面所有的1 嘛,很显然,怕是我没想到哦

  7. javascript输出数据到文件

    function export(name, data) { var urlObject = window.URL || window.webkitURL || window var export_bl ...

  8. hihoCoder Challenge 3

    #1065 : 全图传送 时间限制:30000ms 单点时限:3000ms 内存限制:256MB 描述 先知法里奥是 Dota 系列中的一个英雄.机动性强,推塔能力一流,打钱速度快,传送技能使先知可以 ...

  9. input composition event All In One

    input composition event All In One input event compositionStart & compositionEnd & compositi ...

  10. js ^ operator

    js ^ operator 位运算 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Bitwis ...