DataHelper.cs 36 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973
  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. command.CommandType = CommandType.Text;
  479. Reconnect(command);
  480. command.ArrayBindCount = DeleteID.Length;
  481. command.Parameters.Add(new OracleParameter("DeleteID", OracleDbType.Long, DeleteID, ParameterDirection.Input));
  482. try
  483. {
  484. command.ExecuteNonQuery();
  485. command.ArrayBindCount = 0;
  486. }
  487. catch (Exception)
  488. {
  489. command.Connection = new OracleConnection(DBConnectionString);
  490. command.Connection.Open();
  491. command.ExecuteNonQuery();
  492. command.ArrayBindCount = 0;
  493. }
  494. }
  495. /// <summary>
  496. /// 通过序列的名称获取序列
  497. /// </summary>
  498. /// <param name="SeqName"></param>
  499. /// <returns></returns>
  500. public string GetSEQ(string SeqName)
  501. {
  502. DataTable dt = new DataTable();
  503. dt = (DataTable)ExecuteSql("SELECT " + SeqName + ".NEXTVAL FROM DUAL", "select");
  504. return dt.Rows[0][0].ToString();
  505. }
  506. /// <summary>
  507. /// 通过序列的名称获取序列
  508. /// </summary>
  509. /// <param name="SeqName"></param>
  510. /// <returns></returns>
  511. public string[] GetSEQ(string SeqName, int Num)
  512. {
  513. DataTable dt = new DataTable();
  514. dt = (DataTable)ExecuteSql("select " + SeqName + ".nextval from (select 1 from OQCITEMSAMPLES where rownum<" + (Num + 1) + ")", "select");
  515. string[] SerialNum = new string[dt.Rows.Count];
  516. for (int i = 0; i < dt.Rows.Count; i++)
  517. {
  518. SerialNum[i] = dt.Rows[i][0].ToString();
  519. }
  520. return SerialNum;
  521. }
  522. public void SaveDataTable(DataTable dt, string TableName, string ID, params string[] sql)
  523. {
  524. if (dt == null)
  525. {
  526. return;
  527. }
  528. StringBuilder sb = new StringBuilder();
  529. //预防插入的DataTable中存在不属于该表的列,在进行下一步操作之前全部剔除
  530. DataTable data = (DataTable)ExecuteSql("select Column_Name,Data_Type from cols where TABLE_name=upper('" + TableName + "')", "select");
  531. //将所有的字段拼接起来
  532. for (int i = 0; i < data.Rows.Count; i++)
  533. {
  534. sb.Append("#" + data.Rows[i]["Column_Name"].ToString());
  535. }
  536. //移除掉所有不属于该表的列
  537. for (int i = dt.Columns.Count - 1; i >= 0; i--)
  538. {
  539. if (!sb.ToString().Contains(dt.Columns[i].ColumnName.ToUpper()))
  540. {
  541. dt.Columns.RemoveAt(i);
  542. }
  543. }
  544. sb.Clear();
  545. //计算有多少个是新加的行,根据主键为空来进行判断
  546. int NewRowCount = 0;
  547. for (int i = 0; i < dt.Rows.Count; i++)
  548. {
  549. if (dt.Rows[i][ID] == null || dt.Rows[i][ID].ToString() == "")
  550. {
  551. NewRowCount = NewRowCount + 1;
  552. }
  553. }
  554. if (sql.Length > 0)
  555. {
  556. if (NewRowCount > 0)
  557. {
  558. //获取参数的个数
  559. int paramsNum = sql[0].Split(':').Length - 1;
  560. //解析参数的数据
  561. string[] param = GetParamFromSQL(sql[0]);
  562. //新建一个二维数组去
  563. string[][] param_array = new string[paramsNum][];
  564. //实例化每个一维数组
  565. for (int i = 0; i < paramsNum; i++)
  566. {
  567. param_array[i] = new string[NewRowCount];
  568. }
  569. //设置每列参数的索引
  570. int num = 0;
  571. //变量所有的行,如果有主键为空的则移除,不为空的进行参数的拼接
  572. for (int i = dt.Rows.Count - 1; i >= 0; i--)
  573. {
  574. if (dt.Rows[i][ID] == null || dt.Rows[i][ID].ToString() == "")
  575. {
  576. //当为新添加行的时候才去设置参数,设置过后索引+1
  577. for (int j = 0; j < paramsNum; j++)
  578. {
  579. param_array[j][num] = dt.Rows[i][param[j]].ToString();
  580. }
  581. dt.Rows.RemoveAt(i);
  582. num++;
  583. }
  584. }
  585. BatchInsertDataTable(sql[0], param, param_array);
  586. }
  587. }
  588. sb.Clear();
  589. sb.Append("update " + TableName + " set ");
  590. int ColumnCount = dt.Columns.Count;
  591. int RowCount = dt.Rows.Count;
  592. //存数据的参数
  593. List<string[]> Parameter = new List<string[]>();
  594. //存参数名的参数
  595. string[] ParName = new string[ColumnCount];
  596. for (int i = 0; i < ColumnCount; i++)
  597. {
  598. ParName[i] = dt.Columns[i].ColumnName;
  599. if (i == dt.Columns.Count - 1)
  600. sb.Append(dt.Columns[i].ColumnName + "=:" + dt.Columns[i].ColumnName);
  601. else
  602. sb.Append(dt.Columns[i].ColumnName + "=:" + dt.Columns[i].ColumnName + ",");
  603. }
  604. sb.Append(" where " + ID + " =:" + ID);
  605. //先添加参数
  606. Parameter.Add(ParName);
  607. //添加参数的具体内容
  608. for (int i = 0; i < ColumnCount; i++)
  609. {
  610. string[] par = new string[RowCount];
  611. for (int j = 0; j < RowCount; j++)
  612. {
  613. par[j] = dt.Rows[j][i].ToString();
  614. }
  615. Parameter.Add(par);
  616. }
  617. BatchInsert(sb.ToString(), Parameter.ToArray());
  618. }
  619. /// <summary>
  620. /// 批量通过SQL来执行插入操作 ,参数的第一个数一个string[]数组,用来传递需要添加的参数的名称
  621. /// 之后的是名称参数数组对应的 ,所有的插入参数数据长度必须是一致的
  622. /// </summary>
  623. /// <param name="sql"></param>
  624. /// <param name="names"></param>
  625. public void BatchInsert(string sql, params object[][] names)
  626. {
  627. command.Parameters.Clear();
  628. command.CommandText = sql;
  629. Reconnect(command);
  630. command.ArrayBindCount = names[1].Length;
  631. //因为第一个数组保存的是参数的名称,所以循环从1而不是0开始
  632. //将第一个数组的下标固定为0作为循环添加的参数的名称
  633. for (int i = 1; i <= names[0].Length; i++)
  634. {
  635. command.Parameters.Add(new OracleParameter(names[0][i - 1].ToString(), OracleDbType.Varchar2, names[i], ParameterDirection.Input));
  636. }
  637. try
  638. {
  639. command.ExecuteNonQuery();
  640. command.ArrayBindCount = 0;
  641. }
  642. catch (Exception)
  643. {
  644. command.Connection = new OracleConnection(DBConnectionString);
  645. command.Connection.Open();
  646. command.ExecuteNonQuery();
  647. command.ArrayBindCount = 0;
  648. }
  649. }
  650. public void BatchInsertDataTable(string sql, string[] param, params object[][] param1)
  651. {
  652. command.Parameters.Clear();
  653. command.CommandText = sql;
  654. Reconnect(command);
  655. command.ArrayBindCount = param1[0].Length;
  656. //因为第一个数组保存的是参数的名称,所以循环从1而不是0开始
  657. //将第一个数组的下标固定为0作为循环添加的参数的名称
  658. for (int i = 0; i < param.Length; i++)
  659. {
  660. command.Parameters.Add(new OracleParameter(param[i].ToString(), OracleDbType.Varchar2, param1[i], ParameterDirection.Input));
  661. }
  662. try
  663. {
  664. command.ExecuteNonQuery();
  665. command.ArrayBindCount = 0;
  666. }
  667. catch (Exception)
  668. {
  669. command.Connection = new OracleConnection(DBConnectionString);
  670. command.Connection.Open();
  671. command.ExecuteNonQuery();
  672. command.ArrayBindCount = 0;
  673. }
  674. }
  675. /// <summary>
  676. /// 取Configs表中的配置,进行该客户是否执行某个操作
  677. /// </summary>
  678. /// <param name="Code"></param>
  679. /// <param name="Caller"></param>
  680. /// <returns></returns>
  681. public object GetConfig(string Code, string Caller)
  682. {
  683. DataTable dt = new DataTable();
  684. string sql = "select Data from configs where code='" + Code + "' and caller='" + Caller + "'";
  685. dt = (DataTable)ExecuteSql(sql, "select");
  686. if (dt.Rows.Count == 0)
  687. {
  688. return "";
  689. }
  690. else
  691. {
  692. return dt.Rows[0]["Data"];
  693. }
  694. }
  695. //将数据类型的列类型转换为DataTable
  696. public DataTable DataTypeColumnToDataTable(DataTable dt)
  697. {
  698. DataTable dt1 = new DataTable();
  699. dt1.Rows.Add();
  700. foreach (DataRow dr in dt.Rows)
  701. {
  702. dt1.Columns.Add(dr[0].ToString());
  703. int index = dt.Rows.IndexOf(dr);
  704. if (dr[1].ToString() == "NUMBER")
  705. {
  706. dt1.Rows[0][index] = 0;
  707. }
  708. if (dr[1].ToString() == "VARCHAR2")
  709. {
  710. dt1.Rows[0][index] = "这是一段文字";
  711. }
  712. if (dr[1].ToString() == "DATE")
  713. {
  714. dt1.Rows[0][index] = DateTime.Now.ToString("yyyy-MM-dd");
  715. }
  716. if (dr[1].ToString() == "FLOAT")
  717. {
  718. dt1.Rows[0][index] = 1.0;
  719. }
  720. if (dr[1].ToString() == "CLOB")
  721. {
  722. dt1.Rows[0][index] = "一段长文字";
  723. }
  724. }
  725. return dt1;
  726. }
  727. /// <summary>
  728. /// 通过条件更新
  729. /// </summary>
  730. /// <param name="TableName"></param>
  731. /// <param name="update"></param>
  732. /// <param name="condition"></param>
  733. public string UpdateByCondition(string TableName, string update, string condition)
  734. {
  735. string sql = "update " + TableName + " set " + update + " where " + condition;
  736. command.CommandText = sql;
  737. command.CommandType = CommandType.Text;
  738. Reconnect(command);
  739. try
  740. {
  741. command.ExecuteNonQuery();
  742. }
  743. catch (Exception)
  744. {
  745. command.Connection = new OracleConnection(DBConnectionString);
  746. command.Connection.Open();
  747. command.ExecuteNonQuery();
  748. }
  749. return sql;
  750. }
  751. /// <summary>
  752. /// 调用存储过程
  753. /// </summary>
  754. /// <param name="ProcedureName"></param>
  755. /// <param name="param"></param>
  756. public void CallProcedure(string ProcedureName, ref string[] param)
  757. {
  758. command.Parameters.Clear();
  759. command.CommandText = ProcedureName;
  760. command.CommandType = CommandType.StoredProcedure;
  761. command.ArrayBindCount = 0;
  762. Reconnect(command);
  763. for (int i = 0; i < param.Length; i++)
  764. command.Parameters.Add(new OracleParameter(param[i].ToString(), OracleDbType.Varchar2, 200, param[i], ParameterDirection.InputOutput));
  765. try
  766. {
  767. command.ExecuteNonQuery();
  768. }
  769. catch (Exception)
  770. {
  771. Console.WriteLine(command.Parameters.Count);
  772. command.Connection = new OracleConnection(DBConnectionString);
  773. command.Connection.Open();
  774. command.ExecuteNonQuery();
  775. }
  776. for (int i = 0; i < command.Parameters.Count; i++)
  777. param[i] = command.Parameters[i].Value.ToString();
  778. }
  779. /// <summary>
  780. /// 出现异常进行回滚的执行方法
  781. /// </summary>
  782. /// <param name="SQL"></param>
  783. public void ExecuteSQLTran(params string[] SQL)
  784. {
  785. OracleTransaction tx = connection.BeginTransaction();
  786. command.Transaction = tx;
  787. try
  788. {
  789. foreach (string sql in SQL)
  790. {
  791. if (!String.IsNullOrEmpty(sql))
  792. {
  793. command.CommandText = sql;
  794. command.CommandType = CommandType.Text;
  795. try
  796. {
  797. command.ExecuteNonQuery();
  798. }
  799. catch (Exception)
  800. {
  801. command.Connection = new OracleConnection(DBConnectionString);
  802. command.Connection.Open();
  803. command.ExecuteNonQuery();
  804. }
  805. }
  806. }
  807. tx.Commit();
  808. }
  809. catch (System.Data.OracleClient.OracleException E)
  810. {
  811. tx.Rollback();
  812. throw new Exception(E.Message);
  813. }
  814. }
  815. /// <summary>
  816. /// 用于将string 的数组转换成SQL的查询内容
  817. /// </summary>
  818. /// <param name="Fields"></param>
  819. /// <returns></returns>
  820. private string AddField(string[] Fields)
  821. {
  822. string sql = " ";
  823. foreach (string field in Fields)
  824. {
  825. sql += field + ",";
  826. }
  827. return sql.Substring(0, sql.Length - 1);
  828. }
  829. /// <summary>
  830. /// 通过查询的内容获取到字段的描述
  831. /// </summary>
  832. /// <param name="field"></param>
  833. /// <returns></returns>
  834. private static string[] GetCaptionFromField(string field)
  835. {
  836. string[] caption = field.Split(',');
  837. for (int i = 0; i < caption.Length; i++)
  838. {
  839. caption[i] = caption[i].Substring(0, caption[i].LastIndexOf("as")).Trim();
  840. }
  841. return caption;
  842. }
  843. /// <summary>
  844. /// 通过查询的语句获取查询的字段
  845. /// </summary>
  846. /// <param name="field"></param>
  847. /// <returns></returns>
  848. private static string[] GetField(string field)
  849. {
  850. string[] fields = field.Split(',');
  851. for (int i = 0; i < fields.Length; i++)
  852. {
  853. fields[i] = fields[i].Substring(fields[i].LastIndexOf("as") + 2, fields[i].Length - fields[i].LastIndexOf("as") - 2).Trim();
  854. }
  855. return fields;
  856. }
  857. public object GetLabelParam(string sql)
  858. {
  859. DataTable dt = new DataTable();
  860. command.CommandText = sql;
  861. command.CommandType = CommandType.Text;
  862. Reconnect(command);
  863. OracleDataAdapter ad = new OracleDataAdapter();
  864. ad.SelectCommand = command;
  865. try
  866. {
  867. ad.Fill(dt);
  868. }
  869. catch (Exception)
  870. {
  871. connection = new OracleConnection(DBConnectionString);
  872. connection.Open();
  873. command.Connection = connection;
  874. ad = new OracleDataAdapter();
  875. ad.SelectCommand = command;
  876. ad.Fill(dt);
  877. }
  878. if (dt.Rows.Count > 0)
  879. {
  880. ad.Dispose();
  881. return dt.Rows[0][0];
  882. }
  883. else
  884. {
  885. return "";
  886. }
  887. }
  888. public static string[] GetParamFromSQL(string SQL)
  889. {
  890. string[] par = SQL.Split(':');
  891. //用来存参数的数组
  892. StringBuilder[] addpar = new StringBuilder[par.Length - 1];
  893. string[] param = new string[par.Length - 1];
  894. for (int i = 0; i < par.Length - 1; i++)
  895. {
  896. //新建一个char类型的数组用来存储每个字节的变量
  897. char[] c = par[i + 1].ToCharArray();
  898. addpar[i] = new StringBuilder();
  899. for (int j = 0; j < c.Length; j++)
  900. {
  901. if (c[j] != ' ' && c[j] != ',' && c[j] != ')')
  902. {
  903. addpar[i].Append(c[j]);
  904. }
  905. else
  906. {
  907. break;
  908. }
  909. }
  910. }
  911. for (int i = 0; i < par.Length - 1; i++)
  912. {
  913. param[i] = addpar[i].ToString();
  914. }
  915. return param;
  916. }
  917. public void Dispose()
  918. {
  919. if (command != null)
  920. command.Dispose();
  921. if (connection != null)
  922. connection.Dispose();
  923. }
  924. private void Reconnect(OracleCommand cmd)
  925. {
  926. if (cmd.Connection.State == ConnectionState.Closed)
  927. {
  928. cmd.Connection.Open();
  929. LogManager.DoLog("超时重连");
  930. }
  931. }
  932. }
  933. }