PageRenderTime 45ms CodeModel.GetById 12ms RepoModel.GetById 0ms app.codeStats 1ms

/UtilsExtensionsAndHelpers.MySql/MySqlQuery.cs

http://ueah.codeplex.com
C# | 390 lines | 340 code | 44 blank | 6 comment | 38 complexity | b092dfc67d99fef9a31382f99893c69a MD5 | raw file
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Data;
  4. using System.Data.SqlClient;
  5. using System.Linq;
  6. using System.Text;
  7. using MySql.Data.MySqlClient;
  8. namespace UtilsExtensionsAndHelpers.Utils.Implimentations
  9. {
  10. public class MySqlQuery: IQuery, IRow
  11. {
  12. #region Fields
  13. private MySqlConnection _connection;
  14. private MySqlCommand _command;
  15. private MySqlDataReader _reader;
  16. private bool _connectionClosed;
  17. private int _timeOut;
  18. private bool _usePersistentConnection;
  19. private readonly Dictionary<string, int> _columns = new Dictionary<string, int>();
  20. private static Dictionary<DbType,MySqlDbType> _dbTypeMap = new Dictionary<DbType, MySqlDbType>
  21. {
  22. {DbType.String, MySqlDbType.VarString},
  23. {DbType.Int64, MySqlDbType.Int64},
  24. {DbType.Int32, MySqlDbType.Int32},
  25. {DbType.Int16, MySqlDbType.Int16},
  26. {DbType.Byte, MySqlDbType.Byte},
  27. {DbType.Binary, MySqlDbType.Blob}
  28. };
  29. #endregion
  30. #region IDisposable
  31. public void Dispose()
  32. {
  33. if (_reader != null)
  34. {
  35. _reader.Dispose();
  36. _reader = null;
  37. }
  38. if (_command != null)
  39. {
  40. _command.Dispose();
  41. _command = null;
  42. }
  43. if (_connectionClosed && _connection != null)
  44. {
  45. _connection.Dispose();
  46. _connection = null;
  47. }
  48. }
  49. #endregion
  50. #region Constructors
  51. public MySqlQuery(string connectionString) : this(connectionString, 0){}
  52. public MySqlQuery(string connectionString, int timeOut) : this(connectionString, timeOut, false){}
  53. public MySqlQuery(string connectionString, int timeOut, bool usePersistentConnection):this(new MySqlConnection(connectionString), timeOut, usePersistentConnection){}
  54. public MySqlQuery(MySqlConnection connection):this(connection, 0){}
  55. public MySqlQuery(MySqlConnection connection, int timeOut):this(connection, timeOut, false){}
  56. public MySqlQuery(MySqlConnection connection, int timeOut, bool usePersistentConnection)
  57. {
  58. if (connection == null) throw new ArgumentNullException("connection");
  59. _connection = connection;
  60. _timeOut = timeOut;
  61. _usePersistentConnection = usePersistentConnection;
  62. }
  63. protected MySqlQuery(MySqlConnection connection, string sql, int timeOut, CommandType commandType, IEnumerable<SqlParameter> parameters)
  64. {
  65. _connection = connection;
  66. _timeOut = timeOut;
  67. if (_connection == null) throw new ArgumentNullException("connection");
  68. if (sql == null) throw new ArgumentNullException("sql");
  69. try {
  70. _connectionClosed = false;
  71. _connection.Open();
  72. } catch {
  73. _connectionClosed = false;
  74. }
  75. _command = new MySqlCommand(sql, _connection);
  76. _command.CommandType = commandType;
  77. _command.CommandTimeout = timeOut;
  78. if (parameters == null)
  79. {
  80. _reader = _command.ExecuteReader();
  81. }
  82. else
  83. {
  84. _command.Prepare();
  85. _command.Parameters.AddRange(parameters.Select(ToMySqlParameter).ToArray());
  86. _reader = _command.ExecuteReader();
  87. }
  88. }
  89. private MySqlParameter ToMySqlParameter(SqlParameter p)
  90. {
  91. var mysqlParameter = new MySqlParameter
  92. {
  93. ParameterName = p.ParameterName,
  94. Value = p.Value,
  95. DbType = p.DbType,
  96. IsNullable = p.IsNullable,
  97. Scale = p.Scale,
  98. Size = p.Size,
  99. Direction = p.Direction,
  100. Precision = p.Precision,
  101. SourceColumn = p.SourceColumn,
  102. SourceColumnNullMapping = p.SourceColumnNullMapping,
  103. SourceVersion = p.SourceVersion
  104. };
  105. return mysqlParameter;
  106. }
  107. #endregion
  108. #region Execute for one
  109. public T ExecuteSqlForOne<T>(string sql, Func<IRow, T> conversionAction)
  110. {
  111. return ExecuteSqlForOne(sql, null, conversionAction);
  112. }
  113. public T ExecuteSqlForOne<T>(string sql, IEnumerable<SqlParameter> parameters, Func<IRow, T> conversionAction)
  114. {
  115. var item = default(T);
  116. using (var q = new MySqlQuery(_connection, sql, _timeOut, CommandType.Text, parameters))
  117. {
  118. while (q.Read())
  119. {
  120. item = conversionAction(q);
  121. }
  122. }
  123. if (!_usePersistentConnection)
  124. {
  125. Dispose();
  126. }
  127. return item;
  128. }
  129. public T ExecuteProcedureForOne<T>(string procedureName, Func<IRow, T> conversionAction)
  130. {
  131. return ExecuteProcedureForOne(procedureName, null, conversionAction);
  132. }
  133. public T ExecuteProcedureForOne<T>(string procedureName, IEnumerable<SqlParameter> parameters, Func<IRow, T> conversionAction)
  134. {
  135. var item = default(T);
  136. using (var q = new MySqlQuery(_connection, procedureName, _timeOut, CommandType.StoredProcedure, parameters))
  137. {
  138. while (q.Read())
  139. {
  140. item = conversionAction(q);
  141. }
  142. }
  143. if (!_usePersistentConnection)
  144. {
  145. Dispose();
  146. }
  147. return item;
  148. }
  149. #endregion
  150. #region Execute for many
  151. public IEnumerable<T> ExecuteSqlForMany<T>(string sql, Func<IRow, T> conversionAction)
  152. {
  153. return ExecuteSqlForMany(sql, null, conversionAction);
  154. }
  155. public IEnumerable<T> ExecuteSqlForMany<T>(string sql, IEnumerable<SqlParameter> parameters, Func<IRow, T> conversionAction)
  156. {
  157. using (var q = new MySqlQuery(_connection, sql, _timeOut, CommandType.Text, parameters))
  158. {
  159. while (q.Read())
  160. {
  161. yield return conversionAction(q);
  162. }
  163. }
  164. if (!_usePersistentConnection)
  165. {
  166. Dispose();
  167. }
  168. }
  169. public IEnumerable<T> ExecuteProcedureForMany<T>(string procedureName, Func<IRow, T> conversionAction)
  170. {
  171. return ExecuteProcedureForMany(procedureName, null, conversionAction);
  172. }
  173. public IEnumerable<T> ExecuteProcedureForMany<T>(string procedureName, IEnumerable<SqlParameter> parameters, Func<IRow, T> conversionAction)
  174. {
  175. using (var q = new MySqlQuery(_connection, procedureName, _timeOut, CommandType.StoredProcedure, parameters))
  176. {
  177. while (q.Read())
  178. {
  179. yield return conversionAction(q);
  180. }
  181. }
  182. if (!_usePersistentConnection)
  183. {
  184. Dispose();
  185. }
  186. }
  187. #endregion
  188. #region Execute no result
  189. public void ExecuteSqlNoResult(string sql)
  190. {
  191. ExecuteSqlNoResult(sql, null);
  192. }
  193. public void ExecuteSqlNoResult(string sql, IEnumerable<SqlParameter> parameters)
  194. {
  195. using (var q = new MySqlQuery(_connection, sql, _timeOut, CommandType.Text, parameters))
  196. {
  197. q.Read();
  198. }
  199. if (!_usePersistentConnection)
  200. {
  201. Dispose();
  202. }
  203. }
  204. public void ExecuteProcedureNoResult(string procedureName)
  205. {
  206. ExecuteProcedureNoResult(procedureName, null);
  207. }
  208. public void ExecuteProcedureNoResult(string procedureName, IEnumerable<SqlParameter> parameters)
  209. {
  210. using (var q = new MySqlQuery(_connection, procedureName, _timeOut, CommandType.Text, parameters))
  211. {
  212. q.Read();
  213. }
  214. if (!_usePersistentConnection)
  215. {
  216. Dispose();
  217. }
  218. }
  219. #endregion
  220. #region OrdinalColumn
  221. /// <summary>
  222. /// Returns the ordinal column number for a named column.
  223. /// The ordinal is cached so unlike SqlDataReader.GetOrdinal() it's not a performance hit to call it inside a loop.
  224. /// </summary>
  225. /// <param name="column"></param>
  226. /// <returns></returns>
  227. public int this[string column]
  228. {
  229. get
  230. {
  231. if (!_columns.ContainsKey(column))
  232. _columns[column] = _reader.GetOrdinal(column);
  233. return _columns[column];
  234. }
  235. }
  236. #endregion
  237. #region SqlDataReader Pass-through
  238. public bool GetBoolean(string column)
  239. {
  240. return _reader.GetBoolean(this[column]);
  241. }
  242. public byte GetByte(string column)
  243. {
  244. return _reader.GetByte(this[column]);
  245. }
  246. public DateTime GetDateTime(string column)
  247. {
  248. return _reader.GetDateTime(this[column]);
  249. }
  250. public decimal GetDecimal(string column)
  251. {
  252. return _reader.GetDecimal(this[column]);
  253. }
  254. public double GetDouble(string column)
  255. {
  256. return _reader.GetDouble(this[column]);
  257. }
  258. public float GetFloat(string column)
  259. {
  260. return _reader.GetFloat(this[column]);
  261. }
  262. public short GetInt16(string column)
  263. {
  264. return _reader.GetInt16(this[column]);
  265. }
  266. public int GetInt32(string column)
  267. {
  268. return _reader.GetInt32(this[column]);
  269. }
  270. public long GetInt64(string column)
  271. {
  272. return _reader.GetInt64(this[column]);
  273. }
  274. public string GetString(string column)
  275. {
  276. if (_reader.IsDBNull(this[column]))
  277. return null;
  278. return _reader.GetString(this[column]);
  279. }
  280. public bool IsDBNull(string column)
  281. {
  282. return _reader.IsDBNull(this[column]);
  283. }
  284. public bool Read()
  285. {
  286. return _reader.Read();
  287. }
  288. #endregion
  289. #region GetNullable
  290. public bool? GetNullableBoolean(string column)
  291. {
  292. if (_reader.IsDBNull(this[column]))
  293. return null;
  294. return _reader.GetBoolean(this[column]);
  295. }
  296. public byte? GetNullableByte(string column)
  297. {
  298. if (_reader.IsDBNull(this[column]))
  299. return null;
  300. return _reader.GetByte(this[column]);
  301. }
  302. public DateTime? GetNullableDateTime(string column)
  303. {
  304. if (_reader.IsDBNull(this[column]))
  305. return null;
  306. return _reader.GetDateTime(this[column]);
  307. }
  308. public decimal? GetNullableDecimal(string column)
  309. {
  310. if (_reader.IsDBNull(this[column]))
  311. return null;
  312. return _reader.GetDecimal(this[column]);
  313. }
  314. public double? GetNullableDouble(string column)
  315. {
  316. if (_reader.IsDBNull(this[column]))
  317. return null;
  318. return _reader.GetDouble(this[column]);
  319. }
  320. public float? GetNullableFloat(string column)
  321. {
  322. if (_reader.IsDBNull(this[column]))
  323. return null;
  324. return _reader.GetFloat(this[column]);
  325. }
  326. public short? GetNullableInt16(string column)
  327. {
  328. if (_reader.IsDBNull(this[column]))
  329. return null;
  330. return _reader.GetInt16(this[column]);
  331. }
  332. public int? GetNullableInt32(string column)
  333. {
  334. if (_reader.IsDBNull(this[column]))
  335. return null;
  336. return _reader.GetInt32(this[column]);
  337. }
  338. public long? GetNullableInt64(string column)
  339. {
  340. if (_reader.IsDBNull(this[column]))
  341. return null;
  342. return _reader.GetInt64(this[column]);
  343. }
  344. #endregion
  345. }
  346. }