PageRenderTime 56ms CodeModel.GetById 25ms RepoModel.GetById 1ms app.codeStats 0ms

/library/Library/CSDatabase.cs

https://bitbucket.org/digitalizarte/coolstorage
C# | 1209 lines | 656 code | 154 blank | 399 comment | 32 complexity | decbcd372f4f854e675aa897736856e2 MD5 | raw file
  1. #region License
  2. //=============================================================================
  3. // Vici CoolStorage - .NET Object Relational Mapping Library
  4. //
  5. // Copyright (c) 2004-2009 Philippe Leybaert
  6. //
  7. // Permission is hereby granted, free of charge, to any person obtaining a copy
  8. // of this software and associated documentation files (the "Software"), to deal
  9. // in the Software without restriction, including without limitation the rights
  10. // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  11. // copies of the Software, and to permit persons to whom the Software is
  12. // furnished to do so, subject to the following conditions:
  13. //
  14. // The above copyright notice and this permission notice shall be included in
  15. // all copies or substantial portions of the Software.
  16. //
  17. // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  18. // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  19. // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  20. // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  21. // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
  22. // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
  23. // IN THE SOFTWARE.
  24. //=============================================================================
  25. #endregion
  26. using System;
  27. using System.Collections.Generic;
  28. using System.Reflection;
  29. using Vici.Core;
  30. namespace Vici.CoolStorage
  31. {
  32. /// <summary>
  33. /// Represents a raw data base record.
  34. /// </summary>
  35. /// <remarks>
  36. /// ColumnName<->Value pairs.
  37. ///
  38. /// <code>
  39. /// CSGenericRecordList list = new CSGenericRecordList();
  40. /// using (IDataReader reader = DB.CreateReader(sql, parameters))
  41. /// {
  42. /// while (reader.Read())
  43. /// {
  44. /// CSGenericRecord record = new CSGenericRecord();
  45. ///
  46. /// for (int i = 0; i < reader.FieldCount; i++)
  47. /// {
  48. /// record[reader.GetName(i)] = (reader[i] is DBNull) ? null : reader[i];
  49. /// }
  50. ///
  51. /// list.Add(record);
  52. /// }
  53. /// }
  54. /// </code>
  55. ///
  56. /// </remarks>
  57. public class CSGenericRecord : Dictionary<string, object> { }
  58. /// <summary>
  59. /// Represents a generic query result.
  60. /// </summary>
  61. /// <remarks>
  62. /// <see cref="CSGenericRecord"/>
  63. /// </remarks>
  64. public class CSGenericRecordList : List<CSGenericRecord> { }
  65. /// <summary>
  66. /// Represents a "Data Base" instance defined by a Context Name string.
  67. /// </summary>
  68. public class CSDatabaseInstance
  69. {
  70. private readonly string _contextName;
  71. internal CSDatabaseInstance(string contextName)
  72. {
  73. _contextName = contextName;
  74. }
  75. private CSDataProvider DB
  76. {
  77. get { return CSConfig.GetDB(_contextName); }
  78. }
  79. /// <summary>
  80. /// Executes a SQL non query.
  81. /// </summary>
  82. /// <param name="sql">The SQL command.</param>
  83. /// <returns></returns>
  84. public int ExecuteNonQuery(string sql)
  85. {
  86. return ExecuteNonQuery(sql, CSParameterCollection.Empty);
  87. }
  88. /// <summary>Executes a SQL non query given a parameter.
  89. /// </summary>
  90. /// <param name="sql">The SQ commandL.</param>
  91. /// <param name="paramName">Name of the param.</param>
  92. /// <param name="paramValue">The param value.</param>
  93. /// <returns></returns>
  94. public int ExecuteNonQuery(string sql, string paramName, object paramValue)
  95. {
  96. return ExecuteNonQuery(sql, new CSParameterCollection(paramName, paramValue));
  97. }
  98. /// <summary>Executes the SQL non-query given two parameters.
  99. /// </summary>
  100. /// <param name="sql">The SQL Command.</param>
  101. /// <param name="paramName1">The param name1.</param>
  102. /// <param name="paramValue1">The param value1.</param>
  103. /// <param name="paramName2">The param name2.</param>
  104. /// <param name="paramValue2">The param value2.</param>
  105. /// <returns></returns>
  106. public int ExecuteNonQuery(string sql, string paramName1, object paramValue1, string paramName2, object paramValue2)
  107. {
  108. return ExecuteNonQuery(sql, new CSParameterCollection(paramName1, paramValue1, paramName2, paramValue2));
  109. }
  110. /// <summary>Executes the SQL non-query given three parameters.
  111. /// </summary>
  112. /// <param name="sql">The SQL Command.</param>
  113. /// <param name="paramName1">The param name1.</param>
  114. /// <param name="paramValue1">The param value1.</param>
  115. /// <param name="paramName2">The param name2.</param>
  116. /// <param name="paramValue2">The param value2.</param>
  117. /// <param name="paramName3">The param name3.</param>
  118. /// <param name="paramValue3">The param value3.</param>
  119. /// <returns></returns>
  120. public int ExecuteNonQuery(string sql, string paramName1, object paramValue1, string paramName2, object paramValue2, string paramName3, object paramValue3)
  121. {
  122. return ExecuteNonQuery(sql, new CSParameterCollection(paramName1, paramValue1, paramName2, paramValue2, paramName3, paramValue3));
  123. }
  124. /// <summary> Executes a SQL non query command given a CSParameter collection.
  125. /// </summary>
  126. /// <param name="sql">The SQL.</param>
  127. /// <param name="parameters">The parameters.</param>
  128. /// <returns></returns>
  129. public int ExecuteNonQuery(string sql, CSParameterCollection parameters)
  130. {
  131. using (new CSTransaction(DB))
  132. return DB.ExecuteNonQuery(sql, parameters);
  133. }
  134. public int ExecuteNonQuery(string sql, object parameters)
  135. {
  136. return ExecuteNonQuery(sql, new CSParameterCollection(parameters));
  137. }
  138. /// <summary>
  139. /// <summary> Executes a SQL non query command given a CSParameter array.
  140. /// </summary>
  141. /// <param name="sql">The SQL command.</param>
  142. /// <param name="parameters">The parameter array.</param>
  143. /// <returns></returns>
  144. public int ExecuteNonQuery(string sql, params CSParameter[] parameters)
  145. {
  146. return ExecuteNonQuery(sql, new CSParameterCollection(parameters));
  147. }
  148. /// <summary> Returns a SQL scalar.
  149. /// </summary>
  150. /// <param name="sql">The SQL statement.</param>
  151. /// <returns></returns>
  152. public object GetScalar(string sql)
  153. {
  154. return GetScalar(sql, CSParameterCollection.Empty);
  155. }
  156. /// <summary> Returns a SQL scalar given a parameter.
  157. /// </summary>
  158. /// <param name="sql">The SQL.</param>
  159. /// <param name="paramName">Name of the param.</param>
  160. /// <param name="paramValue">The param value.</param>
  161. /// <returns></returns>
  162. public object GetScalar(string sql, string paramName, object paramValue)
  163. {
  164. return GetScalar(sql, new CSParameterCollection(paramName, paramValue));
  165. }
  166. public object GetScalar(string sql, string paramName1, object paramValue1, string paramName2, object paramValue2)
  167. {
  168. return GetScalar(sql, new CSParameterCollection(paramName1, paramValue1, paramName2, paramValue2));
  169. }
  170. /// <summary>Returns a SQL scalar given three parameters.
  171. /// </summary>
  172. /// <param name="sql">The SQL statement.</param>
  173. /// <param name="paramName1">The param name1.</param>
  174. /// <param name="paramValue1">The param value1.</param>
  175. /// <param name="paramName2">The param name2.</param>
  176. /// <param name="paramValue2">The param value2.</param>
  177. /// <param name="paramName3">The param name3.</param>
  178. /// <param name="paramValue3">The param value3.</param>
  179. /// <returns></returns>
  180. public object GetScalar(string sql, string paramName1, object paramValue1, string paramName2, object paramValue2, string paramName3, object paramValue3)
  181. {
  182. return GetScalar(sql, new CSParameterCollection(paramName1, paramValue1, paramName2, paramValue2, paramName3, paramValue3));
  183. }
  184. public object GetScalar(string sql, object parameters)
  185. {
  186. return GetScalar(sql, new CSParameterCollection(parameters));
  187. }
  188. /// <summary>Returns a SQL scalar given an array of parameters.
  189. /// </summary>
  190. /// <param name="sql">The SQL.</param>
  191. /// <param name="parameters">The parameters.</param>
  192. /// <returns></returns>
  193. public object GetScalar(string sql, params CSParameter[] parameters)
  194. {
  195. return GetScalar(sql, new CSParameterCollection(parameters));
  196. }
  197. /// <summary>Returns a SQL scalar given an collection of parameters.
  198. /// </summary>
  199. /// <param name="sql">The SQL.</param>
  200. /// <param name="parameters">The parameters.</param>
  201. /// <returns></returns>
  202. public object GetScalar(string sql, CSParameterCollection parameters)
  203. {
  204. using (new CSTransaction(DB))
  205. return DB.GetScalar(sql, parameters);
  206. }
  207. /// <summary>
  208. /// Returns an array of scalars
  209. /// </summary>
  210. /// <typeparam name="TScalar">The type of the scalar.</typeparam>
  211. /// <param name="sql">the SQL String.</param>
  212. /// <returns>An array of scalars</returns>
  213. public T[] GetScalarList<T>(string sql)
  214. {
  215. return GetScalarList<T>(sql, CSParameterCollection.Empty);
  216. }
  217. /// <summary>
  218. /// Returns an array of scalars
  219. /// </summary>
  220. /// <typeparam name="TScalar">The type of the scalar.</typeparam>
  221. /// <param name="sql">the SQL String.</param>
  222. /// <param name="paramName">Name of the param.</param>
  223. /// <param name="paramValue">The param value.</param>
  224. /// <returns>An array of scalars</returns>
  225. public T[] GetScalarList<T>(string sql, string paramName, object paramValue)
  226. {
  227. return GetScalarList<T>(sql, new CSParameterCollection(paramName, paramValue));
  228. }
  229. /// <summary>
  230. /// Returns an array of scalars
  231. /// </summary>
  232. /// <typeparam name="TScalar">The type of the scalar.</typeparam>
  233. /// <param name="sql">the SQL String.</param>
  234. /// <param name="paramName1">The param name1.</param>
  235. /// <param name="paramValue1">The param value1.</param>
  236. /// <param name="paramName2">The param name2.</param>
  237. /// <param name="paramValue2">The param value2.</param>
  238. /// <returns>An array of scalars</returns>
  239. public T[] GetScalarList<T>(string sql, string paramName1, object paramValue1, string paramName2, object paramValue2)
  240. {
  241. return GetScalarList<T>(sql, new CSParameterCollection(paramName1, paramValue1, paramName2, paramValue2));
  242. }
  243. /// <summary>
  244. /// Returns an array of scalars
  245. /// </summary>
  246. /// <typeparam name="TScalar">The type of the scalar.</typeparam>
  247. /// <param name="sql">the SQL String.</param>
  248. /// <param name="paramName1">The param name1.</param>
  249. /// <param name="paramValue1">The param value1.</param>
  250. /// <param name="paramName2">The param name2.</param>
  251. /// <param name="paramValue2">The param value2.</param>
  252. /// <param name="paramName3">The param name3.</param>
  253. /// <param name="paramValue3">The param value3.</param>
  254. /// <returns>An array of scalars</returns>
  255. public T[] GetScalarList<T>(string sql, string paramName1, object paramValue1, string paramName2, object paramValue2, string paramName3, object paramValue3)
  256. {
  257. return GetScalarList<T>(sql, new CSParameterCollection(paramName1, paramValue1, paramName2, paramValue2, paramName3, paramValue3));
  258. }
  259. /// <summary>
  260. /// Returns an array of scalars
  261. /// </summary>
  262. /// <typeparam name="TScalar">The type of the scalar.</typeparam>
  263. /// <param name="sql">the SQL String.</param>
  264. /// <param name="parameters">An Array of CSParameters.</param>
  265. /// <returns>
  266. /// An array of TScalar
  267. /// </returns>
  268. public T[] GetScalarList<T>(string sql, object parameters)
  269. {
  270. return GetScalarList<T>(sql, new CSParameterCollection(parameters));
  271. }
  272. public T[] GetScalarList<T>(string sql, params CSParameter[] parameters)
  273. {
  274. return GetScalarList<T>(sql, new CSParameterCollection(parameters));
  275. }
  276. /// <summary>
  277. /// Returns an array of scalars
  278. /// </summary>
  279. /// <typeparam name="TScalar">The type of the scalar.</typeparam>
  280. /// <param name="sql">the SQL String.</param>
  281. /// <param name="parameters">A Collection of CSParameters.</param>
  282. /// <returns>
  283. /// An array of scalars
  284. /// </returns>
  285. public T[] GetScalarList<T>(string sql, CSParameterCollection parameters)
  286. {
  287. List<T> list = new List<T>();
  288. using (new CSTransaction(DB))
  289. {
  290. using (ICSDbReader reader = DB.CreateReader(sql, parameters))
  291. {
  292. int recs = 0;
  293. bool ok = true;
  294. while (recs == 0 && ok)
  295. {
  296. while (reader.Read())
  297. {
  298. list.Add(reader[0].Convert<T>());
  299. recs++;
  300. }
  301. ok = reader.NextResult();
  302. }
  303. }
  304. }
  305. return list.ToArray();
  306. }
  307. /// <summary>
  308. /// Returns the scalar
  309. /// </summary>
  310. /// <typeparam name="TScalar">The type of the scalar.</typeparam>
  311. /// <param name="sql">The SQL.</param>
  312. /// <returns></returns>
  313. public T GetScalar<T>(string sql)
  314. {
  315. return GetScalar<T>(sql, CSParameterCollection.Empty);
  316. }
  317. /// <summary>
  318. /// Returns the scalar
  319. /// </summary>
  320. /// <typeparam name="TScalar">The type of the scalar.</typeparam>
  321. /// <param name="sql">The SQL.</param>
  322. /// <param name="paramName">Name of the param.</param>
  323. /// <param name="paramValue">The param value.</param>
  324. /// <returns></returns>
  325. public T GetScalar<T>(string sql, string paramName, object paramValue)
  326. {
  327. return GetScalar<T>(sql, new CSParameterCollection(paramName, paramValue));
  328. }
  329. /// <summary>
  330. /// Returns the scalar
  331. /// </summary>
  332. /// <typeparam name="TScalar">The type of the scalar.</typeparam>
  333. /// <param name="sql">The SQL.</param>
  334. /// <param name="paramName1">The param name1.</param>
  335. /// <param name="paramValue1">The param value1.</param>
  336. /// <param name="paramName2">The param name2.</param>
  337. /// <param name="paramValue2">The param value2.</param>
  338. /// <returns></returns>
  339. public T GetScalar<T>(string sql, string paramName1, object paramValue1, string paramName2, object paramValue2)
  340. {
  341. return GetScalar<T>(sql, new CSParameterCollection(paramName1, paramValue1, paramName2, paramValue2));
  342. }
  343. /// <summary>
  344. /// Returns the scalar
  345. /// </summary>
  346. /// <typeparam name="TScalar">The type of the scalar.</typeparam>
  347. /// <param name="sql">The SQL.</param>
  348. /// <param name="paramName1">The param name1.</param>
  349. /// <param name="paramValue1">The param value1.</param>
  350. /// <param name="paramName2">The param name2.</param>
  351. /// <param name="paramValue2">The param value2.</param>
  352. /// <param name="paramName3">The param name3.</param>
  353. /// <param name="paramValue3">The param value3.</param>
  354. /// <returns></returns>
  355. public T GetScalar<T>(string sql, string paramName1, object paramValue1, string paramName2, object paramValue2, string paramName3, object paramValue3)
  356. {
  357. return GetScalar<T>(sql, new CSParameterCollection(paramName1, paramValue1, paramName2, paramValue2, paramName3, paramValue3));
  358. }
  359. /// <summary>
  360. /// Returns the scalar
  361. /// </summary>
  362. /// <typeparam name="TScalar">The type of the scalar.</typeparam>
  363. /// <param name="sql">The SQL.</param>
  364. /// <param name="parameters">The parameters.</param>
  365. /// <returns></returns>
  366. public T GetScalar<T>(string sql, params CSParameter[] parameters)
  367. {
  368. return GetScalar<T>(sql, new CSParameterCollection(parameters));
  369. }
  370. public T GetScalar<T>(string sql, object parameters)
  371. {
  372. return GetScalar<T>(sql, new CSParameterCollection(parameters));
  373. }
  374. /// <summary>
  375. /// Returns the scalar
  376. /// </summary>
  377. /// <typeparam name="TScalar">The type of the scalar.</typeparam>
  378. /// <param name="sql">The SQL string.</param>
  379. /// <param name="parameters">A CSParameterCollection</param>
  380. /// <returns>An instance of TScalar</returns>
  381. public T GetScalar<T>(string sql, CSParameterCollection parameters)
  382. {
  383. return GetScalar(sql, parameters).Convert<T>();
  384. }
  385. /// <summary>
  386. /// Runs the query.
  387. /// </summary>
  388. /// <param name="sql">The SQL query string.</param>
  389. /// <returns></returns>
  390. public CSGenericRecordList RunQuery(string sql)
  391. {
  392. return RunQuery(sql, CSParameterCollection.Empty);
  393. }
  394. /// <summary>
  395. /// Runs the query.
  396. /// </summary>
  397. /// <param name="sql">The SQL.</param>
  398. /// <param name="paramName">Name of the param.</param>
  399. /// <param name="paramValue">The param value.</param>
  400. /// <returns></returns>
  401. public CSGenericRecordList RunQuery(string sql, string paramName, object paramValue)
  402. {
  403. return RunQuery(sql, new CSParameterCollection(paramName, paramValue));
  404. }
  405. /// <summary>
  406. /// Runs the query.
  407. /// </summary>
  408. /// <param name="sql">The SQL.</param>
  409. /// <param name="paramName1">The param name1.</param>
  410. /// <param name="paramValue1">The param value1.</param>
  411. /// <param name="paramName2">The param name2.</param>
  412. /// <param name="paramValue2">The param value2.</param>
  413. /// <returns></returns>
  414. public CSGenericRecordList RunQuery(string sql, string paramName1, object paramValue1, string paramName2, object paramValue2)
  415. {
  416. return RunQuery(sql, new CSParameterCollection(paramName1, paramValue1, paramName2, paramValue2));
  417. }
  418. /// <summary>
  419. /// Runs the query.
  420. /// </summary>
  421. /// <param name="sql">The SQL.</param>
  422. /// <param name="paramName1">The param name1.</param>
  423. /// <param name="paramValue1">The param value1.</param>
  424. /// <param name="paramName2">The param name2.</param>
  425. /// <param name="paramValue2">The param value2.</param>
  426. /// <param name="paramName3">The param name3.</param>
  427. /// <param name="paramValue3">The param value3.</param>
  428. /// <returns></returns>
  429. public CSGenericRecordList RunQuery(string sql, string paramName1, object paramValue1, string paramName2, object paramValue2, string paramName3, object paramValue3)
  430. {
  431. return RunQuery(sql, new CSParameterCollection(paramName1, paramValue1, paramName2, paramValue2, paramName3, paramValue3));
  432. }
  433. /// <summary>
  434. /// Runs the query.
  435. /// </summary>
  436. /// <param name="sql">The SQL.</param>
  437. /// <param name="parameters">The parameters.</param>
  438. /// <returns></returns>
  439. public CSGenericRecordList RunQuery(string sql, params CSParameter[] parameters)
  440. {
  441. return RunQuery(sql, new CSParameterCollection(parameters));
  442. }
  443. public CSGenericRecordList RunQuery(string sql, object parameters)
  444. {
  445. return RunQuery(sql, new CSParameterCollection(parameters));
  446. }
  447. /// <summary>
  448. /// Runs the query.
  449. /// </summary>
  450. /// <param name="sql">The SQL.</param>
  451. /// <param name="parameters">The parameters.</param>
  452. /// <returns></returns>
  453. public CSGenericRecordList RunQuery(string sql, CSParameterCollection parameters)
  454. {
  455. CSGenericRecordList list = new CSGenericRecordList();
  456. using (new CSTransaction(DB))
  457. {
  458. using (ICSDbReader reader = DB.CreateReader(sql, parameters))
  459. {
  460. int recs = 0;
  461. bool ok = true;
  462. while (recs == 0 && ok)
  463. {
  464. while (reader.Read())
  465. {
  466. CSGenericRecord record = new CSGenericRecord();
  467. for (int i = 0; i < reader.FieldCount; i++)
  468. {
  469. record[reader.GetName(i)] = (reader[i] is DBNull) ? null : reader[i];
  470. }
  471. list.Add(record);
  472. recs++;
  473. }
  474. ok = reader.NextResult();
  475. }
  476. }
  477. }
  478. return list;
  479. }
  480. /// <summary>
  481. /// Runs the single query.
  482. /// </summary>
  483. /// <param name="sql">The SQL.</param>
  484. /// <returns></returns>
  485. public CSGenericRecord RunSingleQuery(string sql)
  486. {
  487. return RunSingleQuery(sql, CSParameterCollection.Empty);
  488. }
  489. /// <summary>
  490. /// Runs the single query.
  491. /// </summary>
  492. /// <param name="sql">The SQL.</param>
  493. /// <param name="paramName">Name of the param.</param>
  494. /// <param name="paramValue">The param value.</param>
  495. /// <returns></returns>
  496. public CSGenericRecord RunSingleQuery(string sql, string paramName, object paramValue)
  497. {
  498. return RunSingleQuery(sql, new CSParameterCollection(paramName, paramValue));
  499. }
  500. /// <summary>
  501. /// Runs the single query.
  502. /// </summary>
  503. /// <param name="sql">The SQL.</param>
  504. /// <param name="paramName1">The param name1.</param>
  505. /// <param name="paramValue1">The param value1.</param>
  506. /// <param name="paramName2">The param name2.</param>
  507. /// <param name="paramValue2">The param value2.</param>
  508. /// <returns></returns>
  509. public CSGenericRecord RunSingleQuery(string sql, string paramName1, object paramValue1, string paramName2, object paramValue2)
  510. {
  511. return RunSingleQuery(sql, new CSParameterCollection(paramName1, paramValue1, paramName2, paramValue2));
  512. }
  513. /// <summary>
  514. /// Runs the single query.
  515. /// </summary>
  516. /// <param name="sql">The SQL.</param>
  517. /// <param name="paramName1">The param name1.</param>
  518. /// <param name="paramValue1">The param value1.</param>
  519. /// <param name="paramName2">The param name2.</param>
  520. /// <param name="paramValue2">The param value2.</param>
  521. /// <param name="paramName3">The param name3.</param>
  522. /// <param name="paramValue3">The param value3.</param>
  523. /// <returns></returns>
  524. public CSGenericRecord RunSingleQuery(string sql, string paramName1, object paramValue1, string paramName2, object paramValue2, string paramName3, object paramValue3)
  525. {
  526. return RunSingleQuery(sql, new CSParameterCollection(paramName1, paramValue1, paramName2, paramValue2, paramName3, paramValue3));
  527. }
  528. /// <summary>
  529. /// Runs the single query.
  530. /// </summary>
  531. /// <param name="sql">The SQL.</param>
  532. /// <param name="parameters">The parameters.</param>
  533. /// <returns></returns>
  534. public CSGenericRecord RunSingleQuery(string sql, params CSParameter[] parameters)
  535. {
  536. return RunSingleQuery(sql, new CSParameterCollection(parameters));
  537. }
  538. public CSGenericRecord RunSingleQuery(string sql,object parameters)
  539. {
  540. return RunSingleQuery(sql, new CSParameterCollection(parameters));
  541. }
  542. /// <summary>
  543. /// Runs the single query.
  544. /// </summary>
  545. /// <param name="sql">The SQL.</param>
  546. /// <param name="parameters">The parameters.</param>
  547. /// <returns></returns>
  548. public CSGenericRecord RunSingleQuery(string sql, CSParameterCollection parameters)
  549. {
  550. int recs = 0;
  551. bool ok = true;
  552. CSGenericRecord rec = new CSGenericRecord();
  553. using (new CSTransaction(DB))
  554. {
  555. using (ICSDbReader reader = DB.CreateReader(sql, parameters))
  556. {
  557. while (recs == 0 && ok)
  558. {
  559. if (reader.Read())
  560. {
  561. for (int i = 0; i < reader.FieldCount; i++)
  562. {
  563. rec[reader.GetName(i)] = (reader[i] is DBNull) ? null : reader[i];
  564. }
  565. //return rec;
  566. recs++;
  567. }
  568. ok = reader.NextResult();
  569. }
  570. }
  571. }
  572. return (recs == 0) ? null : rec;
  573. }
  574. /// <summary>
  575. /// Runs the query.
  576. /// </summary>
  577. /// <typeparam name="TResult">The type of the result.</typeparam>
  578. /// <param name="sql">The SQL.</param>
  579. /// <returns></returns>
  580. public T[] RunQuery<T>(string sql) where T : new()
  581. {
  582. return RunQuery<T>(sql, null, 0);
  583. }
  584. /// <summary>
  585. /// Runs the query.
  586. /// </summary>
  587. /// <typeparam name="TResult">The type of the result.</typeparam>
  588. /// <param name="sql">The SQL.</param>
  589. /// <param name="parameters">The parameters.</param>
  590. /// <returns></returns>
  591. public T[] RunQuery<T>(string sql, CSParameterCollection parameters) where T : new()
  592. {
  593. return RunQuery<T>(sql, parameters, 0);
  594. }
  595. /// <summary>
  596. /// Runs the query.
  597. /// </summary>
  598. /// <typeparam name="TResult">The type of the result.</typeparam>
  599. /// <param name="sql">The SQL.</param>
  600. /// <param name="paramName">Name of the param.</param>
  601. /// <param name="paramValue">The param value.</param>
  602. /// <returns></returns>
  603. public T[] RunQuery<T>(string sql, object parameters) where T : new()
  604. {
  605. return RunQuery<T>(sql, new CSParameterCollection(parameters), 0);
  606. }
  607. /// <summary>
  608. /// Runs the query.
  609. /// </summary>
  610. /// <typeparam name="TResult">The type of the result.</typeparam>
  611. /// <param name="sql">The SQL.</param>
  612. /// <param name="paramName1">The param name1.</param>
  613. /// <param name="paramValue1">The param value1.</param>
  614. /// <param name="paramName2">The param name2.</param>
  615. /// <param name="paramValue2">The param value2.</param>
  616. /// <returns></returns>
  617. public T[] RunQuery<T>(string sql, string paramName, object paramValue) where T : new()
  618. {
  619. return RunQuery<T>(sql, new CSParameterCollection(paramName, paramValue), 0);
  620. }
  621. /// <summary>
  622. /// Runs the query.
  623. /// </summary>
  624. /// <typeparam name="TResult">The type of the result.</typeparam>
  625. /// <param name="sql">The SQL.</param>
  626. /// <param name="paramName1">The param name1.</param>
  627. /// <param name="paramValue1">The param value1.</param>
  628. /// <param name="paramName2">The param name2.</param>
  629. /// <param name="paramValue2">The param value2.</param>
  630. /// <param name="paramName3">The param name3.</param>
  631. /// <param name="paramValue3">The param value3.</param>
  632. /// <returns></returns>
  633. public T[] RunQuery<T>(string sql, string paramName1, object paramValue1, string paramName2, object paramValue2) where T : new()
  634. {
  635. return RunQuery<T>(sql, new CSParameterCollection(paramName1, paramValue1, paramName2, paramValue2), 0);
  636. }
  637. public T[] RunQuery<T>(string sql, string paramName1, object paramValue1, string paramName2, object paramValue2, string paramName3, object paramValue3) where T : new()
  638. {
  639. return RunQuery<T>(sql, new CSParameterCollection(paramName1, paramValue1, paramName2, paramValue2, paramName3, paramValue3), 0);
  640. }
  641. /// <summary>
  642. /// Runs the query.
  643. /// </summary>
  644. /// <typeparam name="TResult">The type of the result.</typeparam>
  645. /// <returns></returns>
  646. public T[] RunQuery<T>() where T : new()
  647. {
  648. return RunQuery<T>(CSHelper.GetQueryExpression<T>(), null, 0);
  649. }
  650. /// <summary>
  651. /// Runs the query.
  652. /// </summary>
  653. /// <typeparam name="TResult">The type of the result.</typeparam>
  654. /// <param name="paramName">Name of the param.</param>
  655. /// <param name="paramValue">The param value.</param>
  656. /// <returns></returns>
  657. public T[] RunQuery<T>(object parameters) where T : new()
  658. {
  659. return RunQuery<T>(null, new CSParameterCollection(parameters), 0);
  660. }
  661. /// <summary>
  662. /// Runs the query.
  663. /// </summary>
  664. /// <typeparam name="TResult">The type of the result.</typeparam>
  665. /// <param name="paramName1">The param name1.</param>
  666. /// <param name="paramValue1">The param value1.</param>
  667. /// <param name="paramName2">The param name2.</param>
  668. /// <param name="paramValue2">The param value2.</param>
  669. /// <returns></returns>
  670. public T[] RunQuery<T>(CSParameterCollection parameters) where T : new()
  671. {
  672. return RunQuery<T>(null, parameters, 0);
  673. }
  674. /// <summary>
  675. /// Runs the query.
  676. /// </summary>
  677. /// <typeparam name="TResult">The type of the result.</typeparam>
  678. /// <param name="paramName1">The param name1.</param>
  679. /// <param name="paramValue1">The param value1.</param>
  680. /// <param name="paramName2">The param name2.</param>
  681. /// <param name="paramValue2">The param value2.</param>
  682. /// <param name="paramName3">The param name3.</param>
  683. /// <param name="paramValue3">The param value3.</param>
  684. /// <returns></returns>
  685. public T[] RunQuery<T>(string paramName1, object paramValue1, string paramName2, object paramValue2, string paramName3, object paramValue3) where T : new()
  686. {
  687. return RunQuery<T>(CSHelper.GetQueryExpression<T>(), new CSParameterCollection(paramName1, paramValue1, paramName2, paramValue2, paramName3, paramValue3), 0);
  688. }
  689. public T RunSingleQuery<T>() where T : class, new()
  690. {
  691. return RunSingleQuery<T>((string)null);
  692. }
  693. public T RunSingleQuery<T>(CSParameterCollection parameters) where T : class, new()
  694. {
  695. return RunSingleQuery<T>(null, parameters);
  696. }
  697. public T RunSingleQuery<T>(object parameters) where T : class, new()
  698. {
  699. return RunSingleQuery<T>(null, parameters);
  700. }
  701. public T RunSingleQuery<T>(string sql) where T : class, new()
  702. {
  703. return RunSingleQuery<T>(sql, null);
  704. }
  705. public T RunSingleQuery<T>(string sql, object parameters) where T : class, new()
  706. {
  707. return RunSingleQuery<T>(sql, new CSParameterCollection(parameters));
  708. }
  709. public T RunSingleQuery<T>(string sql, CSParameterCollection parameters) where T : class, new()
  710. {
  711. T[] objects = RunQuery<T>(sql, parameters, 1);
  712. return (objects.Length > 0) ? objects[0] : null;
  713. }
  714. public T RunSingleQuery<T>(string sql, string paramName, object paramValue) where T : class, new()
  715. {
  716. return RunSingleQuery<T>(sql, new CSParameterCollection(paramName, paramValue));
  717. }
  718. public T RunSingleQuery<T>(string sql, string paramName1, object paramValue1, string paramName2, object paramValue2) where T : class, new()
  719. {
  720. return RunSingleQuery<T>(sql, new CSParameterCollection(paramName1, paramValue1, paramName2, paramValue2));
  721. }
  722. public T RunSingleQuery<T>(string sql, string paramName1, object paramValue1, string paramName2, object paramValue2, string paramName3, object paramValue3) where T : class, new()
  723. {
  724. return RunSingleQuery<T>(sql, new CSParameterCollection(paramName1, paramValue1, paramName2, paramValue2, paramName3, paramValue3));
  725. }
  726. private T[] RunQuery<T>(string sql, CSParameterCollection parameters, int maxRows) where T : new()
  727. {
  728. Type objectType = typeof(T);
  729. List<T> list = new List<T>();
  730. if (maxRows == 0)
  731. maxRows = int.MaxValue;
  732. using (new CSTransaction(DB))
  733. {
  734. using (ICSDbReader reader = DB.CreateReader(sql ?? CSHelper.GetQueryExpression<T>(), parameters))
  735. {
  736. int rowNum = 0;
  737. //GetHashTable de T
  738. Dictionary<string, MemberInfo> map = CSTypedQueryMapper.GetMap(typeof(T));
  739. int recs = 0;
  740. bool ok = true;
  741. while (recs == 0 && ok)
  742. {
  743. while (rowNum < maxRows && reader.Read())
  744. {
  745. rowNum++;
  746. T obj = new T();
  747. for (int i = 0; i < reader.FieldCount; i++)
  748. {
  749. string columnName = reader.GetName(i);
  750. PropertyInfo propertyInfo = objectType.GetProperty(columnName);
  751. object columnValue = reader[i];
  752. if (columnValue is DBNull)
  753. columnValue = null;
  754. //PropertyInfo propertyInfo;
  755. FieldInfo fieldInfo;
  756. if (map.ContainsKey(columnName))
  757. {
  758. //if (map[columnName].GetType().IsInstanceOfType() == typeof(PropertyInfo))
  759. if (typeof(PropertyInfo).IsInstanceOfType(map[columnName]))
  760. {
  761. propertyInfo = (PropertyInfo)map[columnName];
  762. propertyInfo.SetValue(obj, columnValue.Convert(propertyInfo.PropertyType), null);
  763. }
  764. //else if (map[columnName].GetType().MemberType == typeof(FieldInfo))
  765. else if (typeof(FieldInfo).IsInstanceOfType(map[columnName]))
  766. {
  767. fieldInfo = (FieldInfo)map[columnName];
  768. fieldInfo.SetValue(obj, columnValue.Convert(fieldInfo.FieldType));
  769. }
  770. }
  771. #if false
  772. if (propertyInfo != null)
  773. {
  774. propertyInfo.SetValue(obj, columnValue.Convert(propertyInfo.PropertyType), null);
  775. }
  776. else
  777. {
  778. FieldInfo fieldInfo = objectType.GetField(columnName);
  779. if (fieldInfo != null)
  780. {
  781. fieldInfo.SetValue(obj, columnValue.Convert(fieldInfo.FieldType));
  782. }
  783. }
  784. #endif
  785. }
  786. list.Add(obj);
  787. recs++;
  788. }
  789. ok = reader.NextResult();
  790. }
  791. }
  792. }
  793. return list.ToArray();
  794. }
  795. public CSParameterCollection GetSpParams(string StoredProcedureName, bool WithReturn)
  796. {
  797. return DB.GetSpParams(StoredProcedureName, WithReturn);
  798. }
  799. public CSParameterCollection GetSpParams(string StoredProcedureName)
  800. {
  801. return DB.GetSpParams(StoredProcedureName, false);
  802. }
  803. }
  804. public static class CSDatabase
  805. {
  806. private static readonly CSDatabaseContext _dbContext = new CSDatabaseContext();
  807. public class CSDatabaseContext
  808. {
  809. public CSDatabaseInstance Default
  810. {
  811. get { return this[CSConfig.DEFAULT_CONTEXTNAME]; }
  812. }
  813. public CSDatabaseInstance this[string contextName]
  814. {
  815. get { return new CSDatabaseInstance(contextName); }
  816. }
  817. }
  818. public static CSDatabaseContext Context
  819. {
  820. get { return _dbContext; }
  821. }
  822. public static int ExecuteNonQuery(string sql)
  823. {
  824. return Context.Default.ExecuteNonQuery(sql);
  825. }
  826. public static int ExecuteNonQuery(string sql, string paramName, object paramValue)
  827. {
  828. return Context.Default.ExecuteNonQuery(sql, paramName, paramValue);
  829. }
  830. public static int ExecuteNonQuery(string sql, string paramName1, object paramValue1, string paramName2, object paramValue2)
  831. {
  832. return Context.Default.ExecuteNonQuery(sql, paramName1, paramValue1, paramName2, paramValue2);
  833. }
  834. public static int ExecuteNonQuery(string sql, string paramName1, object paramValue1, string paramName2, object paramValue2, string paramName3, object paramValue3)
  835. {
  836. return Context.Default.ExecuteNonQuery(sql, paramName1, paramValue1, paramName2, paramValue2, paramName3, paramValue3);
  837. }
  838. public static int ExecuteNonQuery(string sql, CSParameterCollection parameters)
  839. {
  840. return Context.Default.ExecuteNonQuery(sql, parameters);
  841. }
  842. public static int ExecuteNonQuery(string sql, params CSParameter[] parameters)
  843. {
  844. return Context.Default.ExecuteNonQuery(sql, parameters);
  845. }
  846. public static int ExecuteNonQuery(string sql, object parameters)
  847. {
  848. return Context.Default.ExecuteNonQuery(sql, parameters);
  849. }
  850. public static object GetScalar(string sql)
  851. {
  852. return Context.Default.GetScalar(sql);
  853. }
  854. public static object GetScalar(string sql, string paramName, object paramValue)
  855. {
  856. return Context.Default.GetScalar(sql, paramName, paramValue);
  857. }
  858. public static object GetScalar(string sql, string paramName1, object paramValue1, string paramName2, object paramValue2)
  859. {
  860. return Context.Default.GetScalar(sql, paramName1, paramValue1, paramName2, paramValue2);
  861. }
  862. public static object GetScalar(string sql, string paramName1, object paramValue1, string paramName2, object paramValue2, string paramName3, object paramValue3)
  863. {
  864. return Context.Default.GetScalar(sql, paramName1, paramValue1, paramName2, paramValue2, paramName3, paramValue3);
  865. }
  866. public static object GetScalar(string sql, params CSParameter[] parameters)
  867. {
  868. return Context.Default.GetScalar(sql, parameters);
  869. }
  870. public static object GetScalar(string sql, object parameters)
  871. {
  872. return Context.Default.GetScalar(sql, parameters);
  873. }
  874. public static object GetScalar(string sql, CSParameterCollection parameters)
  875. {
  876. return Context.Default.GetScalar(sql, parameters);
  877. }
  878. public static T GetScalar<T>(string sql)
  879. {
  880. return Context.Default.GetScalar<T>(sql);
  881. }
  882. public static T GetScalar<T>(string sql, string paramName, object paramValue)
  883. {
  884. return Context.Default.GetScalar<T>(sql, paramName, paramValue);
  885. }
  886. public static T GetScalar<T>(string sql, string paramName1, object paramValue1, string paramName2, object paramValue2)
  887. {
  888. return Context.Default.GetScalar<T>(sql, paramName1, paramValue1, paramName2, paramValue2);
  889. }
  890. public static T GetScalar<T>(string sql, string paramName1, object paramValue1, string paramName2, object paramValue2, string paramName3, object paramValue3)
  891. {
  892. return Context.Default.GetScalar<T>(sql, paramName1, paramValue1, paramName2, paramValue2, paramName3, paramValue3);
  893. }
  894. public static T GetScalar<T>(string sql, params CSParameter[] parameters)
  895. {
  896. return Context.Default.GetScalar<T>(sql, parameters);
  897. }
  898. public static T GetScalar<T>(string sql, object parameters)
  899. {
  900. return Context.Default.GetScalar<T>(sql, parameters);
  901. }
  902. public static T GetScalar<T>(string sql, CSParameterCollection parameters)
  903. {
  904. return Context.Default.GetScalar<T>(sql, parameters);
  905. }
  906. public static T[] GetScalarList<T>(string sql)
  907. {
  908. return Context.Default.GetScalarList<T>(sql);
  909. }
  910. public static T[] GetScalarList<T>(string sql, string paramName, object paramValue)
  911. {
  912. return Context.Default.GetScalarList<T>(sql, paramName, paramValue);
  913. }
  914. public static T[] GetScalarList<T>(string sql, string paramName1, object paramValue1, string paramName2, object paramValue2)
  915. {
  916. return Context.Default.GetScalarList<T>(sql, paramName1, paramValue1, paramName2, paramValue2);
  917. }
  918. public static T[] GetScalarList<T>(string sql, string paramName1, object paramValue1, string paramName2, object paramValue2, string paramName3, object paramValue3)
  919. {
  920. return Context.Default.GetScalarList<T>(sql, paramName1, paramValue1, paramName2, paramValue2, paramName3, paramValue3);
  921. }
  922. public static T[] GetScalarList<T>(string sql, params CSParameter[] parameters)
  923. {
  924. return Context.Default.GetScalarList<T>(sql, parameters);
  925. }
  926. public static T[] GetScalarList<T>(string sql, object parameters)
  927. {
  928. return Context.Default.GetScalarList<T>(sql, parameters);
  929. }
  930. public static T[] GetScalarList<T>(string sql, CSParameterCollection parameters)
  931. {
  932. return Context.Default.GetScalarList<T>(sql, parameters);
  933. }
  934. public static CSGenericRecordList RunQuery(string sql)
  935. {
  936. return Context.Default.RunQuery(sql);
  937. }
  938. public static CSGenericRecordList RunQuery(string sql, string paramName, object paramValue)
  939. {
  940. return Context.Default.RunQuery(sql, paramName, paramValue);
  941. }
  942. public static CSGenericRecordList RunQuery(string sql, string paramName1, object paramValue1, string paramName2, object paramValue2)
  943. {
  944. return Context.Default.RunQuery(sql, paramName1, paramValue1, paramName2, paramValue2);
  945. }
  946. public static CSGenericRecordList RunQuery(string sql, string paramName1, object paramValue1, string paramName2, object paramValue2, string paramName3, object paramValue3)
  947. {
  948. return Context.Default.RunQuery(sql, paramName1, paramValue1, paramName2, paramValue2, paramName3, paramValue3);
  949. }
  950. public static CSGenericRecordList RunQuery(string sql, CSParameterCollection parameters)
  951. {
  952. return Context.Default.RunQuery(sql, parameters);
  953. }
  954. public static CSGenericRecordList RunQuery(string sql, params CSParameter[] parameters)
  955. {
  956. return Context.Default.RunQuery(sql, parameters);
  957. }
  958. public static CSGenericRecordList RunQuery(string sql, object parameters)
  959. {
  960. return Context.Default.RunQuery(sql, parameters);
  961. }
  962. public static T[] RunQuery<T>(string sql) where T : new()
  963. {
  964. return Context.Default.RunQuery<T>(sql);
  965. }
  966. public static T[] RunQuery<T>(string sql, CSParameterCollection parameters) where T : new()
  967. {
  968. return Context.Default.RunQuery<T>(sql, parameters);
  969. }
  970. public static T[] RunQuery<T>(string sql, object parameters) where T : new()
  971. {
  972. return Context.Default.RunQuery<T>(sql, parameters);
  973. }
  974. public static T[] RunQuery<T>(string sql, string paramName, object paramValue) where T : new()
  975. {
  976. return Context.Default.RunQuery<T>(sql, paramName, paramValue);
  977. }
  978. public static T[] RunQuery<T>(string sql, string paramName1, object paramValue1, string paramName2, object paramValue2) where T : new()
  979. {
  980. return Context.Default.RunQuery<T>(sql, paramName1, paramValue1, paramName2, paramValue2);
  981. }
  982. public static T[] RunQuery<T>(string sql, string paramName1, object paramValue1, string paramName2, object paramValue2, string paramName3, object paramValue3) where T : new()
  983. {
  984. return Context.Default.RunQuery<T>(sql, paramName1, paramValue1, paramName2, paramValue2, paramName3, paramValue3);
  985. }
  986. public static T[] RunQuery<T>() where T:new()
  987. {
  988. return Context.Default.RunQuery<T>();
  989. }
  990. public static T[] RunQuery<T>(CSParameterCollection parameters) where T : new()
  991. {
  992. return Context.Default.RunQuery<T>(parameters);
  993. }
  994. public static T[] RunQuery<T>(object parameters) where T : new()
  995. {
  996. return Context.Default.RunQuery<T>(parameters);
  997. }
  998. public static T RunSingleQuery<T>() where T : class, new()
  999. {
  1000. return Context.Default.RunSingleQuery<T>();
  1001. }
  1002. public static T RunSingleQuery<T>(CSParameterCollection parameters) where T : class, new()
  1003. {
  1004. return Context.Default.RunSingleQuery<T>(parameters);
  1005. }
  1006. public static T RunSingleQuery<T>(object parameters) where T : class, new()
  1007. {
  1008. return Context.Default.RunSingleQuery<T>(parameters);
  1009. }
  1010. public static T RunSingleQuery<T>(string sql) where T : class, new()
  1011. {
  1012. return Context.Default.RunSingleQuery<T>(sql);
  1013. }
  1014. public static T RunSingleQuery<T>(string sql,CSParameterCollection parameters) where T : class, new()
  1015. {
  1016. return Context.Default.RunSingleQuery<T>(sql, parameters);
  1017. }
  1018. public static T RunSingleQuery<T>(string sql, string paramName, object paramValue) where T : class, new()
  1019. {
  1020. return Context.Default.RunSingleQuery<T>(sql,paramName, paramValue);
  1021. }
  1022. public static T RunSingleQuery<T>(string sql, string paramName1, object paramValue1, string paramName2, object paramValue2) where T : class, new()
  1023. {
  1024. return Context.Default.RunSingleQuery<T>(sql, paramName1, paramValue1, paramName2, paramValue2);
  1025. }
  1026. public static T RunSingleQuery<T>(string sql, string paramName1, object paramValue1, string paramName2, object paramValue2, string paramName3, object paramValue3) where T : class, new()
  1027. {
  1028. return Context.Default.RunSingleQuery<T>(sql, paramName1, paramValue1, paramName2, paramValue2, paramName3, paramValue3);
  1029. }
  1030. public static CSGenericRecord RunSingleQuery(string sql)
  1031. {
  1032. return Context.Default.RunSingleQuery(sql);
  1033. }
  1034. public static CSGenericRecord RunSingleQuery(string sql, string paramName, object paramValue)
  1035. {
  1036. return Context.Default.RunSingleQuery(sql, paramName, paramValue);
  1037. }
  1038. public static CSGenericRecord RunSingleQuery(string sql, string paramName1, object paramValue1, string paramName2, object paramValue2)
  1039. {
  1040. return Context.Default.RunSingleQuery(sql, paramName1, paramValue1, paramName2, paramValue2);
  1041. }
  1042. public static CSGenericRecord RunSingleQuery(string sql, string paramName1, object paramValue1, string paramName2, object paramValue2, string paramName3, object paramValue3)
  1043. {
  1044. return Context.Default.RunSingleQuery(sql, paramName1, paramValue1, paramName2, paramValue2, paramName3, paramValue3);
  1045. }
  1046. public static CSGenericRecord RunSingleQuery(string sql, CSParameterCollection parameters)
  1047. {
  1048. return Context.Default.RunSingleQuery(sql, parameters);
  1049. }
  1050. public static CSGenericRecord RunSingleQuery(string sql, params CSParameter[] parameters)
  1051. {
  1052. return Context.Default.RunSingleQuery(sql, parameters);
  1053. }
  1054. }
  1055. }