DataHelper.cs 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447
  1. using Oracle.ManagedDataAccess.Client;
  2. using System;
  3. using System.Data;
  4. using System.Text;
  5. using System.Runtime.InteropServices;
  6. namespace DllService
  7. {
  8. [Guid("67D63258-6F70-400C-BE1A-1AFE54384004")]
  9. [InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
  10. private interface IDataHelper
  11. {
  12. [DispId(8)]
  13. object getFieldDataByCondition(string TableName, string Field, string Condition);
  14. DataTable getFieldsDataByCondition(string TableName, string[] Fields, string Condition);
  15. DataTable getFieldsDatas(string TableName, string Fields);
  16. bool CheckExist(string TableName, string Condition);
  17. object ExecuteSql(string SQL, string Type, params object[] names);
  18. void BatchInsert(string sql, params object[][] names);
  19. string UpdateByCondition(string TableName, string update, string condition);
  20. void CallProcedure(string ProcedureName, ref string[] param);
  21. }
  22. [Guid("1886A2C6-7BDF-4990-A9B9-F3228DEC0906")]
  23. [ClassInterface(ClassInterfaceType.None)]
  24. [ComSourceInterfaces(typeof(IDataHelper))]
  25. [ProgId("DllService.DataHelper")]
  26. private class DataHelper : IDataHelper
  27. {
  28. //系统默认的的连接字符串
  29. private string ConnectionStrings = "";
  30. //用户选择的数据库的连接字符串
  31. private OracleConnection connection = null;
  32. //用户选择的数据库的连接字符串
  33. OracleCommand command =null;
  34. private DataHelper()
  35. {
  36. string Environment = "MES_TEST";
  37. try
  38. {
  39. //如果选择的是默认数据则直接用配置文件的信息连接,否则选择数据库的账套信息
  40. if (Environment.ToUpper() == "MES")
  41. {
  42. ConnectionStrings = "Password=select!#%*(;User ID=MES;Pooling=false;Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=117.25.180.218)(PORT=1521)))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=orcl)));";
  43. connection = new OracleConnection(ConnectionStrings);
  44. }
  45. else if (Environment.ToUpper() == "MES_TEST")
  46. {
  47. ConnectionStrings = "Password=select!#%*(;User ID=MES_TEST;Pooling=false;Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=117.25.180.218)(PORT=1521)))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=orcl)));";
  48. connection = new OracleConnection(ConnectionStrings);
  49. }
  50. command.Connection = connection;
  51. command.Connection.Open();
  52. command.CommandTimeout = 0;
  53. }
  54. catch (Exception)
  55. {
  56. if (Environment.ToUpper() == "MES")
  57. {
  58. ConnectionStrings = "Password=select!#%*(;User ID=MES;Pooling=false;Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=117.25.180.218)(PORT=1521)))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=orcl)));";
  59. connection = new OracleConnection(ConnectionStrings);
  60. }
  61. else if (Environment.ToUpper() == "MES_TEST")
  62. {
  63. ConnectionStrings = "Password=select!#%*(;User ID=MES_TEST;Pooling=false;Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=117.25.180.218)(PORT=1521)))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=orcl)));";
  64. connection = new OracleConnection(ConnectionStrings);
  65. }
  66. try
  67. {
  68. command.Connection = connection;
  69. command.Connection.Open();
  70. }
  71. catch (Exception)
  72. {
  73. return;
  74. }
  75. command.CommandTimeout = 0;
  76. }
  77. }
  78. /// <summary>
  79. /// 获取第一行第一列的信息
  80. /// </summary>
  81. private object getFieldDataByCondition(string TableName, string Field, string Condition)
  82. {
  83. DataTable dt = new DataTable();
  84. string sql = "select " + Field + " from " + TableName + " where " + Condition;
  85. command = new OracleCommand(sql, connection);
  86. Reconnect(command);
  87. OracleDataAdapter ad = new OracleDataAdapter();
  88. ad.SelectCommand = command;
  89. try
  90. {
  91. ad.Fill(dt);
  92. }
  93. catch (Exception)
  94. {
  95. connection = new OracleConnection(ConnectionStrings);
  96. connection.Open();
  97. command = new OracleCommand(sql, connection);
  98. ad = new OracleDataAdapter();
  99. ad.SelectCommand = command;
  100. ad.Fill(dt);
  101. }
  102. ad.Dispose();
  103. command.Dispose();
  104. if (dt.Rows.Count > 0)
  105. {
  106. return dt.Rows[0][0];
  107. }
  108. else
  109. {
  110. return "";
  111. }
  112. }
  113. /// <summary>
  114. /// 通过表名和获取单行的记录
  115. /// </summary>
  116. private DataTable getFieldsDataByCondition(string TableName, string[] Fields, string Condition)
  117. {
  118. DataTable dt = new DataTable();
  119. string sql = "select ";
  120. sql += AddField(Fields);
  121. sql += " from " + TableName + " where " + Condition + " and rownum=1";
  122. command = new OracleCommand(sql, connection);
  123. Reconnect(command);
  124. OracleDataAdapter ad = new OracleDataAdapter(command);
  125. try
  126. {
  127. ad.Fill(dt);
  128. }
  129. catch (Exception)
  130. {
  131. connection = new OracleConnection(ConnectionStrings);
  132. connection.Open();
  133. command = new OracleCommand(sql, connection);
  134. ad = new OracleDataAdapter();
  135. ad.SelectCommand = command;
  136. ad.Fill(dt);
  137. }
  138. ad.Dispose();
  139. command.Dispose();
  140. return dt;
  141. }
  142. /// <summary>
  143. /// 通过表名,字段和条件获取DataTable类型的数据
  144. /// </summary>
  145. private DataTable getFieldsDatasByCondition(string TableName, string[] Fields, string Condition)
  146. {
  147. DataTable dt = new DataTable();
  148. string sql = "select ";
  149. sql += AddField(Fields);
  150. sql += " from " + TableName + " where " + Condition;
  151. command = new OracleCommand(sql, connection);
  152. Reconnect(command);
  153. OracleDataAdapter ad = new OracleDataAdapter(command);
  154. try
  155. {
  156. ad.Fill(dt);
  157. }
  158. catch (Exception)
  159. {
  160. connection = new OracleConnection(ConnectionStrings);
  161. connection.Open();
  162. command = new OracleCommand(sql, connection);
  163. ad = new OracleDataAdapter();
  164. ad.SelectCommand = command;
  165. ad.Fill(dt);
  166. }
  167. ad.Dispose();
  168. command.Dispose();
  169. return dt;
  170. }
  171. /// <summary>
  172. /// 通过表名,字段获取DataTable类型的数据
  173. /// </summary>
  174. private DataTable getFieldsDatas(string TableName, string Fields)
  175. {
  176. DataTable dt = new DataTable();
  177. string sql = "select ";
  178. sql += Fields;
  179. sql += " from " + TableName;
  180. command = new OracleCommand(sql, connection);
  181. Reconnect(command);
  182. OracleDataAdapter ad = new OracleDataAdapter(command);
  183. ad.SelectCommand = command;
  184. try
  185. {
  186. ad.Fill(dt);
  187. }
  188. catch (Exception)
  189. {
  190. connection = new OracleConnection(ConnectionStrings);
  191. connection.Open();
  192. command = new OracleCommand(sql, connection);
  193. ad = new OracleDataAdapter();
  194. ad.SelectCommand = command;
  195. ad.Fill(dt);
  196. }
  197. ad.Dispose();
  198. command.Dispose();
  199. return dt;
  200. }
  201. /// <summary>
  202. /// 检测内容是否存在
  203. /// </summary>
  204. /// <param name="TableName"></param>
  205. /// <param name="Condition"></param>
  206. /// <returns></returns>
  207. private bool CheckExist(string TableName, string Condition)
  208. {
  209. string sql = "select count(1) from " + TableName + " where " + Condition;
  210. command = new OracleCommand(sql, connection);
  211. Reconnect(command);
  212. OracleDataAdapter ad = new OracleDataAdapter(command);
  213. DataTable dt = new DataTable();
  214. ad.Fill(dt);
  215. ad.Dispose();
  216. command.Dispose();
  217. return int.Parse(dt.Rows[0][0].ToString()) > 0;
  218. }
  219. /// <summary>
  220. /// 直接执行SQL,同时传入SQL的类型
  221. /// </summary>
  222. /// <param name="SQL"></param>
  223. /// <param name="Type"></param>
  224. /// <returns></returns>
  225. private object ExecuteSql(string SQL, string Type, params object[] names)
  226. {
  227. object result = null;
  228. command = new OracleCommand(SQL, connection);
  229. Reconnect(command);
  230. //用来拼接参数的
  231. if (names.Length > 0)
  232. {
  233. string[] par = SQL.Split(':');
  234. //用来存参数的数组
  235. StringBuilder[] addpar = new StringBuilder[par.Length - 1];
  236. for (int i = 0; i < par.Length - 1; i++)
  237. {
  238. //新建一个char类型的数组用来存储每个字节的变量
  239. char[] c = par[i + 1].ToCharArray();
  240. addpar[i] = new StringBuilder();
  241. for (int j = 0; j < c.Length; j++)
  242. {
  243. if (c[j] != ' ' && c[j] != ',')
  244. {
  245. addpar[i].Append(c[j]);
  246. }
  247. else
  248. {
  249. break;
  250. }
  251. }
  252. }
  253. for (int i = 0; i < addpar.Length; i++)
  254. command.Parameters.Add(new OracleParameter(addpar[i].ToString(), OracleDbType.Varchar2, names[i], ParameterDirection.Input));
  255. }
  256. switch (Type.ToUpper())
  257. {
  258. case "SELECT":
  259. OracleDataAdapter ad = new OracleDataAdapter(command);
  260. result = new DataTable();
  261. try
  262. {
  263. ad.Fill((DataTable)result);
  264. }
  265. catch (Exception)
  266. {
  267. connection = new OracleConnection(ConnectionStrings);
  268. connection.Open();
  269. command = new OracleCommand(SQL, connection);
  270. ad = new OracleDataAdapter();
  271. ad.SelectCommand = command;
  272. ad.Fill((DataTable)result);
  273. }
  274. break;
  275. case "DELETE":
  276. try
  277. {
  278. result = command.ExecuteNonQuery();
  279. }
  280. catch (Exception)
  281. {
  282. command.Connection = new OracleConnection(ConnectionStrings);
  283. command.Connection.Open();
  284. result = command.ExecuteNonQuery();
  285. }
  286. break;
  287. case "UPDATE":
  288. try
  289. {
  290. result = command.ExecuteNonQuery();
  291. }
  292. catch (Exception)
  293. {
  294. command.Connection = new OracleConnection(ConnectionStrings);
  295. command.Connection.Open();
  296. result = command.ExecuteNonQuery();
  297. }
  298. break;
  299. case "INSERT":
  300. try
  301. {
  302. result = command.ExecuteNonQuery();
  303. }
  304. catch (Exception)
  305. {
  306. command.Connection = new OracleConnection(ConnectionStrings);
  307. command.Connection.Open();
  308. result = command.ExecuteNonQuery();
  309. }
  310. break;
  311. }
  312. command.Dispose();
  313. return result;
  314. }
  315. /// <summary>
  316. /// 批量通过SQL来执行插入操作 ,参数的第一个数一个string[]数组,用来传递需要添加的参数的名称
  317. /// 之后的是名称参数数组对应的 ,所有的插入参数数据长度必须是一致的
  318. /// </summary>
  319. /// <param name="sql"></param>
  320. /// <param name="names"></param>
  321. private void BatchInsert(string sql, params object[][] names)
  322. {
  323. command = new OracleCommand(sql, connection);
  324. Reconnect(command);
  325. command.ArrayBindCount = names[1].Length;
  326. //因为第一个数组保存的是参数的名称,所以循环从1而不是0开始
  327. //将第一个数组的下标固定为0作为循环添加的参数的名称
  328. for (int i = 1; i <= names[0].Length; i++)
  329. {
  330. command.Parameters.Add(new OracleParameter(names[0][i - 1].ToString(), OracleDbType.Varchar2, names[i], ParameterDirection.Input));
  331. }
  332. try
  333. {
  334. command.ExecuteNonQuery();
  335. }
  336. catch (Exception)
  337. {
  338. command.Connection = new OracleConnection(ConnectionStrings);
  339. command.Connection.Open();
  340. command.ExecuteNonQuery();
  341. }
  342. command.Dispose();
  343. }
  344. /// <summary>
  345. /// 通过条件更新
  346. /// </summary>
  347. /// <param name="TableName"></param>
  348. /// <param name="update"></param>
  349. /// <param name="condition"></param>
  350. private string UpdateByCondition(string TableName, string update, string condition)
  351. {
  352. string sql = "update " + TableName + " set " + update + " where " + condition;
  353. command = new OracleCommand(sql, connection);
  354. Reconnect(command);
  355. try
  356. {
  357. command.ExecuteNonQuery();
  358. }
  359. catch (Exception)
  360. {
  361. command.Connection = new OracleConnection(ConnectionStrings);
  362. command.Connection.Open();
  363. command.ExecuteNonQuery();
  364. }
  365. command.Dispose();
  366. return sql;
  367. }
  368. /// <summary>
  369. /// 调用存储过程
  370. /// </summary>
  371. /// <param name="ProcedureName"></param>
  372. /// <param name="param"></param>
  373. private void CallProcedure(string ProcedureName, ref string[] param)
  374. {
  375. command = new OracleCommand(ProcedureName);
  376. command.Connection = connection;
  377. Reconnect(command);
  378. command.CommandText = ProcedureName;
  379. command.CommandType = CommandType.StoredProcedure;
  380. for (int i = 0; i < param.Length; i++)
  381. command.Parameters.Add(new OracleParameter(param[i].ToString(), OracleDbType.Varchar2, 200, param[i], ParameterDirection.InputOutput));
  382. try
  383. {
  384. command.ExecuteNonQuery();
  385. }
  386. catch (Exception)
  387. {
  388. command.Connection = new OracleConnection(ConnectionStrings);
  389. command.Connection.Open();
  390. command.ExecuteNonQuery();
  391. }
  392. for (int i = 0; i < command.Parameters.Count; i++)
  393. param[i] = command.Parameters[i].Value.ToString();
  394. }
  395. /// <summary>
  396. /// 用于将string 的数组转换成SQL的查询内容
  397. /// </summary>
  398. /// <param name="Fields"></param>
  399. /// <returns></returns>
  400. private string AddField(string[] Fields)
  401. {
  402. string sql = " ";
  403. foreach (string field in Fields)
  404. {
  405. sql += field + ",";
  406. }
  407. return sql.Substring(0, sql.Length - 1);
  408. }
  409. /// <summary>
  410. /// 通过查询的语句获取查询的字段
  411. /// </summary>
  412. /// <param name="field"></param>
  413. /// <returns></returns>
  414. private string[] GetField(string field)
  415. {
  416. string[] fields = field.Split(',');
  417. for (int i = 0; i < fields.Length; i++)
  418. {
  419. fields[i] = fields[i].Substring(fields[i].LastIndexOf("as") + 2, fields[i].Length - fields[i].LastIndexOf("as") - 2).Trim();
  420. }
  421. return fields;
  422. }
  423. private void Reconnect(OracleCommand cmd)
  424. {
  425. if (cmd.Connection.State == ConnectionState.Closed)
  426. {
  427. cmd.Connection.Open();
  428. }
  429. }
  430. }
  431. }