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; } } }