DataHelper.cs 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675
  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 = null;
  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. connection.Open();
  31. command = new OracleCommand();
  32. command.Connection = connection;
  33. command.CommandTimeout = 0;
  34. }
  35. catch (Exception) { }
  36. }
  37. /// <summary>
  38. /// 获取第一行第一列的信息
  39. /// </summary>
  40. public object getFieldDataByCondition(string TableName, string Field, string Condition)
  41. {
  42. DataTable dt = new DataTable();
  43. string sql = "select " + Field + " from " + TableName + " where " + Condition;
  44. command.CommandText = sql;
  45. command.CommandType = CommandType.Text;
  46. Reconnect(command);
  47. OracleDataAdapter ad = new OracleDataAdapter();
  48. ad.SelectCommand = command;
  49. try
  50. {
  51. ad.Fill(dt);
  52. }
  53. catch (Exception)
  54. {
  55. connection = new OracleConnection(DBConnectionString);
  56. connection.Open();
  57. command.Connection = connection;
  58. ad = new OracleDataAdapter();
  59. ad.SelectCommand = command;
  60. ad.Fill(dt);
  61. }
  62. ad.Dispose();
  63. if (dt.Rows.Count > 0)
  64. {
  65. return dt.Rows[0][0];
  66. }
  67. else
  68. {
  69. return "";
  70. }
  71. }
  72. /// <summary>
  73. /// 通过表名和获取单行的记录
  74. /// </summary>
  75. public DataTable getFieldsDataByCondition(string TableName, string[] Fields, string Condition)
  76. {
  77. DataTable dt = new DataTable();
  78. string sql = "select ";
  79. sql += AddField(Fields);
  80. sql += " from " + TableName + " where " + Condition + " and rownum=1";
  81. command.CommandText = sql;
  82. command.CommandType = CommandType.Text;
  83. Reconnect(command);
  84. OracleDataAdapter ad = new OracleDataAdapter(command);
  85. try
  86. {
  87. ad.Fill(dt);
  88. }
  89. catch (Exception)
  90. {
  91. connection = new OracleConnection(DBConnectionString);
  92. connection.Open();
  93. command.Connection = connection;
  94. ad = new OracleDataAdapter();
  95. ad.SelectCommand = command;
  96. ad.Fill(dt);
  97. }
  98. ad.Dispose();
  99. return dt;
  100. }
  101. /// <summary>
  102. /// 通过表名,字段和条件获取DataTable类型的数据
  103. /// </summary>
  104. public DataTable getFieldsDatasByCondition(string TableName, string[] Fields, string Condition)
  105. {
  106. DataTable dt = new DataTable();
  107. string sql = "select ";
  108. sql += AddField(Fields);
  109. sql += " from " + TableName + " where " + Condition;
  110. command.CommandText = sql;
  111. command.CommandType = CommandType.Text;
  112. Reconnect(command);
  113. OracleDataAdapter ad = new OracleDataAdapter(command);
  114. try
  115. {
  116. ad.Fill(dt);
  117. }
  118. catch (Exception)
  119. {
  120. connection = new OracleConnection(DBConnectionString);
  121. connection.Open();
  122. command.Connection = connection;
  123. ad = new OracleDataAdapter();
  124. ad.SelectCommand = command;
  125. ad.Fill(dt);
  126. }
  127. ad.Dispose();
  128. return dt;
  129. }
  130. /// <summary>
  131. /// 检测内容是否存在
  132. /// </summary>
  133. /// <param name="TableName"></param>
  134. /// <param name="Condition"></param>
  135. /// <returns></returns>
  136. public bool CheckExist(string TableName, string Condition)
  137. {
  138. string sql = "select count(1) from " + TableName + " where " + Condition;
  139. command.CommandText = sql;
  140. command.CommandType = CommandType.Text;
  141. Reconnect(command);
  142. OracleDataAdapter ad = new OracleDataAdapter(command);
  143. DataTable dt = new DataTable();
  144. ad.Fill(dt);
  145. ad.Dispose();
  146. return int.Parse(dt.Rows[0][0].ToString()) > 0;
  147. }
  148. /// <summary>
  149. /// 直接执行SQL,同时传入SQL的类型
  150. /// </summary>
  151. /// <param name="SQL"></param>
  152. /// <param name="Type"></param>
  153. /// <returns></returns>
  154. public object ExecuteSql(string SQL, string Type, params object[] names)
  155. {
  156. command.Parameters.Clear();
  157. object result = null;
  158. command.CommandText = SQL;
  159. command.CommandType = CommandType.Text;
  160. Reconnect(command);
  161. //用来拼接参数的
  162. if (names.Length > 0)
  163. {
  164. string[] par = SQL.Split(':');
  165. //用来存参数的数组
  166. StringBuilder[] addpar = new StringBuilder[par.Length - 1];
  167. for (int i = 0; i < par.Length - 1; i++)
  168. {
  169. //新建一个char类型的数组用来存储每个字节的变量
  170. char[] c = par[i + 1].ToCharArray();
  171. addpar[i] = new StringBuilder();
  172. for (int j = 0; j < c.Length; j++)
  173. {
  174. if (c[j] != ' ' && c[j] != ',')
  175. {
  176. addpar[i].Append(c[j]);
  177. }
  178. else
  179. {
  180. break;
  181. }
  182. }
  183. }
  184. for (int i = 0; i < addpar.Length; i++)
  185. command.Parameters.Add(new OracleParameter(addpar[i].ToString(), OracleDbType.Varchar2, names[i], ParameterDirection.Input));
  186. }
  187. switch (Type.ToUpper())
  188. {
  189. case "SELECT":
  190. OracleDataAdapter ad = new OracleDataAdapter(command);
  191. result = new DataTable();
  192. try
  193. {
  194. ad.Fill((DataTable)result);
  195. }
  196. catch (Exception)
  197. {
  198. connection = new OracleConnection(DBConnectionString);
  199. connection.Open();
  200. command.Connection = connection;
  201. ad = new OracleDataAdapter();
  202. ad.SelectCommand = command;
  203. ad.Fill((DataTable)result);
  204. }
  205. break;
  206. case "DELETE":
  207. try
  208. {
  209. result = command.ExecuteNonQuery();
  210. }
  211. catch (Exception)
  212. {
  213. command.Connection = new OracleConnection(DBConnectionString);
  214. command.Connection.Open();
  215. result = command.ExecuteNonQuery();
  216. }
  217. break;
  218. case "UPDATE":
  219. try
  220. {
  221. result = command.ExecuteNonQuery();
  222. }
  223. catch (Exception)
  224. {
  225. command.Connection = new OracleConnection(DBConnectionString);
  226. command.Connection.Open();
  227. result = command.ExecuteNonQuery();
  228. }
  229. break;
  230. case "INSERT":
  231. try
  232. {
  233. result = command.ExecuteNonQuery();
  234. }
  235. catch (Exception)
  236. {
  237. command.Connection = new OracleConnection(DBConnectionString);
  238. command.Connection.Open();
  239. result = command.ExecuteNonQuery();
  240. }
  241. break;
  242. }
  243. return result;
  244. }
  245. /// <summary>
  246. /// 取Configs表中的配置,进行该客户是否执行某个操作
  247. /// </summary>
  248. /// <param name="Code"></param>
  249. /// <param name="Caller"></param>
  250. /// <returns></returns>
  251. public object GetConfig(string Code, string Caller)
  252. {
  253. DataTable dt = new DataTable();
  254. string sql = "select Data from configs where code='" + Code + "' and caller='" + Caller + "'";
  255. dt = (DataTable)ExecuteSql(sql, "select");
  256. if (dt.Rows.Count == 0)
  257. {
  258. return "";
  259. }
  260. else
  261. {
  262. return dt.Rows[0]["Data"];
  263. }
  264. }
  265. /// <summary>
  266. /// 获取指定表的记录的条数 ,带条件
  267. /// </summary>
  268. /// <returns></returns>
  269. public int getRowCount(string TableName, string Condition)
  270. {
  271. DataTable dt = new DataTable();
  272. string sql = "select count(1) from " + TableName + " where " + Condition;
  273. command.CommandText = sql;
  274. command.CommandType = CommandType.Text;
  275. Reconnect(command);
  276. OracleDataAdapter ad = new OracleDataAdapter(command);
  277. ad.Fill(dt);
  278. ad.Dispose();
  279. return int.Parse(dt.Rows[0][0].ToString());
  280. }
  281. /// <summary>
  282. /// 根据Caller获取流水号
  283. /// </summary>
  284. /// <param name="Caller"></param>
  285. /// <returns></returns>
  286. public string GetSerialNumberByCaller(string Caller)
  287. {
  288. string SerialNumber = getFieldDataByCondition("MaxNumbers", "mn_number", "mn_tablename='" + Caller + "'").ToString();
  289. UpdateByCondition("MaxNumbers", "mn_number=mn_number+1", "mn_tablename='" + Caller + "'");
  290. return SerialNumber;
  291. }
  292. /// <summary>
  293. /// 根据主键ID删除表的数据
  294. /// </summary>
  295. /// <param name="TableName">表名</param>
  296. /// <param name="ID">主键</param>
  297. /// <param name="DeleteID">需要删除主键ID的数组</param>
  298. public void DeleteDataByID(string TableName, string ID, string[] DeleteID)
  299. {
  300. command.Parameters.Clear();
  301. string sql = "delete from " + TableName + " where " + ID + " =:DeleteID";
  302. command.CommandText = sql;
  303. Reconnect(command);
  304. command.ArrayBindCount = DeleteID.Length;
  305. command.Parameters.Add(new OracleParameter("DeleteID", OracleDbType.Long, DeleteID, ParameterDirection.Input));
  306. try
  307. {
  308. command.ExecuteNonQuery();
  309. }
  310. catch (Exception)
  311. {
  312. command.Connection = new OracleConnection(DBConnectionString);
  313. command.Connection.Open();
  314. command.ExecuteNonQuery();
  315. }
  316. }
  317. /// <summary>
  318. /// 通过序列的名称获取序列
  319. /// </summary>
  320. /// <param name="SeqName"></param>
  321. /// <returns></returns>
  322. public string GetSEQ(string SeqName)
  323. {
  324. DataTable dt = new DataTable();
  325. dt = (DataTable)ExecuteSql("SELECT " + SeqName + ".NEXTVAL FROM DUAL", "select");
  326. return dt.Rows[0][0].ToString();
  327. }
  328. /// <summary>
  329. /// 通过序列的名称获取序列
  330. /// </summary>
  331. /// <param name="SeqName"></param>
  332. /// <returns></returns>
  333. public string[] GetSEQ(string SeqName, int Num)
  334. {
  335. DataTable dt = new DataTable();
  336. dt = (DataTable)ExecuteSql("select " + SeqName + ".nextval from (select 1 from OQCITEMSAMPLES where rownum<" + (Num + 1) + ")", "select");
  337. string[] SerialNum = new string[dt.Rows.Count];
  338. for (int i = 0; i < dt.Rows.Count; i++)
  339. {
  340. SerialNum[i] = dt.Rows[i][0].ToString();
  341. }
  342. return SerialNum;
  343. }
  344. public void SaveDataTable(DataTable dt, string TableName, string ID, params string[] sql)
  345. {
  346. if (dt == null)
  347. {
  348. return;
  349. }
  350. StringBuilder sb = new StringBuilder();
  351. //预防插入的DataTable中存在不属于该表的列,在进行下一步操作之前全部剔除
  352. DataTable data = (DataTable)ExecuteSql("select Column_Name,Data_Type from cols where TABLE_name=upper('" + TableName + "')", "select");
  353. //将所有的字段拼接起来
  354. for (int i = 0; i < data.Rows.Count; i++)
  355. {
  356. sb.Append("#" + data.Rows[i]["Column_Name"].ToString());
  357. }
  358. //移除掉所有不属于该表的列
  359. for (int i = dt.Columns.Count - 1; i >= 0; i--)
  360. {
  361. if (!sb.ToString().Contains(dt.Columns[i].ColumnName.ToUpper()))
  362. {
  363. dt.Columns.RemoveAt(i);
  364. }
  365. }
  366. sb.Clear();
  367. //计算有多少个是新加的行,根据主键为空来进行判断
  368. int NewRowCount = 0;
  369. for (int i = 0; i < dt.Rows.Count; i++)
  370. {
  371. if (dt.Rows[i][ID] == null || dt.Rows[i][ID].ToString() == "")
  372. {
  373. NewRowCount = NewRowCount + 1;
  374. }
  375. }
  376. if (sql.Length > 0)
  377. {
  378. if (NewRowCount > 0)
  379. {
  380. //获取参数的个数
  381. int paramsNum = sql[0].Split(':').Length - 1;
  382. //解析参数的数据
  383. string[] param = GetParamFromSQL(sql[0]);
  384. //新建一个二维数组去
  385. string[][] param_array = new string[paramsNum][];
  386. //实例化每个一维数组
  387. for (int i = 0; i < paramsNum; i++)
  388. {
  389. param_array[i] = new string[NewRowCount];
  390. }
  391. //设置每列参数的索引
  392. int num = 0;
  393. //变量所有的行,如果有主键为空的则移除,不为空的进行参数的拼接
  394. for (int i = dt.Rows.Count - 1; i >= 0; i--)
  395. {
  396. if (dt.Rows[i][ID] == null || dt.Rows[i][ID].ToString() == "")
  397. {
  398. //当为新添加行的时候才去设置参数,设置过后索引+1
  399. for (int j = 0; j < paramsNum; j++)
  400. {
  401. param_array[j][num] = dt.Rows[i][param[j]].ToString();
  402. }
  403. dt.Rows.RemoveAt(i);
  404. num++;
  405. }
  406. }
  407. BatchInsertDataTable(sql[0], param, param_array);
  408. }
  409. }
  410. sb.Clear();
  411. sb.Append("update " + TableName + " set ");
  412. int ColumnCount = dt.Columns.Count;
  413. int RowCount = dt.Rows.Count;
  414. //存数据的参数
  415. List<string[]> Parameter = new List<string[]>();
  416. //存参数名的参数
  417. string[] ParName = new string[ColumnCount];
  418. for (int i = 0; i < ColumnCount; i++)
  419. {
  420. ParName[i] = dt.Columns[i].ColumnName;
  421. if (i == dt.Columns.Count - 1)
  422. sb.Append(dt.Columns[i].ColumnName + "=:" + dt.Columns[i].ColumnName);
  423. else
  424. sb.Append(dt.Columns[i].ColumnName + "=:" + dt.Columns[i].ColumnName + ",");
  425. }
  426. sb.Append(" where " + ID + " =:" + ID);
  427. //先添加参数
  428. Parameter.Add(ParName);
  429. //添加参数的具体内容
  430. for (int i = 0; i < ColumnCount; i++)
  431. {
  432. string[] par = new string[RowCount];
  433. for (int j = 0; j < RowCount; j++)
  434. {
  435. par[j] = dt.Rows[j][i].ToString();
  436. }
  437. Parameter.Add(par);
  438. }
  439. BatchInsert(sb.ToString(), Parameter.ToArray());
  440. }
  441. /// <summary>
  442. /// 批量通过SQL来执行插入操作 ,参数的第一个数一个string[]数组,用来传递需要添加的参数的名称
  443. /// 之后的是名称参数数组对应的 ,所有的插入参数数据长度必须是一致的
  444. /// </summary>
  445. /// <param name="sql"></param>
  446. /// <param name="names"></param>
  447. public void BatchInsert(string sql, params object[][] names)
  448. {
  449. command.Parameters.Clear();
  450. command.CommandText = sql;
  451. Reconnect(command);
  452. command.ArrayBindCount = names[1].Length;
  453. //因为第一个数组保存的是参数的名称,所以循环从1而不是0开始
  454. //将第一个数组的下标固定为0作为循环添加的参数的名称
  455. for (int i = 1; i <= names[0].Length; i++)
  456. {
  457. command.Parameters.Add(new OracleParameter(names[0][i - 1].ToString(), OracleDbType.Varchar2, names[i], ParameterDirection.Input));
  458. }
  459. try
  460. {
  461. command.ExecuteNonQuery();
  462. }
  463. catch (Exception)
  464. {
  465. command.Connection = new OracleConnection(DBConnectionString);
  466. command.Connection.Open();
  467. command.ExecuteNonQuery();
  468. }
  469. }
  470. public void BatchInsertDataTable(string sql, string[] param, params object[][] param1)
  471. {
  472. command.Parameters.Clear();
  473. command.CommandText = sql;
  474. Reconnect(command);
  475. command.ArrayBindCount = param1[0].Length;
  476. //因为第一个数组保存的是参数的名称,所以循环从1而不是0开始
  477. //将第一个数组的下标固定为0作为循环添加的参数的名称
  478. for (int i = 0; i < param.Length; i++)
  479. {
  480. command.Parameters.Add(new OracleParameter(param[i].ToString(), OracleDbType.Varchar2, param1[i], ParameterDirection.Input));
  481. }
  482. try
  483. {
  484. command.ExecuteNonQuery();
  485. }
  486. catch (Exception)
  487. {
  488. command.Connection = new OracleConnection(DBConnectionString);
  489. command.Connection.Open();
  490. command.ExecuteNonQuery();
  491. }
  492. }
  493. /// <summary>
  494. /// 通过条件更新
  495. /// </summary>
  496. /// <param name="TableName"></param>
  497. /// <param name="update"></param>
  498. /// <param name="condition"></param>
  499. public string UpdateByCondition(string TableName, string update, string condition)
  500. {
  501. string sql = "update " + TableName + " set " + update + " where " + condition;
  502. command.CommandText = sql;
  503. command.CommandType = CommandType.Text;
  504. Reconnect(command);
  505. try
  506. {
  507. command.ExecuteNonQuery();
  508. }
  509. catch (Exception)
  510. {
  511. command.Connection = new OracleConnection(DBConnectionString);
  512. command.Connection.Open();
  513. command.ExecuteNonQuery();
  514. }
  515. return sql;
  516. }
  517. /// <summary>
  518. /// 调用存储过程
  519. /// </summary>
  520. /// <param name="ProcedureName"></param>
  521. /// <param name="param"></param>
  522. public void CallProcedure(string ProcedureName, ref string[] param)
  523. {
  524. command.Parameters.Clear();
  525. command.CommandText = ProcedureName;
  526. command.CommandType = CommandType.StoredProcedure;
  527. Reconnect(command);
  528. for (int i = 0; i < param.Length; i++)
  529. command.Parameters.Add(new OracleParameter(param[i].ToString(), OracleDbType.Varchar2, 200, param[i], ParameterDirection.InputOutput));
  530. try
  531. {
  532. command.ExecuteNonQuery();
  533. }
  534. catch (Exception)
  535. {
  536. command.Connection = new OracleConnection(DBConnectionString);
  537. command.Connection.Open();
  538. command.ExecuteNonQuery();
  539. }
  540. for (int i = 0; i < command.Parameters.Count; i++)
  541. param[i] = command.Parameters[i].Value.ToString();
  542. }
  543. /// <summary>
  544. /// 出现异常进行回滚的执行方法
  545. /// </summary>
  546. /// <param name="SQL"></param>
  547. public void ExecuteSQLTran(params string[] SQL)
  548. {
  549. OracleTransaction tx = connection.BeginTransaction();
  550. command.Transaction = tx;
  551. try
  552. {
  553. foreach (string sql in SQL)
  554. {
  555. if (!String.IsNullOrEmpty(sql))
  556. {
  557. command.CommandText = sql;
  558. command.CommandType = CommandType.Text;
  559. try
  560. {
  561. command.ExecuteNonQuery();
  562. }
  563. catch (Exception)
  564. {
  565. command.Connection = new OracleConnection(DBConnectionString);
  566. command.Connection.Open();
  567. command.ExecuteNonQuery();
  568. }
  569. }
  570. }
  571. tx.Commit();
  572. }
  573. catch (Exception E)
  574. {
  575. tx.Rollback();
  576. throw new Exception(E.Message);
  577. }
  578. }
  579. /// <summary>
  580. /// 用于将string 的数组转换成SQL的查询内容
  581. /// </summary>
  582. /// <param name="Fields"></param>
  583. /// <returns></returns>
  584. private string AddField(string[] Fields)
  585. {
  586. string sql = " ";
  587. foreach (string field in Fields)
  588. {
  589. sql += field + ",";
  590. }
  591. return sql.Substring(0, sql.Length - 1);
  592. }
  593. /// <summary>
  594. /// 通过查询的语句获取查询的字段
  595. /// </summary>
  596. /// <param name="field"></param>
  597. /// <returns></returns>
  598. private static string[] GetField(string field)
  599. {
  600. string[] fields = field.Split(',');
  601. for (int i = 0; i < fields.Length; i++)
  602. {
  603. fields[i] = fields[i].Substring(fields[i].LastIndexOf("as") + 2, fields[i].Length - fields[i].LastIndexOf("as") - 2).Trim();
  604. }
  605. return fields;
  606. }
  607. public static string[] GetParamFromSQL(string SQL)
  608. {
  609. string[] par = SQL.Split(':');
  610. //用来存参数的数组
  611. StringBuilder[] addpar = new StringBuilder[par.Length - 1];
  612. string[] param = new string[par.Length - 1];
  613. for (int i = 0; i < par.Length - 1; i++)
  614. {
  615. //新建一个char类型的数组用来存储每个字节的变量
  616. char[] c = par[i + 1].ToCharArray();
  617. addpar[i] = new StringBuilder();
  618. for (int j = 0; j < c.Length; j++)
  619. {
  620. if (c[j] != ' ' && c[j] != ',' && c[j] != ')')
  621. {
  622. addpar[i].Append(c[j]);
  623. }
  624. else
  625. {
  626. break;
  627. }
  628. }
  629. }
  630. for (int i = 0; i < par.Length - 1; i++)
  631. {
  632. param[i] = addpar[i].ToString();
  633. }
  634. return param;
  635. }
  636. public void Dispose()
  637. {
  638. command.Dispose();
  639. connection.Dispose();
  640. }
  641. private void Reconnect(OracleCommand cmd)
  642. {
  643. if (cmd.Connection.State == ConnectionState.Closed)
  644. {
  645. cmd.Connection.Open();
  646. }
  647. }
  648. }
  649. }