DataHelper.cs 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404
  1. using Oracle.ManagedDataAccess.Client;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Data;
  5. using System.Linq;
  6. using System.Text;
  7. using System.Threading.Tasks;
  8. namespace UAS_XmlAnalysor
  9. {
  10. class DataHelper
  11. {
  12. //系统默认的的连接字符串
  13. private string ConnectionStrings = Properties.Settings.Default.Properties["MES"].DefaultValue.ToString();
  14. //用户选择的数据库的连接字符串
  15. public static string DBConnectionString;
  16. public static OracleConnection connection = null;
  17. OracleCommand command = new OracleCommand();
  18. /// <summary>
  19. /// 执行构造函数的时候打开数据库的链接
  20. /// </summary>
  21. public DataHelper()
  22. {
  23. try
  24. {
  25. //如果选择的是默认数据则直接用配置文件的信息连接,否则选择数据库的账套信息
  26. if (DBConnectionString == null || DBConnectionString == ConnectionStrings)
  27. connection = new OracleConnection(ConnectionStrings);
  28. else
  29. connection = new OracleConnection(DBConnectionString);
  30. command.Connection = connection;
  31. command.Connection.Open();
  32. command.CommandTimeout = 0;
  33. }
  34. catch (Exception)
  35. {
  36. //如果选择的是默认数据则直接用配置文件的信息连接,否则选择数据库的账套信息
  37. if (DBConnectionString == null || DBConnectionString == ConnectionStrings)
  38. connection = new OracleConnection(ConnectionStrings);
  39. else
  40. connection = new OracleConnection(DBConnectionString);
  41. try
  42. {
  43. command.Connection = connection;
  44. command.Connection.Open();
  45. }
  46. catch (Exception)
  47. {
  48. return;
  49. }
  50. command.CommandTimeout = 0;
  51. }
  52. }
  53. /// <summary>
  54. /// 获取第一行第一列的信息
  55. /// </summary>
  56. public object getFieldDataByCondition(string TableName, string Field, string Condition)
  57. {
  58. DataTable dt = new DataTable();
  59. string sql = "select " + Field + " from " + TableName + " where " + Condition;
  60. command.CommandText = sql;
  61. command.CommandType = CommandType.Text;
  62. Reconnect(command);
  63. OracleDataAdapter ad = new OracleDataAdapter();
  64. ad.SelectCommand = command;
  65. try
  66. {
  67. ad.Fill(dt);
  68. }
  69. catch (Exception)
  70. {
  71. connection = new OracleConnection(DBConnectionString);
  72. connection.Open();
  73. command.Connection = connection;
  74. ad = new OracleDataAdapter();
  75. ad.SelectCommand = command;
  76. ad.Fill(dt);
  77. }
  78. ad.Dispose();
  79. if (dt.Rows.Count > 0)
  80. {
  81. return dt.Rows[0][0];
  82. }
  83. else
  84. {
  85. return "";
  86. }
  87. }
  88. /// <summary>
  89. /// 通过表名和获取单行的记录
  90. /// </summary>
  91. public DataTable getFieldsDataByCondition(string TableName, string[] Fields, string Condition)
  92. {
  93. DataTable dt = new DataTable();
  94. string sql = "select ";
  95. sql += AddField(Fields);
  96. sql += " from " + TableName + " where " + Condition + " and rownum=1";
  97. command.CommandText = sql;
  98. command.CommandType = CommandType.Text;
  99. Reconnect(command);
  100. OracleDataAdapter ad = new OracleDataAdapter(command);
  101. try
  102. {
  103. ad.Fill(dt);
  104. }
  105. catch (Exception)
  106. {
  107. connection = new OracleConnection(DBConnectionString);
  108. connection.Open();
  109. command.Connection = connection;
  110. ad = new OracleDataAdapter();
  111. ad.SelectCommand = command;
  112. ad.Fill(dt);
  113. }
  114. ad.Dispose();
  115. return dt;
  116. }
  117. /// <summary>
  118. /// 通过表名,字段和条件获取DataTable类型的数据
  119. /// </summary>
  120. public DataTable getFieldsDatasByCondition(string TableName, string[] Fields, string Condition)
  121. {
  122. DataTable dt = new DataTable();
  123. string sql = "select ";
  124. sql += AddField(Fields);
  125. sql += " from " + TableName + " where " + Condition;
  126. command.CommandText = sql;
  127. command.CommandType = CommandType.Text;
  128. Reconnect(command);
  129. OracleDataAdapter ad = new OracleDataAdapter(command);
  130. try
  131. {
  132. ad.Fill(dt);
  133. }
  134. catch (Exception)
  135. {
  136. connection = new OracleConnection(DBConnectionString);
  137. connection.Open();
  138. command.Connection = connection;
  139. ad = new OracleDataAdapter();
  140. ad.SelectCommand = command;
  141. ad.Fill(dt);
  142. }
  143. ad.Dispose();
  144. return dt;
  145. }
  146. /// <summary>
  147. /// 检测内容是否存在
  148. /// </summary>
  149. /// <param name="TableName"></param>
  150. /// <param name="Condition"></param>
  151. /// <returns></returns>
  152. public bool CheckExist(string TableName, string Condition)
  153. {
  154. string sql = "select count(1) from " + TableName + " where " + Condition;
  155. command.CommandText = sql;
  156. command.CommandType = CommandType.Text;
  157. Reconnect(command);
  158. OracleDataAdapter ad = new OracleDataAdapter(command);
  159. DataTable dt = new DataTable();
  160. ad.Fill(dt);
  161. ad.Dispose();
  162. return int.Parse(dt.Rows[0][0].ToString()) > 0;
  163. }
  164. /// <summary>
  165. /// 直接执行SQL,同时传入SQL的类型
  166. /// </summary>
  167. /// <param name="SQL"></param>
  168. /// <param name="Type"></param>
  169. /// <returns></returns>
  170. public object ExecuteSql(string SQL, string Type, params object[] names)
  171. {
  172. command.Parameters.Clear();
  173. object result = null;
  174. command.CommandText = SQL;
  175. command.CommandType = CommandType.Text;
  176. Reconnect(command);
  177. //用来拼接参数的
  178. if (names.Length > 0)
  179. {
  180. string[] par = SQL.Split(':');
  181. //用来存参数的数组
  182. StringBuilder[] addpar = new StringBuilder[par.Length - 1];
  183. for (int i = 0; i < par.Length - 1; i++)
  184. {
  185. //新建一个char类型的数组用来存储每个字节的变量
  186. char[] c = par[i + 1].ToCharArray();
  187. addpar[i] = new StringBuilder();
  188. for (int j = 0; j < c.Length; j++)
  189. {
  190. if (c[j] != ' ' && c[j] != ',')
  191. {
  192. addpar[i].Append(c[j]);
  193. }
  194. else
  195. {
  196. break;
  197. }
  198. }
  199. }
  200. for (int i = 0; i < addpar.Length; i++)
  201. command.Parameters.Add(new OracleParameter(addpar[i].ToString(), OracleDbType.Varchar2, names[i], ParameterDirection.Input));
  202. }
  203. switch (Type.ToUpper())
  204. {
  205. case "SELECT":
  206. OracleDataAdapter ad = new OracleDataAdapter(command);
  207. result = new DataTable();
  208. try
  209. {
  210. ad.Fill((DataTable)result);
  211. }
  212. catch (Exception)
  213. {
  214. connection = new OracleConnection(DBConnectionString);
  215. connection.Open();
  216. command.Connection = connection;
  217. ad = new OracleDataAdapter();
  218. ad.SelectCommand = command;
  219. ad.Fill((DataTable)result);
  220. }
  221. break;
  222. case "DELETE":
  223. try
  224. {
  225. result = command.ExecuteNonQuery();
  226. }
  227. catch (Exception)
  228. {
  229. command.Connection = new OracleConnection(DBConnectionString);
  230. command.Connection.Open();
  231. result = command.ExecuteNonQuery();
  232. }
  233. break;
  234. case "UPDATE":
  235. try
  236. {
  237. result = command.ExecuteNonQuery();
  238. }
  239. catch (Exception)
  240. {
  241. command.Connection = new OracleConnection(DBConnectionString);
  242. command.Connection.Open();
  243. result = command.ExecuteNonQuery();
  244. }
  245. break;
  246. case "INSERT":
  247. try
  248. {
  249. result = command.ExecuteNonQuery();
  250. }
  251. catch (Exception)
  252. {
  253. command.Connection = new OracleConnection(DBConnectionString);
  254. command.Connection.Open();
  255. result = command.ExecuteNonQuery();
  256. }
  257. break;
  258. }
  259. return result;
  260. }
  261. /// <summary>
  262. /// 批量通过SQL来执行插入操作 ,参数的第一个数一个string[]数组,用来传递需要添加的参数的名称
  263. /// 之后的是名称参数数组对应的 ,所有的插入参数数据长度必须是一致的
  264. /// </summary>
  265. /// <param name="sql"></param>
  266. /// <param name="names"></param>
  267. public void BatchInsert(string sql, params object[][] names)
  268. {
  269. command.Parameters.Clear();
  270. command.CommandText = sql;
  271. Reconnect(command);
  272. command.ArrayBindCount = names[1].Length;
  273. //因为第一个数组保存的是参数的名称,所以循环从1而不是0开始
  274. //将第一个数组的下标固定为0作为循环添加的参数的名称
  275. for (int i = 1; i <= names[0].Length; i++)
  276. {
  277. command.Parameters.Add(new OracleParameter(names[0][i - 1].ToString(), OracleDbType.Varchar2, names[i], ParameterDirection.Input));
  278. }
  279. try
  280. {
  281. command.ExecuteNonQuery();
  282. command.ArrayBindCount = 0;
  283. }
  284. catch (Exception)
  285. {
  286. command.Connection = new OracleConnection(DBConnectionString);
  287. command.Connection.Open();
  288. command.ExecuteNonQuery();
  289. command.ArrayBindCount = 0;
  290. }
  291. }
  292. /// <summary>
  293. /// 调用存储过程
  294. /// </summary>
  295. /// <param name="ProcedureName"></param>
  296. /// <param name="param"></param>
  297. public void CallProcedure(string ProcedureName, ref string[] param)
  298. {
  299. command.Parameters.Clear();
  300. command.CommandText = ProcedureName;
  301. command.CommandType = CommandType.StoredProcedure;
  302. Reconnect(command);
  303. for (int i = 0; i < param.Length; i++)
  304. command.Parameters.Add(new OracleParameter(param[i].ToString(), OracleDbType.Varchar2, 200, param[i], ParameterDirection.InputOutput));
  305. try
  306. {
  307. command.ExecuteNonQuery();
  308. }
  309. catch (Exception)
  310. {
  311. command.Connection = new OracleConnection(DBConnectionString);
  312. command.Connection.Open();
  313. command.ExecuteNonQuery();
  314. }
  315. for (int i = 0; i < command.Parameters.Count; i++)
  316. param[i] = command.Parameters[i].Value.ToString();
  317. }
  318. /// <summary>
  319. /// 用于将string 的数组转换成SQL的查询内容
  320. /// </summary>
  321. /// <param name="Fields"></param>
  322. /// <returns></returns>
  323. private string AddField(string[] Fields)
  324. {
  325. string sql = " ";
  326. foreach (string field in Fields)
  327. {
  328. sql += field + ",";
  329. }
  330. return sql.Substring(0, sql.Length - 1);
  331. }
  332. /// <summary>
  333. /// 通过查询的语句获取查询的字段
  334. /// </summary>
  335. /// <param name="field"></param>
  336. /// <returns></returns>
  337. private static string[] GetField(string field)
  338. {
  339. string[] fields = field.Split(',');
  340. for (int i = 0; i < fields.Length; i++)
  341. {
  342. fields[i] = fields[i].Substring(fields[i].LastIndexOf("as") + 2, fields[i].Length - fields[i].LastIndexOf("as") - 2).Trim();
  343. }
  344. return fields;
  345. }
  346. public static string[] GetParamFromSQL(string SQL)
  347. {
  348. string[] par = SQL.Split(':');
  349. //用来存参数的数组
  350. StringBuilder[] addpar = new StringBuilder[par.Length - 1];
  351. string[] param = new string[par.Length - 1];
  352. for (int i = 0; i < par.Length - 1; i++)
  353. {
  354. //新建一个char类型的数组用来存储每个字节的变量
  355. char[] c = par[i + 1].ToCharArray();
  356. addpar[i] = new StringBuilder();
  357. for (int j = 0; j < c.Length; j++)
  358. {
  359. if (c[j] != ' ' && c[j] != ',' && c[j] != ')')
  360. {
  361. addpar[i].Append(c[j]);
  362. }
  363. else
  364. {
  365. break;
  366. }
  367. }
  368. }
  369. for (int i = 0; i < par.Length - 1; i++)
  370. {
  371. param[i] = addpar[i].ToString();
  372. }
  373. return param;
  374. }
  375. public void Dispose()
  376. {
  377. command.Dispose();
  378. connection.Dispose();
  379. }
  380. private void Reconnect(OracleCommand cmd)
  381. {
  382. if (cmd.Connection.State == ConnectionState.Closed)
  383. {
  384. cmd.Connection.Open();
  385. }
  386. }
  387. }
  388. }