DataHelper.cs 36 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972
  1. using Oracle.ManagedDataAccess.Client;
  2. using System;
  3. using System.Collections;
  4. using System.Collections.Generic;
  5. using System.Configuration;
  6. using System.Data;
  7. using System.Text;
  8. using System.Windows;
  9. using UAS_MES.PublicMethod;
  10. namespace UAS_MES.DataOperate
  11. {
  12. class DataHelper
  13. {
  14. //系统默认的的连接字符串
  15. private string ConnectionStrings = Properties.Settings.Default.Properties["MES"].DefaultValue.ToString();
  16. //用户选择的数据库的连接字符串
  17. public static string DBConnectionString;
  18. public static OracleConnection connection = null;
  19. OracleCommand command = new OracleCommand();
  20. /// <summary>
  21. /// 执行构造函数的时候打开数据库的链接
  22. /// </summary>
  23. public DataHelper()
  24. {
  25. try
  26. {
  27. //如果选择的是默认数据则直接用配置文件的信息连接,否则选择数据库的账套信息
  28. if (DBConnectionString == null || DBConnectionString == ConnectionStrings)
  29. connection = new OracleConnection(ConnectionStrings);
  30. else
  31. connection = new OracleConnection(DBConnectionString);
  32. command.Connection = connection;
  33. command.Connection.Open();
  34. command.CommandTimeout = 0;
  35. }
  36. catch (Exception e)
  37. {
  38. if (DBConnectionString == null || DBConnectionString == ConnectionStrings)
  39. connection = new OracleConnection(ConnectionStrings);
  40. else
  41. connection = new OracleConnection(DBConnectionString);
  42. try
  43. {
  44. command.Connection = connection;
  45. command.Connection.Open();
  46. }
  47. catch (Exception)
  48. {
  49. return;
  50. }
  51. command.CommandTimeout = 0;
  52. LogManager.DoLog(e.Message);
  53. }
  54. }
  55. /// <summary>
  56. /// 根据表名获取该表字段数据类型
  57. /// </summary>
  58. public DataTable GetColumnDataType(string TableName)
  59. {
  60. DataTable dt = new DataTable();
  61. command.CommandText = "select Column_Name,Data_Type from cols where TABLE_name=upper('" + TableName + "')";
  62. command.CommandType = CommandType.Text;
  63. Reconnect(command);
  64. OracleDataAdapter ad = new OracleDataAdapter(command);
  65. ad.Fill(dt);
  66. ad.Dispose();
  67. return dt;
  68. }
  69. /// <summary>
  70. /// 获取第一行第一列的信息
  71. /// </summary>
  72. public object getFieldDataByCondition(string TableName, string Field, string Condition)
  73. {
  74. DataTable dt = new DataTable();
  75. string sql = "select " + Field + " from " + TableName + " where " + Condition;
  76. Console.WriteLine(sql);
  77. command.CommandText = sql;
  78. command.CommandType = CommandType.Text;
  79. Reconnect(command);
  80. OracleDataAdapter ad = new OracleDataAdapter();
  81. ad.SelectCommand = command;
  82. try
  83. {
  84. ad.Fill(dt);
  85. }
  86. catch (Exception)
  87. {
  88. connection = new OracleConnection(DBConnectionString);
  89. connection.Open();
  90. command.Connection = connection;
  91. ad = new OracleDataAdapter();
  92. ad.SelectCommand = command;
  93. ad.Fill(dt);
  94. }
  95. ad.Dispose();
  96. if (dt.Rows.Count > 0)
  97. {
  98. return dt.Rows[0][0];
  99. }
  100. else
  101. {
  102. return "";
  103. }
  104. }
  105. /// <summary>
  106. /// 执行打印的SQL
  107. /// </summary>
  108. /// <param name="SQL">SQL语句</param>
  109. /// <param name="Parameters">动态添加的参数,主要根据条码枪扫描获取</param>
  110. /// <returns></returns>
  111. public object ExecutePrintSQL(string SQL, params string[] Parameters)
  112. {
  113. command.Parameters.Clear();
  114. //按照?拆分数据,然后以:Param替换问号,同时添加参数
  115. string[] Param = SQL.Split('?');
  116. int ParamNum = Param.Length - 1;
  117. //条码打印必然存在需要维护的参数
  118. if (ParamNum > 0)
  119. {
  120. StringBuilder sb = new StringBuilder();
  121. for (int i = 0; i < ParamNum; i++)
  122. {
  123. sb.Append(Param[i] + ":Param" + i);
  124. }
  125. command.CommandText = sb.ToString();
  126. command.CommandType = CommandType.Text;
  127. for (int i = 0; i < ParamNum; i++)
  128. {
  129. command.Parameters.Add("Param" + i, OracleDbType.Varchar2, Parameters[i], ParameterDirection.Input);
  130. }
  131. OracleDataAdapter ad = new OracleDataAdapter(command);
  132. DataTable dt = new DataTable();
  133. ad.Fill(dt);
  134. ad.Dispose();
  135. return dt;
  136. }
  137. return "参数错误,请检查SQL语句";
  138. }
  139. /// <summary>
  140. /// 获取指定表的记录的条数 ,带条件
  141. /// </summary>
  142. /// <returns></returns>
  143. public int getRowCount(string TableName, string Condition)
  144. {
  145. DataTable dt = new DataTable();
  146. string sql = "select count(1) from " + TableName + " where " + Condition;
  147. command.CommandText = sql;
  148. command.CommandType = CommandType.Text;
  149. Reconnect(command);
  150. OracleDataAdapter ad = new OracleDataAdapter(command);
  151. ad.Fill(dt);
  152. ad.Dispose();
  153. return int.Parse(dt.Rows[0][0].ToString());
  154. }
  155. /// <summary>
  156. /// 获取指定表的记录的条数 ,不带条件
  157. /// </summary>
  158. /// <param name="TableName"></param>
  159. /// <returns></returns>
  160. public int getRowCount(string TableName)
  161. {
  162. DataTable dt = new DataTable();
  163. string sql = "select count(1) from " + TableName;
  164. command.CommandText = sql;
  165. command.CommandType = CommandType.Text;
  166. Reconnect(command);
  167. OracleDataAdapter ad = new OracleDataAdapter(command);
  168. ad.Fill(dt);
  169. ad.Dispose();
  170. return int.Parse(dt.Rows[0][0].ToString());
  171. }
  172. /// <summary>
  173. /// 通过表名和获取单行的记录
  174. /// </summary>
  175. public DataTable getFieldsDataByCondition(string TableName, string[] Fields, string Condition)
  176. {
  177. DataTable dt = new DataTable();
  178. string sql = "select ";
  179. sql += AddField(Fields);
  180. sql += " from " + TableName + " where " + Condition + " and rownum=1";
  181. Console.WriteLine(sql);
  182. command.CommandText = sql;
  183. command.CommandType = CommandType.Text;
  184. Reconnect(command);
  185. OracleDataAdapter ad = new OracleDataAdapter(command);
  186. try
  187. {
  188. ad.Fill(dt);
  189. }
  190. catch (Exception)
  191. {
  192. connection = new OracleConnection(DBConnectionString);
  193. connection.Open();
  194. command.Connection = connection;
  195. ad = new OracleDataAdapter();
  196. ad.SelectCommand = command;
  197. ad.Fill(dt);
  198. }
  199. ad.Dispose();
  200. return dt;
  201. }
  202. /// <summary>
  203. /// 按分页获取数据
  204. /// </summary>
  205. /// <param name="TableName">表名</param>
  206. /// <param name="Fields">查询字段</param>
  207. /// <param name="CurrentPage">当前页面</param>
  208. /// <param name="PageSize">页面展示条数</param>
  209. /// <param name="Caller"></param>
  210. /// <returns></returns>
  211. // SELECT * FROM (SELECT A.* FROM (SELECT* FROM datalist) A WHERE ROWNUM <= 50) WHERE ROWNUM >= 21
  212. public DataTable getFieldsDatasByPageing(string TableName, string Fields, int CurrentPage, int PageSize, string Caller, params string[] condition)
  213. {
  214. DataTable dt = new DataTable();
  215. StringBuilder sql = new StringBuilder();
  216. //先查询出配置出去的列
  217. //获取查询的列
  218. string[] caption = GetCaptionFromField(Fields);
  219. //获取对应列的描述
  220. string[] field = GetField(Fields);
  221. sql.Append(" select * from (select RowNum RN, A.* from (select ");
  222. sql.Append(AddField(caption));
  223. if (condition.Length > 0)
  224. {
  225. if (condition[0] != null && condition[0].Trim() != "")
  226. sql.Append(" from " + TableName + " where " + condition[0] + " ) A where ROWNUM <=" + CurrentPage * PageSize + ") where RN>" + (CurrentPage - 1) * PageSize);
  227. else
  228. sql.Append(" from " + TableName + ") A where ROWNUM <= " + CurrentPage * PageSize + ") where RN> " + (CurrentPage - 1) * PageSize);
  229. }
  230. command.CommandText = sql.ToString();
  231. command.CommandType = CommandType.Text;
  232. Reconnect(command);
  233. OracleDataAdapter ad = new OracleDataAdapter(command);
  234. ad.Fill(dt);
  235. ad.Dispose();
  236. dt.Columns.RemoveAt(0);
  237. foreach (DataColumn dc in dt.Columns)
  238. {
  239. dc.ColumnName = field[dt.Columns.IndexOf(dc)];
  240. dc.Caption = caption[dt.Columns.IndexOf(dc)];
  241. }
  242. return dt;
  243. }
  244. /// <summary>
  245. /// 通过表名,字段和条件获取DataTable类型的数据
  246. /// </summary>
  247. public DataTable getFieldsDatasByCondition(string TableName, string[] Fields, string Condition)
  248. {
  249. DataTable dt = new DataTable();
  250. string sql = "select ";
  251. sql += AddField(Fields);
  252. sql += " from " + TableName + " where " + Condition;
  253. Console.WriteLine(sql);
  254. command.CommandText = sql;
  255. command.CommandType = CommandType.Text;
  256. Reconnect(command);
  257. OracleDataAdapter ad = new OracleDataAdapter(command);
  258. try
  259. {
  260. ad.Fill(dt);
  261. }
  262. catch (Exception)
  263. {
  264. connection = new OracleConnection(DBConnectionString);
  265. connection.Open();
  266. command.Connection = connection;
  267. ad = new OracleDataAdapter();
  268. ad.SelectCommand = command;
  269. ad.Fill(dt);
  270. }
  271. ad.Dispose();
  272. return dt;
  273. }
  274. /// <summary>
  275. /// 通过表名,字段获取DataTable类型的数据
  276. /// </summary>
  277. public DataTable getFieldsDatas(string TableName, string Fields)
  278. {
  279. DataTable dt = new DataTable();
  280. string sql = "select ";
  281. sql += Fields;
  282. sql += " from " + TableName;
  283. Console.WriteLine(sql);
  284. command.CommandText = sql;
  285. command.CommandType = CommandType.Text;
  286. Reconnect(command);
  287. OracleDataAdapter ad = new OracleDataAdapter(command);
  288. ad.SelectCommand = command;
  289. try
  290. {
  291. ad.Fill(dt);
  292. }
  293. catch (Exception)
  294. {
  295. connection = new OracleConnection(DBConnectionString);
  296. connection.Open();
  297. command.Connection = connection;
  298. ad = new OracleDataAdapter();
  299. ad.SelectCommand = command;
  300. ad.Fill(dt);
  301. }
  302. ad.Dispose();
  303. return dt;
  304. }
  305. /// <summary>
  306. /// 检测内容是否存在
  307. /// </summary>
  308. /// <param name="TableName"></param>
  309. /// <param name="Condition"></param>
  310. /// <returns></returns>
  311. public bool CheckExist(string TableName, string Condition)
  312. {
  313. string sql = "select count(1) from " + TableName + " where " + Condition;
  314. command.CommandText = sql;
  315. command.CommandType = CommandType.Text;
  316. Reconnect(command);
  317. OracleDataAdapter ad = new OracleDataAdapter(command);
  318. DataTable dt = new DataTable();
  319. ad.Fill(dt);
  320. ad.Dispose();
  321. return int.Parse(dt.Rows[0][0].ToString()) > 0;
  322. }
  323. /// <summary>
  324. /// 直接执行SQL,同时传入SQL的类型
  325. /// </summary>
  326. /// <param name="SQL"></param>
  327. /// <param name="Type"></param>
  328. /// <returns></returns>
  329. public object ExecuteSql(string SQL, string Type, params object[] names)
  330. {
  331. command.Parameters.Clear();
  332. object result = null;
  333. command.CommandText = SQL;
  334. command.CommandType = CommandType.Text;
  335. Reconnect(command);
  336. //用来拼接参数的
  337. if (names.Length > 0)
  338. {
  339. string[] par = SQL.Split(':');
  340. //用来存参数的数组
  341. StringBuilder[] addpar = new StringBuilder[par.Length - 1];
  342. for (int i = 0; i < par.Length - 1; i++)
  343. {
  344. //新建一个char类型的数组用来存储每个字节的变量
  345. char[] c = par[i + 1].ToCharArray();
  346. addpar[i] = new StringBuilder();
  347. for (int j = 0; j < c.Length; j++)
  348. {
  349. if (c[j] != ' ' && c[j] != ',')
  350. {
  351. addpar[i].Append(c[j]);
  352. }
  353. else
  354. {
  355. break;
  356. }
  357. }
  358. }
  359. for (int i = 0; i < addpar.Length; i++)
  360. command.Parameters.Add(new OracleParameter(addpar[i].ToString(), OracleDbType.Varchar2, names[i], ParameterDirection.Input));
  361. }
  362. Console.WriteLine(SQL);
  363. switch (Type.ToUpper())
  364. {
  365. case "SELECT":
  366. OracleDataAdapter ad = new OracleDataAdapter(command);
  367. result = new DataTable();
  368. try
  369. {
  370. ad.Fill((DataTable)result);
  371. }
  372. catch (Exception)
  373. {
  374. connection = new OracleConnection(DBConnectionString);
  375. connection.Open();
  376. command.Connection = connection;
  377. ad = new OracleDataAdapter();
  378. ad.SelectCommand = command;
  379. ad.Fill((DataTable)result);
  380. }
  381. break;
  382. case "DELETE":
  383. try
  384. {
  385. result = command.ExecuteNonQuery();
  386. }
  387. catch (Exception)
  388. {
  389. command.Connection = new OracleConnection(DBConnectionString);
  390. command.Connection.Open();
  391. result = command.ExecuteNonQuery();
  392. }
  393. break;
  394. case "UPDATE":
  395. try
  396. {
  397. result = command.ExecuteNonQuery();
  398. }
  399. catch (Exception)
  400. {
  401. command.Connection = new OracleConnection(DBConnectionString);
  402. command.Connection.Open();
  403. result = command.ExecuteNonQuery();
  404. }
  405. break;
  406. case "INSERT":
  407. try
  408. {
  409. result = command.ExecuteNonQuery();
  410. }
  411. catch (Exception)
  412. {
  413. command.Connection = new OracleConnection(DBConnectionString);
  414. command.Connection.Open();
  415. result = command.ExecuteNonQuery();
  416. }
  417. break;
  418. }
  419. return result;
  420. }
  421. /// <summary>
  422. /// 为了同步BS端的条码维护,检测时允许问号的存在,在检测时默认将问号换成:Param参数
  423. /// </summary>
  424. /// <param name="SQL"></param>
  425. public void CheckSQL(string SQL)
  426. {
  427. SQL = SQL.Replace("?", ":Param");
  428. command.CommandText = SQL;
  429. command.CommandType = CommandType.Text;
  430. command.ExecuteNonQuery();
  431. }
  432. public int GetDistinctRowCount(string TableName, string Field)
  433. {
  434. DataTable dt = new DataTable();
  435. string sql = "select distinct count('" + Field + "') from " + TableName;
  436. command.CommandText = sql;
  437. command.CommandType = CommandType.Text;
  438. Reconnect(command);
  439. OracleDataAdapter ad = new OracleDataAdapter(command);
  440. try
  441. {
  442. ad.Fill(dt);
  443. }
  444. catch (Exception)
  445. {
  446. connection = new OracleConnection(DBConnectionString);
  447. connection.Open();
  448. command.Connection = connection;
  449. ad = new OracleDataAdapter();
  450. ad.SelectCommand = command;
  451. ad.Fill(dt);
  452. }
  453. ad.Dispose();
  454. return int.Parse(dt.Rows[0][0].ToString());
  455. }
  456. /// <summary>
  457. /// 根据Caller获取流水号
  458. /// </summary>
  459. /// <param name="Caller"></param>
  460. /// <returns></returns>
  461. public string GetSerialNumberByCaller(string Caller)
  462. {
  463. string SerialNumber = getFieldDataByCondition("MaxNumbers", "mn_number", "mn_tablename='" + Caller + "'").ToString();
  464. UpdateByCondition("MaxNumbers", "mn_number=mn_number+1", "mn_tablename='" + Caller + "'");
  465. return SerialNumber;
  466. }
  467. /// <summary>
  468. /// 根据主键ID删除表的数据
  469. /// </summary>
  470. /// <param name="TableName">表名</param>
  471. /// <param name="ID">主键</param>
  472. /// <param name="DeleteID">需要删除主键ID的数组</param>
  473. public void DeleteDataByID(string TableName, string ID, string[] DeleteID)
  474. {
  475. command.Parameters.Clear();
  476. string sql = "delete from " + TableName + " where " + ID + " =:DeleteID";
  477. command.CommandText = sql;
  478. Reconnect(command);
  479. command.ArrayBindCount = DeleteID.Length;
  480. command.Parameters.Add(new OracleParameter("DeleteID", OracleDbType.Long, DeleteID, ParameterDirection.Input));
  481. try
  482. {
  483. command.ExecuteNonQuery();
  484. command.ArrayBindCount = 0;
  485. }
  486. catch (Exception)
  487. {
  488. command.Connection = new OracleConnection(DBConnectionString);
  489. command.Connection.Open();
  490. command.ExecuteNonQuery();
  491. command.ArrayBindCount = 0;
  492. }
  493. }
  494. /// <summary>
  495. /// 通过序列的名称获取序列
  496. /// </summary>
  497. /// <param name="SeqName"></param>
  498. /// <returns></returns>
  499. public string GetSEQ(string SeqName)
  500. {
  501. DataTable dt = new DataTable();
  502. dt = (DataTable)ExecuteSql("SELECT " + SeqName + ".NEXTVAL FROM DUAL", "select");
  503. return dt.Rows[0][0].ToString();
  504. }
  505. /// <summary>
  506. /// 通过序列的名称获取序列
  507. /// </summary>
  508. /// <param name="SeqName"></param>
  509. /// <returns></returns>
  510. public string[] GetSEQ(string SeqName, int Num)
  511. {
  512. DataTable dt = new DataTable();
  513. dt = (DataTable)ExecuteSql("select " + SeqName + ".nextval from (select 1 from OQCITEMSAMPLES where rownum<" + (Num + 1) + ")", "select");
  514. string[] SerialNum = new string[dt.Rows.Count];
  515. for (int i = 0; i < dt.Rows.Count; i++)
  516. {
  517. SerialNum[i] = dt.Rows[i][0].ToString();
  518. }
  519. return SerialNum;
  520. }
  521. public void SaveDataTable(DataTable dt, string TableName, string ID, params string[] sql)
  522. {
  523. if (dt == null)
  524. {
  525. return;
  526. }
  527. StringBuilder sb = new StringBuilder();
  528. //预防插入的DataTable中存在不属于该表的列,在进行下一步操作之前全部剔除
  529. DataTable data = (DataTable)ExecuteSql("select Column_Name,Data_Type from cols where TABLE_name=upper('" + TableName + "')", "select");
  530. //将所有的字段拼接起来
  531. for (int i = 0; i < data.Rows.Count; i++)
  532. {
  533. sb.Append("#" + data.Rows[i]["Column_Name"].ToString());
  534. }
  535. //移除掉所有不属于该表的列
  536. for (int i = dt.Columns.Count - 1; i >= 0; i--)
  537. {
  538. if (!sb.ToString().Contains(dt.Columns[i].ColumnName.ToUpper()))
  539. {
  540. dt.Columns.RemoveAt(i);
  541. }
  542. }
  543. sb.Clear();
  544. //计算有多少个是新加的行,根据主键为空来进行判断
  545. int NewRowCount = 0;
  546. for (int i = 0; i < dt.Rows.Count; i++)
  547. {
  548. if (dt.Rows[i][ID] == null || dt.Rows[i][ID].ToString() == "")
  549. {
  550. NewRowCount = NewRowCount + 1;
  551. }
  552. }
  553. if (sql.Length > 0)
  554. {
  555. if (NewRowCount > 0)
  556. {
  557. //获取参数的个数
  558. int paramsNum = sql[0].Split(':').Length - 1;
  559. //解析参数的数据
  560. string[] param = GetParamFromSQL(sql[0]);
  561. //新建一个二维数组去
  562. string[][] param_array = new string[paramsNum][];
  563. //实例化每个一维数组
  564. for (int i = 0; i < paramsNum; i++)
  565. {
  566. param_array[i] = new string[NewRowCount];
  567. }
  568. //设置每列参数的索引
  569. int num = 0;
  570. //变量所有的行,如果有主键为空的则移除,不为空的进行参数的拼接
  571. for (int i = dt.Rows.Count - 1; i >= 0; i--)
  572. {
  573. if (dt.Rows[i][ID] == null || dt.Rows[i][ID].ToString() == "")
  574. {
  575. //当为新添加行的时候才去设置参数,设置过后索引+1
  576. for (int j = 0; j < paramsNum; j++)
  577. {
  578. param_array[j][num] = dt.Rows[i][param[j]].ToString();
  579. }
  580. dt.Rows.RemoveAt(i);
  581. num++;
  582. }
  583. }
  584. BatchInsertDataTable(sql[0], param, param_array);
  585. }
  586. }
  587. sb.Clear();
  588. sb.Append("update " + TableName + " set ");
  589. int ColumnCount = dt.Columns.Count;
  590. int RowCount = dt.Rows.Count;
  591. //存数据的参数
  592. List<string[]> Parameter = new List<string[]>();
  593. //存参数名的参数
  594. string[] ParName = new string[ColumnCount];
  595. for (int i = 0; i < ColumnCount; i++)
  596. {
  597. ParName[i] = dt.Columns[i].ColumnName;
  598. if (i == dt.Columns.Count - 1)
  599. sb.Append(dt.Columns[i].ColumnName + "=:" + dt.Columns[i].ColumnName);
  600. else
  601. sb.Append(dt.Columns[i].ColumnName + "=:" + dt.Columns[i].ColumnName + ",");
  602. }
  603. sb.Append(" where " + ID + " =:" + ID);
  604. //先添加参数
  605. Parameter.Add(ParName);
  606. //添加参数的具体内容
  607. for (int i = 0; i < ColumnCount; i++)
  608. {
  609. string[] par = new string[RowCount];
  610. for (int j = 0; j < RowCount; j++)
  611. {
  612. par[j] = dt.Rows[j][i].ToString();
  613. }
  614. Parameter.Add(par);
  615. }
  616. BatchInsert(sb.ToString(), Parameter.ToArray());
  617. }
  618. /// <summary>
  619. /// 批量通过SQL来执行插入操作 ,参数的第一个数一个string[]数组,用来传递需要添加的参数的名称
  620. /// 之后的是名称参数数组对应的 ,所有的插入参数数据长度必须是一致的
  621. /// </summary>
  622. /// <param name="sql"></param>
  623. /// <param name="names"></param>
  624. public void BatchInsert(string sql, params object[][] names)
  625. {
  626. command.Parameters.Clear();
  627. command.CommandText = sql;
  628. Reconnect(command);
  629. command.ArrayBindCount = names[1].Length;
  630. //因为第一个数组保存的是参数的名称,所以循环从1而不是0开始
  631. //将第一个数组的下标固定为0作为循环添加的参数的名称
  632. for (int i = 1; i <= names[0].Length; i++)
  633. {
  634. command.Parameters.Add(new OracleParameter(names[0][i - 1].ToString(), OracleDbType.Varchar2, names[i], ParameterDirection.Input));
  635. }
  636. try
  637. {
  638. command.ExecuteNonQuery();
  639. command.ArrayBindCount = 0;
  640. }
  641. catch (Exception)
  642. {
  643. command.Connection = new OracleConnection(DBConnectionString);
  644. command.Connection.Open();
  645. command.ExecuteNonQuery();
  646. command.ArrayBindCount = 0;
  647. }
  648. }
  649. public void BatchInsertDataTable(string sql, string[] param, params object[][] param1)
  650. {
  651. command.Parameters.Clear();
  652. command.CommandText = sql;
  653. Reconnect(command);
  654. command.ArrayBindCount = param1[0].Length;
  655. //因为第一个数组保存的是参数的名称,所以循环从1而不是0开始
  656. //将第一个数组的下标固定为0作为循环添加的参数的名称
  657. for (int i = 0; i < param.Length; i++)
  658. {
  659. command.Parameters.Add(new OracleParameter(param[i].ToString(), OracleDbType.Varchar2, param1[i], ParameterDirection.Input));
  660. }
  661. try
  662. {
  663. command.ExecuteNonQuery();
  664. command.ArrayBindCount = 0;
  665. }
  666. catch (Exception)
  667. {
  668. command.Connection = new OracleConnection(DBConnectionString);
  669. command.Connection.Open();
  670. command.ExecuteNonQuery();
  671. command.ArrayBindCount = 0;
  672. }
  673. }
  674. /// <summary>
  675. /// 取Configs表中的配置,进行该客户是否执行某个操作
  676. /// </summary>
  677. /// <param name="Code"></param>
  678. /// <param name="Caller"></param>
  679. /// <returns></returns>
  680. public object GetConfig(string Code, string Caller)
  681. {
  682. DataTable dt = new DataTable();
  683. string sql = "select Data from configs where code='" + Code + "' and caller='" + Caller + "'";
  684. dt = (DataTable)ExecuteSql(sql, "select");
  685. if (dt.Rows.Count == 0)
  686. {
  687. return "";
  688. }
  689. else
  690. {
  691. return dt.Rows[0]["Data"];
  692. }
  693. }
  694. //将数据类型的列类型转换为DataTable
  695. public DataTable DataTypeColumnToDataTable(DataTable dt)
  696. {
  697. DataTable dt1 = new DataTable();
  698. dt1.Rows.Add();
  699. foreach (DataRow dr in dt.Rows)
  700. {
  701. dt1.Columns.Add(dr[0].ToString());
  702. int index = dt.Rows.IndexOf(dr);
  703. if (dr[1].ToString() == "NUMBER")
  704. {
  705. dt1.Rows[0][index] = 0;
  706. }
  707. if (dr[1].ToString() == "VARCHAR2")
  708. {
  709. dt1.Rows[0][index] = "这是一段文字";
  710. }
  711. if (dr[1].ToString() == "DATE")
  712. {
  713. dt1.Rows[0][index] = DateTime.Now.ToString("yyyy-MM-dd");
  714. }
  715. if (dr[1].ToString() == "FLOAT")
  716. {
  717. dt1.Rows[0][index] = 1.0;
  718. }
  719. if (dr[1].ToString() == "CLOB")
  720. {
  721. dt1.Rows[0][index] = "一段长文字";
  722. }
  723. }
  724. return dt1;
  725. }
  726. /// <summary>
  727. /// 通过条件更新
  728. /// </summary>
  729. /// <param name="TableName"></param>
  730. /// <param name="update"></param>
  731. /// <param name="condition"></param>
  732. public string UpdateByCondition(string TableName, string update, string condition)
  733. {
  734. string sql = "update " + TableName + " set " + update + " where " + condition;
  735. command.CommandText = sql;
  736. command.CommandType = CommandType.Text;
  737. Reconnect(command);
  738. try
  739. {
  740. command.ExecuteNonQuery();
  741. }
  742. catch (Exception)
  743. {
  744. command.Connection = new OracleConnection(DBConnectionString);
  745. command.Connection.Open();
  746. command.ExecuteNonQuery();
  747. }
  748. return sql;
  749. }
  750. /// <summary>
  751. /// 调用存储过程
  752. /// </summary>
  753. /// <param name="ProcedureName"></param>
  754. /// <param name="param"></param>
  755. public void CallProcedure(string ProcedureName, ref string[] param)
  756. {
  757. command.Parameters.Clear();
  758. command.CommandText = ProcedureName;
  759. command.CommandType = CommandType.StoredProcedure;
  760. command.ArrayBindCount = 0;
  761. Reconnect(command);
  762. for (int i = 0; i < param.Length; i++)
  763. command.Parameters.Add(new OracleParameter(param[i].ToString(), OracleDbType.Varchar2, 200, param[i], ParameterDirection.InputOutput));
  764. try
  765. {
  766. command.ExecuteNonQuery();
  767. }
  768. catch (Exception)
  769. {
  770. Console.WriteLine(command.Parameters.Count);
  771. command.Connection = new OracleConnection(DBConnectionString);
  772. command.Connection.Open();
  773. command.ExecuteNonQuery();
  774. }
  775. for (int i = 0; i < command.Parameters.Count; i++)
  776. param[i] = command.Parameters[i].Value.ToString();
  777. }
  778. /// <summary>
  779. /// 出现异常进行回滚的执行方法
  780. /// </summary>
  781. /// <param name="SQL"></param>
  782. public void ExecuteSQLTran(params string[] SQL)
  783. {
  784. OracleTransaction tx = connection.BeginTransaction();
  785. command.Transaction = tx;
  786. try
  787. {
  788. foreach (string sql in SQL)
  789. {
  790. if (!String.IsNullOrEmpty(sql))
  791. {
  792. command.CommandText = sql;
  793. command.CommandType = CommandType.Text;
  794. try
  795. {
  796. command.ExecuteNonQuery();
  797. }
  798. catch (Exception)
  799. {
  800. command.Connection = new OracleConnection(DBConnectionString);
  801. command.Connection.Open();
  802. command.ExecuteNonQuery();
  803. }
  804. }
  805. }
  806. tx.Commit();
  807. }
  808. catch (System.Data.OracleClient.OracleException E)
  809. {
  810. tx.Rollback();
  811. throw new Exception(E.Message);
  812. }
  813. }
  814. /// <summary>
  815. /// 用于将string 的数组转换成SQL的查询内容
  816. /// </summary>
  817. /// <param name="Fields"></param>
  818. /// <returns></returns>
  819. private string AddField(string[] Fields)
  820. {
  821. string sql = " ";
  822. foreach (string field in Fields)
  823. {
  824. sql += field + ",";
  825. }
  826. return sql.Substring(0, sql.Length - 1);
  827. }
  828. /// <summary>
  829. /// 通过查询的内容获取到字段的描述
  830. /// </summary>
  831. /// <param name="field"></param>
  832. /// <returns></returns>
  833. private static string[] GetCaptionFromField(string field)
  834. {
  835. string[] caption = field.Split(',');
  836. for (int i = 0; i < caption.Length; i++)
  837. {
  838. caption[i] = caption[i].Substring(0, caption[i].LastIndexOf("as")).Trim();
  839. }
  840. return caption;
  841. }
  842. /// <summary>
  843. /// 通过查询的语句获取查询的字段
  844. /// </summary>
  845. /// <param name="field"></param>
  846. /// <returns></returns>
  847. private static string[] GetField(string field)
  848. {
  849. string[] fields = field.Split(',');
  850. for (int i = 0; i < fields.Length; i++)
  851. {
  852. fields[i] = fields[i].Substring(fields[i].LastIndexOf("as") + 2, fields[i].Length - fields[i].LastIndexOf("as") - 2).Trim();
  853. }
  854. return fields;
  855. }
  856. public object GetLabelParam(string sql)
  857. {
  858. DataTable dt = new DataTable();
  859. command.CommandText = sql;
  860. command.CommandType = CommandType.Text;
  861. Reconnect(command);
  862. OracleDataAdapter ad = new OracleDataAdapter();
  863. ad.SelectCommand = command;
  864. try
  865. {
  866. ad.Fill(dt);
  867. }
  868. catch (Exception)
  869. {
  870. connection = new OracleConnection(DBConnectionString);
  871. connection.Open();
  872. command.Connection = connection;
  873. ad = new OracleDataAdapter();
  874. ad.SelectCommand = command;
  875. ad.Fill(dt);
  876. }
  877. if (dt.Rows.Count > 0)
  878. {
  879. ad.Dispose();
  880. return dt.Rows[0][0];
  881. }
  882. else
  883. {
  884. return "";
  885. }
  886. }
  887. public static string[] GetParamFromSQL(string SQL)
  888. {
  889. string[] par = SQL.Split(':');
  890. //用来存参数的数组
  891. StringBuilder[] addpar = new StringBuilder[par.Length - 1];
  892. string[] param = new string[par.Length - 1];
  893. for (int i = 0; i < par.Length - 1; i++)
  894. {
  895. //新建一个char类型的数组用来存储每个字节的变量
  896. char[] c = par[i + 1].ToCharArray();
  897. addpar[i] = new StringBuilder();
  898. for (int j = 0; j < c.Length; j++)
  899. {
  900. if (c[j] != ' ' && c[j] != ',' && c[j] != ')')
  901. {
  902. addpar[i].Append(c[j]);
  903. }
  904. else
  905. {
  906. break;
  907. }
  908. }
  909. }
  910. for (int i = 0; i < par.Length - 1; i++)
  911. {
  912. param[i] = addpar[i].ToString();
  913. }
  914. return param;
  915. }
  916. public void Dispose()
  917. {
  918. if (command != null)
  919. command.Dispose();
  920. if (connection != null)
  921. connection.Dispose();
  922. }
  923. private void Reconnect(OracleCommand cmd)
  924. {
  925. if (cmd.Connection.State == ConnectionState.Closed)
  926. {
  927. cmd.Connection.Open();
  928. LogManager.DoLog("超时重连");
  929. }
  930. }
  931. }
  932. }