OracleHelper.cs 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299
  1. using System;
  2. using System.Data;
  3. using System.Collections.Generic;
  4. using System.Configuration;
  5. using System.Text;
  6. using System.IO;
  7. using Oracle.ManagedDataAccess.Client;
  8. using System.Reflection;
  9. using System.Linq;
  10. namespace Oracle11
  11. {
  12. /// <summary>
  13. /// Oracle数据库操作类
  14. /// </summary>
  15. static class OracleHelper
  16. {
  17. public static void TestConnection(string connectionString)
  18. {
  19. using (OracleConnection con = new OracleConnection(connectionString))
  20. {
  21. con.Open();
  22. }
  23. }
  24. /// <summary>
  25. /// 执行数据库非查询操作,返回受影响的行数
  26. /// </summary>
  27. /// <param name="connectionString">数据库连接字符串</param>
  28. /// <param name="cmdType">命令的类型</param>
  29. /// <param name="sql">注意sql包含左斜杠会被拆分成多条语句执行</param>
  30. /// <param name="cmdParms">命令参数集合</param>
  31. /// <returns>当前操作影响的数据行数</returns>
  32. public static int ExecuteNonQuery(string connectionString, string sql, params OracleParameter[] cmdParms)
  33. {
  34. var lines = sql.Split("/".ToCharArray(), StringSplitOptions.RemoveEmptyEntries).ToList();
  35. OracleCommand cmd = new OracleCommand();
  36. int val = 0;
  37. using (OracleConnection conn = new OracleConnection(connectionString))
  38. {
  39. foreach (var line in lines)
  40. {
  41. PrepareCommand(cmd, conn, null, CommandType.Text, line, cmdParms);
  42. val = cmd.ExecuteNonQuery();
  43. cmd.Parameters.Clear();
  44. }
  45. }
  46. return val;
  47. }
  48. public static void BatchInsert(OracleConnection conn, OracleTransaction trans,string sql, params OracleParameter[] cmdParms)
  49. {
  50. var cmd = conn.CreateCommand();
  51. PrepareCommand(cmd, conn, trans, CommandType.Text, sql, cmdParms);
  52. cmd.ExecuteNonQuery();
  53. cmd.Parameters.Clear();
  54. }
  55. /// <summary>
  56. /// 执行数据库查询操作,返回DataTable类型的结果集
  57. /// </summary>
  58. /// <param name="connectionString">数据库连接字符串</param>
  59. /// <param name="cmdText">Oracle存储过程名称或PL/SQL命令</param>
  60. /// <param name="cmdParms">命令参数集合</param>
  61. /// <returns>当前查询操作返回的DataTable类型的结果集</returns>
  62. public static DataTable ExecuteDataTable(string connectionString, string cmdText, params OracleParameter[] cmdParms)
  63. {
  64. OracleCommand cmd = new OracleCommand();
  65. OracleConnection conn = new OracleConnection(connectionString);
  66. DataTable dt = null;
  67. try
  68. {
  69. PrepareCommand(cmd, conn, null, CommandType.Text, cmdText, cmdParms);
  70. OracleDataAdapter adapter = new OracleDataAdapter();
  71. adapter.SelectCommand = cmd;
  72. dt = new DataTable();
  73. adapter.Fill(dt);
  74. cmd.Parameters.Clear();
  75. }
  76. catch
  77. {
  78. throw;
  79. }
  80. finally
  81. {
  82. cmd.Dispose();
  83. conn.Close();
  84. conn.Dispose();
  85. }
  86. return dt;
  87. }
  88. /// <summary>
  89. /// 将DataTable转换为泛型List
  90. /// </summary>
  91. /// <typeparam name="T"></typeparam>
  92. /// <param name="dt"></param>
  93. /// <returns></returns>
  94. public static List<T> TableToListClass<T>(this DataTable dt) where T : new()
  95. {
  96. List<T> ts = new List<T>();
  97. Type type = typeof(T);
  98. string tempName = "";
  99. foreach (DataRow dr in dt.Rows)
  100. {
  101. T t = new T();
  102. // 获得此模型的公共属性
  103. PropertyInfo[] propertys = t.GetType().GetProperties();
  104. foreach (PropertyInfo pi in propertys)
  105. {
  106. tempName = pi.Name; // 检查DataTable是否包含此列
  107. if (dt.Columns.Contains(tempName))
  108. {
  109. // 判断此属性是否有Setter
  110. if (!pi.CanWrite) continue;
  111. object value = dr[tempName];
  112. if (value != DBNull.Value)
  113. pi.SetValue(t, value, null);
  114. }
  115. }
  116. ts.Add(t);
  117. }
  118. return ts;
  119. }
  120. /// <summary>
  121. /// 将DataTable转换为List,泛型类型为string、int、double等基础类型
  122. /// </summary>
  123. /// <typeparam name="T"></typeparam>
  124. /// <param name="dt"></param>
  125. /// <returns></returns>
  126. public static List<T> TableToListBcl<T>(this DataTable dt)
  127. {
  128. List<T> ts = new List<T>();
  129. foreach (DataRow dr in dt.Rows)
  130. {
  131. var valObj = dr[0];
  132. var val = (T)Convert.ChangeType(valObj, typeof(T));
  133. ts.Add(val);
  134. }
  135. return ts;
  136. }
  137. /// <summary>
  138. /// 将两列的DataTable转换为字典,key为第一列的值,value为第二列的值
  139. /// </summary>
  140. /// <param name="dt"></param>
  141. /// <returns></returns>
  142. public static Dictionary<string, string> TableToDictionary(this DataTable dt)
  143. {
  144. Dictionary<string, string> dic = new Dictionary<string, string>();
  145. foreach (DataRow dr in dt.Rows)
  146. {
  147. string key = dr[0].ToString();
  148. string value = dr[1].ToString();
  149. dic.Add(key, value);
  150. }
  151. return dic;
  152. }
  153. /// <summary>
  154. /// 执行数据库查询操作,返回结果集中位于第一行第一列的Object类型的值
  155. /// </summary>
  156. /// <param name="connectionString">数据库连接字符串</param>
  157. /// <param name="cmdType">命令的类型</param>
  158. /// <param name="cmdText">Oracle存储过程名称或PL/SQL命令</param>
  159. /// <param name="cmdParms">命令参数集合</param>
  160. /// <returns>当前查询操作返回的结果集中位于第一行第一列的Object类型的值</returns>
  161. public static object ExecuteScalar(string connectionString, string cmdText, params OracleParameter[] cmdParms)
  162. {
  163. OracleCommand cmd = new OracleCommand();
  164. OracleConnection conn = new OracleConnection(connectionString);
  165. object result = null;
  166. try
  167. {
  168. PrepareCommand(cmd, conn, null, CommandType.Text, cmdText, cmdParms);
  169. result = cmd.ExecuteScalar();
  170. cmd.Parameters.Clear();
  171. }
  172. catch (Exception ex)
  173. {
  174. throw;
  175. }
  176. finally
  177. {
  178. cmd.Dispose();
  179. conn.Close();
  180. conn.Dispose();
  181. }
  182. return result;
  183. }
  184. /// <summary>
  185. /// 执行数据库命令前的准备工作
  186. /// </summary>
  187. /// <param name="cmd">Command对象</param>
  188. /// <param name="conn">数据库连接对象</param>
  189. /// <param name="trans">事务对象</param>
  190. /// <param name="cmdType">Command类型</param>
  191. /// <param name="cmdText">Oracle存储过程名称或PL/SQL命令</param>
  192. /// <param name="cmdParms">命令参数集合</param>
  193. private static void PrepareCommand(OracleCommand cmd, OracleConnection conn, OracleTransaction trans, CommandType cmdType, string cmdText, OracleParameter[] cmdParms)
  194. {
  195. if (conn.State != ConnectionState.Open)
  196. conn.Open();
  197. cmd.Connection = conn;
  198. cmd.CommandText = cmdText;
  199. if (trans != null)
  200. cmd.Transaction = trans;
  201. cmd.CommandType = cmdType;
  202. if (cmdParms != null)
  203. {
  204. foreach (OracleParameter parm in cmdParms)
  205. cmd.Parameters.Add(parm);
  206. }
  207. }
  208. /// <summary>
  209. /// 将.NET日期时间类型转化为Oracle兼容的日期时间格式字符串
  210. /// </summary>
  211. /// <param name="date">.NET日期时间类型对象</param>
  212. /// <returns>Oracle兼容的日期时间格式字符串(如该字符串:TO_DATE('2007-12-1','YYYY-MM-DD'))</returns>
  213. public static string GetOracleDateFormat(DateTime date)
  214. {
  215. return "TO_DATE('" + date.ToString("yyyy-M-dd") + "','YYYY-MM-DD')";
  216. }
  217. /// <summary>
  218. /// 将.NET日期时间类型转化为Oracle兼容的日期格式字符串
  219. /// </summary>
  220. /// <param name="date">.NET日期时间类型对象</param>
  221. /// <param name="format">Oracle日期时间类型格式化限定符</param>
  222. /// <returns>Oracle兼容的日期时间格式字符串(如该字符串:TO_DATE('2007-12-1','YYYY-MM-DD'))</returns>
  223. public static string GetOracleDateFormat(DateTime date, string format)
  224. {
  225. if (format == null || format.Trim() == "") format = "YYYY-MM-DD";
  226. return "TO_DATE('" + date.ToString("yyyy-M-dd") + "','" + format + "')";
  227. }
  228. /// <summary>
  229. /// 将指定的关键字处理为模糊查询时的合法参数值
  230. /// </summary>
  231. /// <param name="source">待处理的查询关键字</param>
  232. /// <returns>过滤后的查询关键字</returns>
  233. public static string HandleLikeKey(string source)
  234. {
  235. if (source == null || source.Trim() == "") return null;
  236. source = source.Replace("[", "[]]");
  237. source = source.Replace("_", "[_]");
  238. source = source.Replace("%", "[%]");
  239. return ("%" + source + "%");
  240. }
  241. /// <summary>
  242. /// 执行存储过程
  243. /// </summary>
  244. /// <param name="connection">SqlServer数据库连接对象</param>
  245. /// <param name="storedProcName">存储过程名</param>
  246. /// <param name="parameters">存储过程参数</param>
  247. /// <returns>SqlDataReader对象</returns>
  248. public static OracleDataReader RunStoredProcedure(OracleConnection connection, string storedProcName, IDataParameter[] parameters)
  249. {
  250. OracleDataReader returnReader = null;
  251. connection.Open();
  252. OracleCommand command = BuildSqlCommand(connection, storedProcName, parameters);
  253. returnReader = command.ExecuteReader(CommandBehavior.CloseConnection);
  254. return returnReader;
  255. }
  256. /// <summary>
  257. /// 构建SqlCommand对象
  258. /// </summary>
  259. /// <param name="connection">数据库连接</param>
  260. /// <param name="storedProcName">存储过程名</param>
  261. /// <param name="parameters">存储过程参数</param>
  262. /// <returns>SqlCommand</returns>
  263. private static OracleCommand BuildSqlCommand(OracleConnection connection, string storedProcName, IDataParameter[] parameters)
  264. {
  265. OracleCommand command = new OracleCommand(storedProcName, connection);
  266. command.CommandType = CommandType.StoredProcedure;
  267. foreach (OracleParameter parameter in parameters)
  268. {
  269. command.Parameters.Add(parameter);
  270. }
  271. return command;
  272. }
  273. }
  274. }