DataHelper.cs 48 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263
  1. using Oracle.ManagedDataAccess.Client;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Data;
  5. using System.Text;
  6. using UAS_MES_NEW.PublicMethod;
  7. namespace UAS_MES_NEW.DataOperate
  8. {
  9. class DataHelper
  10. {
  11. //系统默认的的连接字符串
  12. private string ConnectionStrings = "Connection Timeout=30;Pooling=true;Min Pool Size=2;Max Pool Size=8;Connection Lifetime=300;Password=select!#%*(;User ID=YD_CYZZ;Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.0.85)(PORT=1521)))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=orcl)));";
  13. //用户选择的数据库的连接字符串
  14. public static string DBConnectionString;
  15. public static OracleConnection connection = null;
  16. OracleCommand command = null;
  17. int ReconnectTime = 0;
  18. //记录当前 static connection 使用的连接串,用于检测账套切换
  19. private static string currentConnString = null;
  20. /// <summary>
  21. /// 执行构造函数的时候打开数据库的链接
  22. /// </summary>
  23. public DataHelper()
  24. {
  25. try
  26. {
  27. //如果选择的是默认数据则直接用配置文件的信息连接,否则选择数据库的账套信息
  28. string targetConnString;
  29. if (DBConnectionString == null || DBConnectionString == ConnectionStrings)
  30. targetConnString = ConnectionStrings;
  31. else
  32. targetConnString = DBConnectionString;
  33. //连接复用:仅当连接不存在/未打开/账套切换时才重建。
  34. //原实现每次 new DataHelper() 都覆盖 static connection 新建物理连接,
  35. //旧连接因窗体 dh 实例持有引用不被 GC,导致单客户端泄漏 20+ 个数据库会话。
  36. if (connection == null || connection.State != ConnectionState.Open || currentConnString != targetConnString)
  37. {
  38. try
  39. {
  40. if (connection != null)
  41. connection.Close(); //开启连接池后 Close 归还池,不再占用数据库会话
  42. }
  43. catch (Exception) { }
  44. connection = new OracleConnection(targetConnString);
  45. connection.Open();
  46. currentConnString = targetConnString;
  47. }
  48. }
  49. catch (Exception e) { LogManager.DoLog(e.Message); }
  50. }
  51. /// <summary>
  52. /// 根据表名获取该表字段数据类型
  53. /// </summary>
  54. public DataTable GetColumnDataType(string TableName)
  55. {
  56. DataTable dt = new DataTable();
  57. command = new OracleCommand("select Column_Name,Data_Type from cols where TABLE_name=upper('" + TableName + "')", connection);
  58. Reconnect(command);
  59. OracleDataAdapter ad = new OracleDataAdapter(command);
  60. ad.Fill(dt);
  61. ad.Dispose();
  62. return dt;
  63. }
  64. /// <summary>
  65. /// 获取第一行第一列的信息
  66. /// </summary>
  67. public object getFieldDataByCondition(string TableName, string Field, string Condition)
  68. {
  69. DataTable dt = new DataTable();
  70. string sql = "select " + Field + " from " + TableName + " where " + Condition;
  71. command = new OracleCommand(sql, connection);
  72. Reconnect(command);
  73. OracleDataAdapter ad = new OracleDataAdapter();
  74. ad.SelectCommand = command;
  75. try
  76. {
  77. ad.Fill(dt);
  78. }
  79. catch (Exception)
  80. {
  81. connection = new OracleConnection(DBConnectionString);
  82. connection.Open();
  83. command = new OracleCommand(sql, connection);
  84. ad = new OracleDataAdapter();
  85. ad.SelectCommand = command;
  86. ad.Fill(dt);
  87. }
  88. ad.Dispose();
  89. if (dt.Rows.Count > 0)
  90. {
  91. return dt.Rows[0][0];
  92. }
  93. else
  94. {
  95. return "";
  96. }
  97. }
  98. /// <summary>
  99. /// 获取第一行第一列的信息(参数化版,防SQL注入)
  100. /// where 中使用 :p0,:p1 占位符,values 按占位符出现顺序传入
  101. /// </summary>
  102. public object getFieldDataByCondition(string TableName, string Field, string whereWithPlaceholders, params object[] values)
  103. {
  104. string sql = "select " + Field + " from " + TableName + " where " + whereWithPlaceholders;
  105. DataTable dt = (DataTable)ExecuteSql(sql, "select", values);
  106. if (dt != null && dt.Rows.Count > 0)
  107. {
  108. return dt.Rows[0][0];
  109. }
  110. return "";
  111. }
  112. /// <summary>
  113. /// 执行打印的SQL
  114. /// </summary>
  115. /// <param name="SQL">SQL语句</param>
  116. /// <param name="Parameters">动态添加的参数,主要根据条码枪扫描获取</param>
  117. /// <returns></returns>
  118. public object ExecutePrintSQL(string SQL, params string[] Parameters)
  119. {
  120. //按照?拆分数据,然后以:Param替换问号,同时添加参数
  121. string[] Param = SQL.Split('?');
  122. int ParamNum = Param.Length - 1;
  123. //条码打印必然存在需要维护的参数
  124. if (ParamNum > 0)
  125. {
  126. StringBuilder sb = new StringBuilder();
  127. for (int i = 0; i < ParamNum; i++)
  128. {
  129. sb.Append(Param[i] + ":Param" + i);
  130. }
  131. command = new OracleCommand(sb.ToString(), connection);
  132. for (int i = 0; i < ParamNum; i++)
  133. {
  134. command.Parameters.Add("Param" + i, OracleDbType.Varchar2, Parameters[i], ParameterDirection.Input);
  135. }
  136. OracleDataAdapter ad = new OracleDataAdapter(command);
  137. DataTable dt = new DataTable();
  138. ad.Fill(dt);
  139. ad.Dispose();
  140. return dt;
  141. }
  142. return "参数错误,请检查SQL语句";
  143. }
  144. /// <summary>
  145. /// 获取指定表的记录的条数 ,带条件
  146. /// </summary>
  147. /// <returns></returns>
  148. public int getRowCount(string TableName, string Condition)
  149. {
  150. DataTable dt = new DataTable();
  151. string sql = "select count(1) from " + TableName + " where " + Condition;
  152. Console.WriteLine( sql);
  153. command = new OracleCommand(sql, connection);
  154. Reconnect(command);
  155. OracleDataAdapter ad = new OracleDataAdapter(command);
  156. ad.Fill(dt);
  157. ad.Dispose();
  158. return int.Parse(dt.Rows[0][0].ToString());
  159. }
  160. /// <summary>
  161. /// 获取指定表的记录的条数 ,不带条件
  162. /// </summary>
  163. /// <param name="TableName"></param>
  164. /// <returns></returns>
  165. public int getRowCount(string TableName)
  166. {
  167. DataTable dt = new DataTable();
  168. string sql = "select count(1) from " + TableName;
  169. command = new OracleCommand(sql, connection);
  170. Reconnect(command);
  171. OracleDataAdapter ad = new OracleDataAdapter(command);
  172. ad.Fill(dt);
  173. ad.Dispose();
  174. return int.Parse(dt.Rows[0][0].ToString());
  175. }
  176. /// <summary>
  177. /// 通过表名和获取单行的记录
  178. /// </summary>
  179. public DataTable getFieldsDataByCondition(string TableName, string[] Fields, string Condition)
  180. {
  181. DataTable dt = new DataTable();
  182. string sql = "select ";
  183. sql += AddField(Fields);
  184. sql += " from " + TableName + " where " + Condition + " and rownum=1";
  185. command = new OracleCommand(sql, connection);
  186. Reconnect(command);
  187. OracleDataAdapter ad = new OracleDataAdapter(command);
  188. try
  189. {
  190. ad.Fill(dt);
  191. }
  192. catch (Exception)
  193. {
  194. connection = new OracleConnection(DBConnectionString);
  195. connection.Open();
  196. command = new OracleCommand(sql, connection);
  197. ad = new OracleDataAdapter();
  198. ad.SelectCommand = command;
  199. ad.Fill(dt);
  200. }
  201. ad.Dispose();
  202. return dt;
  203. }
  204. /// <summary>
  205. /// 通过表名和获取单行的记录(参数化版,防SQL注入)
  206. /// where 中使用 :p0,:p1 占位符,values 按占位符出现顺序传入
  207. /// </summary>
  208. public DataTable getFieldsDataByCondition(string TableName, string[] Fields, string whereWithPlaceholders, params object[] values)
  209. {
  210. string sql = "select " + AddField(Fields) + " from " + TableName + " where " + whereWithPlaceholders;
  211. return (DataTable)ExecuteSql(sql, "select", values);
  212. }
  213. /// <summary>
  214. /// 将DataTable导入到指定的表中
  215. /// </summary>
  216. /// <param name="DataTable"></param>
  217. /// <param name="TableName"></param>
  218. public void InsertDataTable(DataTable DataTable, string TableName)
  219. {
  220. for (int i = 0; i < DataTable.Rows.Count; i++)
  221. {
  222. for (int j = 0; j < DataTable.Columns.Count; j++)
  223. {
  224. }
  225. }
  226. }
  227. /// <summary>
  228. /// 按分页获取数据
  229. /// </summary>
  230. /// <param name="TableName">表名</param>
  231. /// <param name="Fields">查询字段</param>
  232. /// <param name="CurrentPage">当前页面</param>
  233. /// <param name="PageSize">页面展示条数</param>
  234. /// <param name="Caller"></param>
  235. /// <returns></returns>
  236. // SELECT * FROM (SELECT A.* FROM (SELECT* FROM datalist) A WHERE ROWNUM <= 50) WHERE ROWNUM >= 21
  237. public DataTable getFieldsDatasByPageing(string TableName, string Fields, int CurrentPage, int PageSize, string Caller, params string[] condition)
  238. {
  239. DataTable dt = new DataTable();
  240. StringBuilder sql = new StringBuilder();
  241. //先查询出配置出去的列
  242. //获取查询的列
  243. string[] caption = GetCaptionFromField(Fields);
  244. //获取对应列的描述
  245. string[] field = GetField(Fields);
  246. sql.Append(" select * from (select RowNum RN, A.* from (select ");
  247. sql.Append(AddField(caption));
  248. if (condition.Length > 0)
  249. {
  250. if (condition[0] != null && condition[0].Trim() != "")
  251. sql.Append(" from " + TableName + " where " + condition[0] + " ) A where ROWNUM <=" + CurrentPage * PageSize + ") where RN>" + (CurrentPage - 1) * PageSize);
  252. else
  253. sql.Append(" from " + TableName + ") A where ROWNUM <= " + CurrentPage * PageSize + ") where RN> " + (CurrentPage - 1) * PageSize);
  254. }
  255. command = new OracleCommand(sql.ToString(), connection);
  256. Reconnect(command);
  257. OracleDataAdapter ad = new OracleDataAdapter(command);
  258. ad.Fill(dt);
  259. ad.Dispose();
  260. dt.Columns.RemoveAt(0);
  261. foreach (DataColumn dc in dt.Columns)
  262. {
  263. dc.ColumnName = field[dt.Columns.IndexOf(dc)];
  264. dc.Caption = caption[dt.Columns.IndexOf(dc)];
  265. }
  266. return dt;
  267. }
  268. /// <summary>
  269. /// 通过表名,字段和条件获取DataTable类型的数据
  270. /// </summary>
  271. public DataTable getFieldsDatasByCondition(string TableName, string[] Fields, string Condition)
  272. {
  273. DataTable dt = new DataTable();
  274. string sql = "select ";
  275. sql += AddField(Fields);
  276. sql += " from " + TableName + " where " + Condition;
  277. command = new OracleCommand(sql, connection);
  278. Reconnect(command);
  279. OracleDataAdapter ad = new OracleDataAdapter(command);
  280. try
  281. {
  282. ad.Fill(dt);
  283. }
  284. catch (Exception)
  285. {
  286. connection = new OracleConnection(DBConnectionString);
  287. connection.Open();
  288. command = new OracleCommand(sql, connection);
  289. ad = new OracleDataAdapter();
  290. ad.SelectCommand = command;
  291. ad.Fill(dt);
  292. }
  293. ad.Dispose();
  294. return dt;
  295. }
  296. /// <summary>
  297. /// 通过表名,字段获取DataTable类型的数据
  298. /// </summary>
  299. public DataTable getFieldsDatas(string TableName, string Fields)
  300. {
  301. DataTable dt = new DataTable();
  302. string sql = "select ";
  303. sql += Fields;
  304. sql += " from " + TableName;
  305. command = new OracleCommand(sql, connection);
  306. Reconnect(command);
  307. OracleDataAdapter ad = new OracleDataAdapter(command);
  308. ad.SelectCommand = command;
  309. try
  310. {
  311. ad.Fill(dt);
  312. }
  313. catch (Exception)
  314. {
  315. connection = new OracleConnection(DBConnectionString);
  316. connection.Open();
  317. command = new OracleCommand(sql, connection);
  318. ad = new OracleDataAdapter();
  319. ad.SelectCommand = command;
  320. ad.Fill(dt);
  321. }
  322. ad.Dispose();
  323. return dt;
  324. }
  325. /// <summary>
  326. /// 通过表名,字段获取DataTable类型的数据(带行数上限,防止全表加载导致内存膨胀)
  327. /// 列表类界面应优先使用此重载或已有的 getFieldsDatasByPageing,避免无限制 Fill 全表
  328. /// </summary>
  329. public DataTable getFieldsDatas(string TableName, string Fields, int maxRows)
  330. {
  331. DataTable dt = new DataTable();
  332. string sql = "select " + Fields + " from " + TableName + " where rownum <= " + maxRows;
  333. command = new OracleCommand(sql, connection);
  334. Reconnect(command);
  335. OracleDataAdapter ad = new OracleDataAdapter();
  336. ad.SelectCommand = command;
  337. try
  338. {
  339. ad.Fill(dt);
  340. }
  341. catch (Exception)
  342. {
  343. connection = new OracleConnection(DBConnectionString);
  344. connection.Open();
  345. command = new OracleCommand(sql, connection);
  346. ad = new OracleDataAdapter();
  347. ad.SelectCommand = command;
  348. ad.Fill(dt);
  349. }
  350. ad.Dispose();
  351. return dt;
  352. }
  353. /// <summary>
  354. /// 根据DataTable和指定的表名更新数据,如果需要保存新增的数据则需要传递一条Insert的SQL
  355. /// </summary>
  356. /// <param name="DataTable"></param>
  357. /// <param name="TableName"></param>
  358. /// <param name="Condition"></param>
  359. public void UpDateTableByCondition(DataTable DataTable, string TableName, string PrimaryKey, params string[] sql)
  360. {
  361. if (DataTable == null)
  362. {
  363. return;
  364. }
  365. StringBuilder sb = new StringBuilder();
  366. //预防插入的DataTable中存在不属于该表的列,在进行下一步操作之前全部剔除
  367. DataTable data = (DataTable)ExecuteSql("select Column_Name,Data_Type from cols where TABLE_name=upper('" + TableName + "')", "select");
  368. //将所有的字段拼接起来
  369. for (int i = 0; i < data.Rows.Count; i++)
  370. {
  371. sb.Append("#" + data.Rows[i]["Column_Name"].ToString());
  372. }
  373. //移除掉所有不属于该表的列
  374. for (int i = DataTable.Columns.Count - 1; i >= 0; i--)
  375. {
  376. if (!sb.ToString().Contains(DataTable.Columns[i].ColumnName.ToUpper()))
  377. {
  378. DataTable.Columns.RemoveAt(i);
  379. }
  380. }
  381. sb.Clear();
  382. //计算有多少个是新加的行,根据主键为空来进行判断
  383. int NewRowCount = 0;
  384. for (int i = 0; i < DataTable.Rows.Count; i++)
  385. {
  386. if (DataTable.Rows[i][PrimaryKey] == null || DataTable.Rows[i][PrimaryKey].ToString() == "")
  387. {
  388. NewRowCount = NewRowCount + 1;
  389. }
  390. }
  391. if (sql.Length > 0)
  392. {
  393. if (NewRowCount > 0)
  394. {
  395. //获取参数的个数
  396. int paramsNum = sql[0].Split(':').Length - 1;
  397. //解析参数的数据
  398. string[] param = GetParamFromSQL(sql[0]);
  399. //新建一个二维数组去
  400. string[][] param_array = new string[paramsNum][];
  401. //实例化每个一维数组
  402. for (int i = 0; i < paramsNum; i++)
  403. {
  404. param_array[i] = new string[NewRowCount];
  405. }
  406. //设置每列参数的索引
  407. int num = 0;
  408. //变量所有的行,如果有主键为空的则移除,不为空的进行参数的拼接
  409. for (int i = DataTable.Rows.Count - 1; i >= 0; i--)
  410. {
  411. if (DataTable.Rows[i][PrimaryKey] == null || DataTable.Rows[i][PrimaryKey].ToString() == "")
  412. {
  413. //当为新添加行的时候才去设置参数,设置过后索引+1
  414. for (int j = 0; j < paramsNum; j++)
  415. {
  416. param_array[j][num] = DataTable.Rows[i][param[j]].ToString();
  417. }
  418. DataTable.Rows.RemoveAt(i);
  419. num++;
  420. }
  421. }
  422. BatchInsertDataTable(sql[0], param, param_array);
  423. }
  424. }
  425. //不是新增行的启用更新的方法
  426. sb.Append("update " + TableName + " set ");
  427. //拼接语句,特殊处理日期
  428. foreach (DataColumn dc in DataTable.Columns)
  429. {
  430. if (!dc.DataType.ToString().Equals("System.DateTime"))
  431. {
  432. sb.Append(dc.Caption + "=:" + dc.Caption + ",");
  433. }
  434. else
  435. {
  436. sb.Append(dc.Caption + "=:" + dc.Caption + ",");
  437. }
  438. }
  439. sb.Remove(sb.Length - 1, 1);
  440. sb.Append(" where " + PrimaryKey + "=:" + PrimaryKey);
  441. command = new OracleCommand(sb.ToString(), connection);
  442. OracleDataAdapter ad = new OracleDataAdapter(command);
  443. // 参数的长度是DataTable的行数决定的
  444. command.ArrayBindCount = DataTable.Rows.Count;
  445. //默认全部是Varchar2类型的
  446. OracleDbType ob = OracleDbType.Varchar2;
  447. for (int i = 0; i < DataTable.Columns.Count; i++)
  448. {
  449. object[] param = new object[DataTable.Rows.Count];
  450. for (int j = 0; j < DataTable.Rows.Count; j++)
  451. {
  452. DateTime dt = DateTime.Now;
  453. if (DateTime.TryParse(DataTable.Rows[j][i].ToString(), out dt))
  454. {
  455. param[j] = dt;
  456. ob = OracleDbType.Date;
  457. }
  458. else
  459. {
  460. ob = OracleDbType.Varchar2;
  461. param[j] = DataTable.Rows[j][i];
  462. }
  463. }
  464. //添加批量更新的参数
  465. command.Parameters.Add(new OracleParameter(DataTable.Columns[i].Caption, ob, param, ParameterDirection.Input));
  466. }
  467. ad.UpdateCommand = command;
  468. ad.Update(DataTable);
  469. ad.Dispose();
  470. }
  471. /// <summary>
  472. /// 获取DbFind的数据的DataTable的结构
  473. /// </summary>
  474. /// <param name="field"></param>
  475. /// <param name="caller"></param>
  476. /// <returns></returns>
  477. public DataTable GetDbFindDataTable(string field, string caller)
  478. {
  479. string sql = "select * from dbfindsetui where ds_caller='" + caller + "' and ds_whichui='" + field + "'";
  480. DataTable dt = (DataTable)ExecuteSql(sql, "select");
  481. if (dt.Rows.Count != 0)
  482. {
  483. //通过#号分割字段
  484. string[] dbfield = dt.Rows[0]["ds_findtoui"].ToString().Split('#');
  485. string[] cnfield = dt.Rows[0]["ds_dbcaption"].ToString().Split('#');
  486. //获取查询要查询的Table
  487. string dbtable = dt.Rows[0]["ds_tables"].ToString();
  488. //拼接查询的字段
  489. for (int i = 0; i < dbfield.Length; i++)
  490. {
  491. dbfield[i] = dbfield[i].Split(',')[0];
  492. }
  493. //新建一个空的DataTable
  494. DataTable dt1 = new DataTable();
  495. //往空的DataTable添加结构,ColumnName是中文,Caption是实际的字段名称
  496. for (int i = 0; i < cnfield.Length; i++)
  497. {
  498. dt1.Columns.Add(cnfield[i]);
  499. dt1.Columns[i].Caption = dbfield[i];
  500. }
  501. //返回一个带有结构的空的DataTable
  502. //DbFind.BindTable1 = dbtable;
  503. return dt1;
  504. }
  505. else
  506. {
  507. return null;
  508. }
  509. }
  510. /// <summary>
  511. /// 检测内容是否存在
  512. /// </summary>
  513. /// <param name="TableName"></param>
  514. /// <param name="Condition"></param>
  515. /// <returns></returns>
  516. public bool CheckExist(string TableName, string Condition)
  517. {
  518. string sql = "select count(1) from " + TableName + " where " + Condition;
  519. command = new OracleCommand(sql, connection);
  520. Reconnect(command);
  521. OracleDataAdapter ad = new OracleDataAdapter(command);
  522. DataTable dt = new DataTable();
  523. try
  524. {
  525. ad.Fill(dt);
  526. }
  527. catch (Exception)
  528. {
  529. connection = new OracleConnection(DBConnectionString);
  530. connection.Open();
  531. command = new OracleCommand(sql, connection);
  532. ad = new OracleDataAdapter();
  533. ad.SelectCommand = command;
  534. ad.Fill(dt);
  535. }
  536. ad.Dispose();
  537. Console.WriteLine(dt.Rows[0][0].ToString());
  538. Console.WriteLine(int.Parse(dt.Rows[0][0].ToString()) > 0);
  539. return int.Parse(dt.Rows[0][0].ToString()) > 0;
  540. }
  541. /// <summary>
  542. /// 直接执行SQL,同时传入SQL的类型
  543. /// </summary>
  544. /// <param name="SQL"></param>
  545. /// <param name="Type"></param>
  546. /// <returns></returns>
  547. public object ExecuteSql(string SQL, string Type, params object[] names)
  548. {
  549. object result = null;
  550. command = new OracleCommand(SQL, connection);
  551. Reconnect(command);
  552. //用来拼接参数的
  553. if (names.Length > 0)
  554. {
  555. string[] par = SQL.Split(':');
  556. //用来存参数的数组
  557. StringBuilder[] addpar = new StringBuilder[par.Length - 1];
  558. for (int i = 0; i < par.Length - 1; i++)
  559. {
  560. //新建一个char类型的数组用来存储每个字节的变量
  561. char[] c = par[i + 1].ToCharArray();
  562. addpar[i] = new StringBuilder();
  563. for (int j = 0; j < c.Length; j++)
  564. {
  565. if (c[j] != ' ' && c[j] != ',' && c[j] != ')')
  566. {
  567. addpar[i].Append(c[j]);
  568. }
  569. else
  570. {
  571. break;
  572. }
  573. }
  574. }
  575. for (int i = 0; i < addpar.Length; i++)
  576. command.Parameters.Add(new OracleParameter(addpar[i].ToString(), OracleDbType.Varchar2, names[i], ParameterDirection.Input));
  577. }
  578. Console.WriteLine(SQL);
  579. switch (Type.ToUpper())
  580. {
  581. case "SELECT":
  582. OracleDataAdapter ad = new OracleDataAdapter(command);
  583. result = new DataTable();
  584. try
  585. {
  586. ad.Fill((DataTable)result);
  587. }
  588. catch (Exception)
  589. {
  590. connection = new OracleConnection(DBConnectionString);
  591. connection.Open();
  592. command = new OracleCommand(SQL, connection);
  593. ad = new OracleDataAdapter();
  594. ad.SelectCommand = command;
  595. ad.Fill((DataTable)result);
  596. }
  597. break;
  598. case "DELETE":
  599. try
  600. {
  601. result = command.ExecuteNonQuery();
  602. }
  603. catch (Exception)
  604. {
  605. command.Connection = new OracleConnection(DBConnectionString);
  606. command.Connection.Open();
  607. result = command.ExecuteNonQuery();
  608. }
  609. break;
  610. case "UPDATE":
  611. try
  612. {
  613. result = command.ExecuteNonQuery();
  614. }
  615. catch (Exception)
  616. {
  617. command.Connection = new OracleConnection(DBConnectionString);
  618. command.Connection.Open();
  619. result = command.ExecuteNonQuery();
  620. }
  621. break;
  622. case "INSERT":
  623. try
  624. {
  625. result = command.ExecuteNonQuery();
  626. }
  627. catch (Exception)
  628. {
  629. command.Connection = new OracleConnection(DBConnectionString);
  630. command.Connection.Open();
  631. result = command.ExecuteNonQuery();
  632. }
  633. break;
  634. }
  635. return result;
  636. }
  637. /// <summary>
  638. /// 为了同步BS端的条码维护,检测时允许问号的存在,在检测时默认将问号换成:Param参数
  639. /// </summary>
  640. /// <param name="SQL"></param>
  641. public void CheckSQL(string SQL)
  642. {
  643. SQL = SQL.Replace("?", ":Param");
  644. command = new OracleCommand(SQL, connection);
  645. command.ExecuteNonQuery();
  646. }
  647. public int GetDistinctRowCount(string TableName, string Field)
  648. {
  649. DataTable dt = new DataTable();
  650. string sql = "select distinct count('" + Field + "') from " + TableName;
  651. command = new OracleCommand(sql, connection);
  652. Reconnect(command);
  653. OracleDataAdapter ad = new OracleDataAdapter(command);
  654. try
  655. {
  656. ad.Fill(dt);
  657. }
  658. catch (Exception)
  659. {
  660. connection = new OracleConnection(DBConnectionString);
  661. connection.Open();
  662. command = new OracleCommand(sql, connection);
  663. ad = new OracleDataAdapter();
  664. ad.SelectCommand = command;
  665. ad.Fill(dt);
  666. }
  667. ad.Dispose();
  668. return int.Parse(dt.Rows[0][0].ToString());
  669. }
  670. /// <summary>
  671. /// 根据Caller获取流水号
  672. /// </summary>
  673. /// <param name="Caller"></param>
  674. /// <returns></returns>
  675. public string GetSerialNumberByCaller(string Caller)
  676. {
  677. string SerialNumber = getFieldDataByCondition("MaxNumbers", "mn_number", "mn_tablename='" + Caller + "'").ToString();
  678. UpdateByCondition("MaxNumbers", "mn_number=mn_number+1", "mn_tablename='" + Caller + "'");
  679. return SerialNumber;
  680. }
  681. /// <summary>
  682. /// 根据主键ID删除表的数据
  683. /// </summary>
  684. /// <param name="TableName">表名</param>
  685. /// <param name="ID">主键</param>
  686. /// <param name="DeleteID">需要删除主键ID的数组</param>
  687. public void DeleteDataByID(string TableName, string ID, string[] DeleteID)
  688. {
  689. string sql = "delete from " + TableName + " where " + ID + " =:DeleteID";
  690. command = new OracleCommand(sql, connection);
  691. Reconnect(command);
  692. command.ArrayBindCount = DeleteID.Length;
  693. command.Parameters.Add(new OracleParameter("DeleteID", OracleDbType.Long, DeleteID, ParameterDirection.Input));
  694. try
  695. {
  696. command.ExecuteNonQuery();
  697. }
  698. catch (Exception)
  699. {
  700. command.Connection = new OracleConnection(DBConnectionString);
  701. command.Connection.Open();
  702. command.ExecuteNonQuery();
  703. }
  704. }
  705. /// <summary>
  706. /// 通过序列的名称获取序列
  707. /// </summary>
  708. /// <param name="SeqName"></param>
  709. /// <returns></returns>
  710. public string GetSEQ(string SeqName)
  711. {
  712. DataTable dt = new DataTable();
  713. dt = (DataTable)ExecuteSql("SELECT " + SeqName + ".NEXTVAL FROM DUAL", "select");
  714. return dt.Rows[0][0].ToString();
  715. }
  716. /// <summary>
  717. /// 通过序列的名称获取序列
  718. /// </summary>
  719. /// <param name="SeqName"></param>
  720. /// <returns></returns>
  721. public string[] GetSEQ(string SeqName, int Num)
  722. {
  723. DataTable dt = new DataTable();
  724. dt = (DataTable)ExecuteSql("SELECT " + SeqName + ".nextval FROM DUAL CONNECT BY LEVEL<=" + Num, "select");
  725. string[] SerialNum = new string[dt.Rows.Count];
  726. for (int i = 0; i < dt.Rows.Count; i++)
  727. {
  728. SerialNum[i] = dt.Rows[i][0].ToString();
  729. }
  730. return SerialNum;
  731. }
  732. public void SaveDataTable(DataTable dt, string TableName, string ID, params string[] sql)
  733. {
  734. if (dt == null)
  735. {
  736. return;
  737. }
  738. StringBuilder sb = new StringBuilder();
  739. //预防插入的DataTable中存在不属于该表的列,在进行下一步操作之前全部剔除
  740. DataTable data = (DataTable)ExecuteSql("select Column_Name,Data_Type from cols where TABLE_name=upper('" + TableName + "')", "select");
  741. //将所有的字段拼接起来
  742. for (int i = 0; i < data.Rows.Count; i++)
  743. {
  744. sb.Append("#" + data.Rows[i]["Column_Name"].ToString());
  745. }
  746. //移除掉所有不属于该表的列
  747. for (int i = dt.Columns.Count - 1; i >= 0; i--)
  748. {
  749. if (!sb.ToString().Contains(dt.Columns[i].ColumnName.ToUpper()))
  750. {
  751. dt.Columns.RemoveAt(i);
  752. }
  753. }
  754. sb.Clear();
  755. //计算有多少个是新加的行,根据主键为空来进行判断
  756. int NewRowCount = 0;
  757. for (int i = 0; i < dt.Rows.Count; i++)
  758. {
  759. if (dt.Rows[i][ID] == null || dt.Rows[i][ID].ToString() == "")
  760. {
  761. NewRowCount = NewRowCount + 1;
  762. }
  763. }
  764. if (sql.Length > 0)
  765. {
  766. if (NewRowCount > 0)
  767. {
  768. //获取参数的个数
  769. int paramsNum = sql[0].Split(':').Length - 1;
  770. //解析参数的数据
  771. string[] param = GetParamFromSQL(sql[0]);
  772. //新建一个二维数组去
  773. string[][] param_array = new string[paramsNum][];
  774. //实例化每个一维数组
  775. for (int i = 0; i < paramsNum; i++)
  776. {
  777. param_array[i] = new string[NewRowCount];
  778. }
  779. //设置每列参数的索引
  780. int num = 0;
  781. //变量所有的行,如果有主键为空的则移除,不为空的进行参数的拼接
  782. for (int i = dt.Rows.Count - 1; i >= 0; i--)
  783. {
  784. if (dt.Rows[i][ID] == null || dt.Rows[i][ID].ToString() == "")
  785. {
  786. //当为新添加行的时候才去设置参数,设置过后索引+1
  787. for (int j = 0; j < paramsNum; j++)
  788. {
  789. param_array[j][num] = dt.Rows[i][param[j]].ToString();
  790. }
  791. dt.Rows.RemoveAt(i);
  792. num++;
  793. }
  794. }
  795. BatchInsertDataTable(sql[0], param, param_array);
  796. }
  797. }
  798. sb.Clear();
  799. sb.Append("update " + TableName + " set ");
  800. int ColumnCount = dt.Columns.Count;
  801. int RowCount = dt.Rows.Count;
  802. //存数据的参数
  803. List<string[]> Parameter = new List<string[]>();
  804. //存参数名的参数
  805. string[] ParName = new string[ColumnCount];
  806. for (int i = 0; i < ColumnCount; i++)
  807. {
  808. ParName[i] = dt.Columns[i].ColumnName;
  809. if (i == dt.Columns.Count - 1)
  810. sb.Append(dt.Columns[i].ColumnName + "=:" + dt.Columns[i].ColumnName);
  811. else
  812. sb.Append(dt.Columns[i].ColumnName + "=:" + dt.Columns[i].ColumnName + ",");
  813. }
  814. sb.Append(" where " + ID + " =:" + ID);
  815. //先添加参数
  816. Parameter.Add(ParName);
  817. //添加参数的具体内容
  818. for (int i = 0; i < ColumnCount; i++)
  819. {
  820. string[] par = new string[RowCount];
  821. for (int j = 0; j < RowCount; j++)
  822. {
  823. par[j] = dt.Rows[j][i].ToString();
  824. }
  825. Parameter.Add(par);
  826. }
  827. BatchInsert(sb.ToString(), Parameter.ToArray());
  828. }
  829. /// <summary>
  830. /// 批量通过SQL来执行插入操作 ,参数的第一个数一个string[]数组,用来传递需要添加的参数的名称
  831. /// 之后的是名称参数数组对应的 ,所有的插入参数数据长度必须是一致的
  832. /// </summary>
  833. /// <param name="sql"></param>
  834. /// <param name="names"></param>
  835. public void BatchInsert(string sql, params object[][] names)
  836. {
  837. command = new OracleCommand(sql, connection);
  838. Reconnect(command);
  839. command.ArrayBindCount = names[1].Length;
  840. //因为第一个数组保存的是参数的名称,所以循环从1而不是0开始
  841. //将第一个数组的下标固定为0作为循环添加的参数的名称
  842. for (int i = 1; i <= names[0].Length; i++)
  843. {
  844. command.Parameters.Add(new OracleParameter(names[0][i - 1].ToString(), OracleDbType.Varchar2, names[i], ParameterDirection.Input));
  845. }
  846. try
  847. {
  848. command.ExecuteNonQuery();
  849. }
  850. catch (Exception)
  851. {
  852. command.Connection = new OracleConnection(DBConnectionString);
  853. command.Connection.Open();
  854. command.ExecuteNonQuery();
  855. }
  856. }
  857. public void BatchInsertDataTable(string sql, string[] param, params object[][] param1)
  858. {
  859. command = new OracleCommand(sql, connection);
  860. Reconnect(command);
  861. command.ArrayBindCount = param1[0].Length;
  862. //因为第一个数组保存的是参数的名称,所以循环从1而不是0开始
  863. //将第一个数组的下标固定为0作为循环添加的参数的名称
  864. for (int i = 0; i < param.Length; i++)
  865. {
  866. command.Parameters.Add(new OracleParameter(param[i].ToString(), OracleDbType.Varchar2, param1[i], ParameterDirection.Input));
  867. }
  868. try
  869. {
  870. command.ExecuteNonQuery();
  871. }
  872. catch (Exception)
  873. {
  874. command.Connection = new OracleConnection(DBConnectionString);
  875. command.Connection.Open();
  876. command.ExecuteNonQuery();
  877. }
  878. }
  879. /// <summary>
  880. /// 取Configs表中的配置,进行该客户是否执行某个操作
  881. /// </summary>
  882. /// <param name="Code"></param>
  883. /// <param name="Caller"></param>
  884. /// <returns></returns>
  885. public object GetConfig(string Code, string Caller)
  886. {
  887. DataTable dt = new DataTable();
  888. string sql = "select Data from configs where code='" + Code + "' and caller='" + Caller + "'";
  889. dt = (DataTable)ExecuteSql(sql, "select");
  890. if (dt.Rows.Count == 0)
  891. {
  892. return "";
  893. }
  894. else
  895. {
  896. return dt.Rows[0]["Data"];
  897. }
  898. }
  899. //将数据类型的列类型转换为DataTable
  900. public DataTable DataTypeColumnToDataTable(DataTable dt)
  901. {
  902. DataTable dt1 = new DataTable();
  903. dt1.Rows.Add();
  904. foreach (DataRow dr in dt.Rows)
  905. {
  906. dt1.Columns.Add(dr[0].ToString());
  907. int index = dt.Rows.IndexOf(dr);
  908. if (dr[1].ToString() == "NUMBER")
  909. {
  910. dt1.Rows[0][index] = 0;
  911. }
  912. if (dr[1].ToString() == "VARCHAR2")
  913. {
  914. dt1.Rows[0][index] = "这是一段文字";
  915. }
  916. if (dr[1].ToString() == "DATE")
  917. {
  918. dt1.Rows[0][index] = DateTime.Now.ToString("yyyy-MM-dd");
  919. }
  920. if (dr[1].ToString() == "FLOAT")
  921. {
  922. dt1.Rows[0][index] = 1.0;
  923. }
  924. if (dr[1].ToString() == "CLOB")
  925. {
  926. dt1.Rows[0][index] = "一段长文字";
  927. }
  928. }
  929. return dt1;
  930. }
  931. /// <summary>
  932. /// 通过条件更新
  933. /// </summary>
  934. /// <param name="TableName"></param>
  935. /// <param name="update"></param>
  936. /// <param name="condition"></param>
  937. public string UpdateByCondition(string TableName, string update, string condition)
  938. {
  939. string sql = "update " + TableName + " set " + update + " where " + condition;
  940. command = new OracleCommand(sql, connection);
  941. Console.WriteLine(sql);
  942. Reconnect(command);
  943. try
  944. {
  945. command.ExecuteNonQuery();
  946. }
  947. catch (Exception)
  948. {
  949. command.Connection = new OracleConnection(DBConnectionString);
  950. command.Connection.Open();
  951. command.ExecuteNonQuery();
  952. }
  953. return sql;
  954. }
  955. /// <summary>
  956. /// 调用存储过程
  957. /// </summary>
  958. /// <param name="ProcedureName"></param>
  959. /// <param name="param"></param>
  960. public void CallProcedure(string ProcedureName, ref string[] param)
  961. {
  962. command = new OracleCommand(ProcedureName);
  963. command.Connection = connection;
  964. Reconnect(command);
  965. command.CommandText = ProcedureName;
  966. command.CommandType = CommandType.StoredProcedure;
  967. for (int i = 0; i < param.Length; i++)
  968. command.Parameters.Add(new OracleParameter(param[i].ToString(), OracleDbType.Varchar2, 4000, param[i], ParameterDirection.InputOutput));
  969. try
  970. {
  971. command.ExecuteNonQuery();
  972. }
  973. catch (Exception)
  974. {
  975. command.Connection = new OracleConnection(DBConnectionString);
  976. command.Connection.Open();
  977. command.ExecuteNonQuery();
  978. }
  979. for (int i = 0; i < command.Parameters.Count; i++)
  980. param[i] = command.Parameters[i].Value.ToString();
  981. }
  982. public void CallProcedure(string ProcedureName, string[] ParamName, ref string[] param)
  983. {
  984. command = new OracleCommand(ProcedureName);
  985. command.Connection = connection;
  986. Reconnect(command);
  987. command.CommandText = ProcedureName;
  988. command.CommandType = CommandType.StoredProcedure;
  989. for (int i = 0; i < param.Length; i++)
  990. {
  991. command.Parameters.Add(new OracleParameter(ParamName[i], OracleDbType.Varchar2, 200, param[i], ParameterDirection.InputOutput));
  992. //command.Parameters.Add(new OracleParameter(ParamName[i], OracleType.VarChar, 200, ParameterDirection.InputOutput, "", DataRowVersion.Default, true, param[i]));
  993. }
  994. try
  995. {
  996. command.ExecuteNonQuery();
  997. }
  998. catch (Exception)
  999. {
  1000. command.Connection = new OracleConnection(ConnectionStrings);
  1001. command.Connection.Open();
  1002. command.ExecuteNonQuery();
  1003. }
  1004. for (int i = 0; i < command.Parameters.Count; i++)
  1005. param[i] = command.Parameters[i].Value.ToString();
  1006. }
  1007. /// <summary>
  1008. /// 出现异常进行回滚的执行方法
  1009. /// </summary>
  1010. /// <param name="SQL"></param>
  1011. public void ExecuteSQLTran(params string[] SQL)
  1012. {
  1013. OracleTransaction tx = connection.BeginTransaction();
  1014. command = new OracleCommand();
  1015. command.Connection = connection;
  1016. command.Transaction = tx;
  1017. try
  1018. {
  1019. foreach (string sql in SQL)
  1020. {
  1021. if (!String.IsNullOrEmpty(sql))
  1022. {
  1023. Console.WriteLine(sql);
  1024. command.CommandText = sql;
  1025. try
  1026. {
  1027. command.ExecuteNonQuery();
  1028. }
  1029. catch (Exception)
  1030. {
  1031. command.Connection = new OracleConnection(DBConnectionString);
  1032. command.Connection.Open();
  1033. command.ExecuteNonQuery();
  1034. }
  1035. }
  1036. }
  1037. tx.Commit();
  1038. }
  1039. catch (Exception E)
  1040. {
  1041. tx.Rollback();
  1042. throw new Exception(E.Message);
  1043. }
  1044. }
  1045. /// <summary>
  1046. /// 用于将string 的数组转换成SQL的查询内容
  1047. /// </summary>
  1048. /// <param name="Fields"></param>
  1049. /// <returns></returns>
  1050. private string AddField(string[] Fields)
  1051. {
  1052. string sql = " ";
  1053. foreach (string field in Fields)
  1054. {
  1055. sql += field + ",";
  1056. }
  1057. return sql.Substring(0, sql.Length - 1);
  1058. }
  1059. /// <summary>
  1060. /// 通过查询的内容获取到字段的描述
  1061. /// </summary>
  1062. /// <param name="field"></param>
  1063. /// <returns></returns>
  1064. private static string[] GetCaptionFromField(string field)
  1065. {
  1066. string[] caption = field.Split(',');
  1067. for (int i = 0; i < caption.Length; i++)
  1068. {
  1069. caption[i] = caption[i].Substring(0, caption[i].LastIndexOf("as")).Trim();
  1070. }
  1071. return caption;
  1072. }
  1073. /// <summary>
  1074. /// 通过查询的语句获取查询的字段
  1075. /// </summary>
  1076. /// <param name="field"></param>
  1077. /// <returns></returns>
  1078. private static string[] GetField(string field)
  1079. {
  1080. string[] fields = field.Split(',');
  1081. for (int i = 0; i < fields.Length; i++)
  1082. {
  1083. fields[i] = fields[i].Substring(fields[i].LastIndexOf("as") + 2, fields[i].Length - fields[i].LastIndexOf("as") - 2).Trim();
  1084. }
  1085. return fields;
  1086. }
  1087. public object GetLabelParam(string sql)
  1088. {
  1089. DataTable dt = new DataTable();
  1090. command = new OracleCommand(sql, connection);
  1091. Reconnect(command);
  1092. OracleDataAdapter ad = new OracleDataAdapter();
  1093. ad.SelectCommand = command;
  1094. try
  1095. {
  1096. ad.Fill(dt);
  1097. }
  1098. catch (Exception)
  1099. {
  1100. connection = new OracleConnection(DBConnectionString);
  1101. connection.Open();
  1102. command = new OracleCommand(sql, connection);
  1103. ad = new OracleDataAdapter();
  1104. ad.SelectCommand = command;
  1105. ad.Fill(dt);
  1106. }
  1107. if (dt.Rows.Count > 0)
  1108. {
  1109. ad.Dispose();
  1110. return dt.Rows[0][0];
  1111. }
  1112. else
  1113. {
  1114. return "";
  1115. }
  1116. }
  1117. public static string[] GetParamFromSQL(string SQL)
  1118. {
  1119. string[] par = SQL.Split(':');
  1120. //用来存参数的数组
  1121. StringBuilder[] addpar = new StringBuilder[par.Length - 1];
  1122. string[] param = new string[par.Length - 1];
  1123. for (int i = 0; i < par.Length - 1; i++)
  1124. {
  1125. //新建一个char类型的数组用来存储每个字节的变量
  1126. char[] c = par[i + 1].ToCharArray();
  1127. addpar[i] = new StringBuilder();
  1128. for (int j = 0; j < c.Length; j++)
  1129. {
  1130. if (c[j] != ' ' && c[j] != ',' && c[j] != ')')
  1131. {
  1132. addpar[i].Append(c[j]);
  1133. }
  1134. else
  1135. {
  1136. break;
  1137. }
  1138. }
  1139. }
  1140. for (int i = 0; i < par.Length - 1; i++)
  1141. {
  1142. param[i] = addpar[i].ToString();
  1143. }
  1144. return param;
  1145. }
  1146. public void Dispose()
  1147. {
  1148. //command 为实例字段,可安全释放
  1149. if (command != null)
  1150. {
  1151. try { command.Dispose(); } catch (Exception) { }
  1152. command = null;
  1153. }
  1154. //connection 为 static 共享对象,开启连接池后由连接池统一管理生命周期,
  1155. //此处不主动 Close 以避免影响其它正在使用该连接的实例
  1156. }
  1157. private void Reconnect(OracleCommand cmd)
  1158. {
  1159. //先确保连接对象存在,避免null引用
  1160. if (cmd.Connection == null)
  1161. {
  1162. cmd.Connection = new OracleConnection(string.IsNullOrEmpty(DBConnectionString) ? ConnectionStrings : DBConnectionString);
  1163. }
  1164. ConnectionState state = cmd.Connection.State;
  1165. //Closed/Broken 才需要重连,正常状态直接返回,减少无谓的异常触发
  1166. if (state == ConnectionState.Closed || state == ConnectionState.Broken)
  1167. {
  1168. try
  1169. {
  1170. if (state == ConnectionState.Broken)
  1171. {
  1172. cmd.Connection.Close();
  1173. }
  1174. cmd.Connection.Open();
  1175. LogManager.DoLog("连接状态异常(" + state + ")已重连");
  1176. }
  1177. catch (Exception ex)
  1178. {
  1179. LogManager.DoLog("重连失败:" + ex.Message);
  1180. throw;
  1181. }
  1182. }
  1183. }
  1184. }
  1185. }