DataHelper.cs 35 KB

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