DataHelper.cs 54 KB

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