using System;
using System.Data;
using System.Collections.Generic;
using System.Configuration;
using System.Text;
using System.IO;
using Oracle.ManagedDataAccess.Client;
using System.Reflection;
using System.Linq;
namespace Oracle11
{
///
/// Oracle数据库操作类
///
static class OracleHelper
{
public static void TestConnection(string connectionString)
{
using (OracleConnection con = new OracleConnection(connectionString))
{
con.Open();
}
}
///
/// 执行数据库非查询操作,返回受影响的行数
///
/// 数据库连接字符串
/// 命令的类型
/// 注意sql包含左斜杠会被拆分成多条语句执行
/// 命令参数集合
/// 当前操作影响的数据行数
public static int ExecuteNonQuery(string connectionString, string sql, params OracleParameter[] cmdParms)
{
var lines = sql.Split("/".ToCharArray(), StringSplitOptions.RemoveEmptyEntries).ToList();
OracleCommand cmd = new OracleCommand();
int val = 0;
using (OracleConnection conn = new OracleConnection(connectionString))
{
foreach (var line in lines)
{
PrepareCommand(cmd, conn, null, CommandType.Text, line, cmdParms);
val = cmd.ExecuteNonQuery();
cmd.Parameters.Clear();
}
}
return val;
}
public static void BatchInsert(OracleConnection conn, OracleTransaction trans,string sql, params OracleParameter[] cmdParms)
{
var cmd = conn.CreateCommand();
PrepareCommand(cmd, conn, trans, CommandType.Text, sql, cmdParms);
cmd.ExecuteNonQuery();
cmd.Parameters.Clear();
}
///
/// 执行数据库查询操作,返回DataTable类型的结果集
///
/// 数据库连接字符串
/// Oracle存储过程名称或PL/SQL命令
/// 命令参数集合
/// 当前查询操作返回的DataTable类型的结果集
public static DataTable ExecuteDataTable(string connectionString, string cmdText, params OracleParameter[] cmdParms)
{
OracleCommand cmd = new OracleCommand();
OracleConnection conn = new OracleConnection(connectionString);
DataTable dt = null;
try
{
PrepareCommand(cmd, conn, null, CommandType.Text, cmdText, cmdParms);
OracleDataAdapter adapter = new OracleDataAdapter();
adapter.SelectCommand = cmd;
dt = new DataTable();
adapter.Fill(dt);
cmd.Parameters.Clear();
}
catch
{
throw;
}
finally
{
cmd.Dispose();
conn.Close();
conn.Dispose();
}
return dt;
}
///
/// 将DataTable转换为泛型List
///
///
///
///
public static List TableToListClass(this DataTable dt) where T : new()
{
List ts = new List();
Type type = typeof(T);
string tempName = "";
foreach (DataRow dr in dt.Rows)
{
T t = new T();
// 获得此模型的公共属性
PropertyInfo[] propertys = t.GetType().GetProperties();
foreach (PropertyInfo pi in propertys)
{
tempName = pi.Name; // 检查DataTable是否包含此列
if (dt.Columns.Contains(tempName))
{
// 判断此属性是否有Setter
if (!pi.CanWrite) continue;
object value = dr[tempName];
if (value != DBNull.Value)
pi.SetValue(t, value, null);
}
}
ts.Add(t);
}
return ts;
}
///
/// 将DataTable转换为List,泛型类型为string、int、double等基础类型
///
///
///
///
public static List TableToListBcl(this DataTable dt)
{
List ts = new List();
foreach (DataRow dr in dt.Rows)
{
var valObj = dr[0];
var val = (T)Convert.ChangeType(valObj, typeof(T));
ts.Add(val);
}
return ts;
}
///
/// 将两列的DataTable转换为字典,key为第一列的值,value为第二列的值
///
///
///
public static Dictionary TableToDictionary(this DataTable dt)
{
Dictionary dic = new Dictionary();
foreach (DataRow dr in dt.Rows)
{
string key = dr[0].ToString();
string value = dr[1].ToString();
dic.Add(key, value);
}
return dic;
}
///
/// 执行数据库查询操作,返回结果集中位于第一行第一列的Object类型的值
///
/// 数据库连接字符串
/// 命令的类型
/// Oracle存储过程名称或PL/SQL命令
/// 命令参数集合
/// 当前查询操作返回的结果集中位于第一行第一列的Object类型的值
public static object ExecuteScalar(string connectionString, string cmdText, params OracleParameter[] cmdParms)
{
OracleCommand cmd = new OracleCommand();
OracleConnection conn = new OracleConnection(connectionString);
object result = null;
try
{
PrepareCommand(cmd, conn, null, CommandType.Text, cmdText, cmdParms);
result = cmd.ExecuteScalar();
cmd.Parameters.Clear();
}
catch (Exception ex)
{
throw;
}
finally
{
cmd.Dispose();
conn.Close();
conn.Dispose();
}
return result;
}
///
/// 执行数据库命令前的准备工作
///
/// Command对象
/// 数据库连接对象
/// 事务对象
/// Command类型
/// Oracle存储过程名称或PL/SQL命令
/// 命令参数集合
private static void PrepareCommand(OracleCommand cmd, OracleConnection conn, OracleTransaction trans, CommandType cmdType, string cmdText, OracleParameter[] cmdParms)
{
if (conn.State != ConnectionState.Open)
conn.Open();
cmd.Connection = conn;
cmd.CommandText = cmdText;
if (trans != null)
cmd.Transaction = trans;
cmd.CommandType = cmdType;
if (cmdParms != null)
{
foreach (OracleParameter parm in cmdParms)
cmd.Parameters.Add(parm);
}
}
///
/// 将.NET日期时间类型转化为Oracle兼容的日期时间格式字符串
///
/// .NET日期时间类型对象
/// Oracle兼容的日期时间格式字符串(如该字符串:TO_DATE('2007-12-1','YYYY-MM-DD'))
public static string GetOracleDateFormat(DateTime date)
{
return "TO_DATE('" + date.ToString("yyyy-M-dd") + "','YYYY-MM-DD')";
}
///
/// 将.NET日期时间类型转化为Oracle兼容的日期格式字符串
///
/// .NET日期时间类型对象
/// Oracle日期时间类型格式化限定符
/// Oracle兼容的日期时间格式字符串(如该字符串:TO_DATE('2007-12-1','YYYY-MM-DD'))
public static string GetOracleDateFormat(DateTime date, string format)
{
if (format == null || format.Trim() == "") format = "YYYY-MM-DD";
return "TO_DATE('" + date.ToString("yyyy-M-dd") + "','" + format + "')";
}
///
/// 将指定的关键字处理为模糊查询时的合法参数值
///
/// 待处理的查询关键字
/// 过滤后的查询关键字
public static string HandleLikeKey(string source)
{
if (source == null || source.Trim() == "") return null;
source = source.Replace("[", "[]]");
source = source.Replace("_", "[_]");
source = source.Replace("%", "[%]");
return ("%" + source + "%");
}
///
/// 执行存储过程
///
/// SqlServer数据库连接对象
/// 存储过程名
/// 存储过程参数
/// SqlDataReader对象
public static OracleDataReader RunStoredProcedure(OracleConnection connection, string storedProcName, IDataParameter[] parameters)
{
OracleDataReader returnReader = null;
connection.Open();
OracleCommand command = BuildSqlCommand(connection, storedProcName, parameters);
returnReader = command.ExecuteReader(CommandBehavior.CloseConnection);
return returnReader;
}
///
/// 构建SqlCommand对象
///
/// 数据库连接
/// 存储过程名
/// 存储过程参数
/// SqlCommand
private static OracleCommand BuildSqlCommand(OracleConnection connection, string storedProcName, IDataParameter[] parameters)
{
OracleCommand command = new OracleCommand(storedProcName, connection);
command.CommandType = CommandType.StoredProcedure;
foreach (OracleParameter parameter in parameters)
{
command.Parameters.Add(parameter);
}
return command;
}
}
}