SmartDataReader.cs 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Data;
  4. using System.Linq;
  5. using System.Text;
  6. using System.Threading.Tasks;
  7. namespace ProjectBase.Util
  8. {
  9. /// <summary>
  10. /// 转换IDataReader字段对象的格式辅助类
  11. /// 可以转换有默认值、可空类型的字段数据
  12. /// </summary>
  13. public sealed class SmartDataReader
  14. {
  15. private DateTime defaultDate;
  16. private IDataReader reader;
  17. /// <summary>
  18. /// 构造函数,传入IDataReader对象
  19. /// </summary>
  20. /// <param name="reader"></param>
  21. public SmartDataReader(IDataReader reader)
  22. {
  23. this.defaultDate = Convert.ToDateTime("01/01/1900 00:00:00");
  24. this.reader = reader;
  25. }
  26. /// <summary>
  27. /// 继续读取下一个操作
  28. /// </summary>
  29. public bool Read()
  30. {
  31. return this.reader.Read();
  32. }
  33. /// <summary>
  34. /// 转换为BigInt类型数据
  35. /// </summary>
  36. public Int64 GetInt64(string column)
  37. {
  38. return GetInt64(column, 0);
  39. }
  40. /// <summary>
  41. /// 转换为Int类型数据
  42. /// </summary>
  43. public Int64 GetInt64(string column, Int64 defaultIfNull)
  44. {
  45. Int64 data = (reader.IsDBNull(reader.GetOrdinal(column))) ? (Int64)defaultIfNull : Int64.Parse(reader[column].ToString());
  46. return data;
  47. }
  48. /// <summary>
  49. /// 转换为Int类型数据
  50. /// </summary>
  51. public Int64? GetInt64Nullable(string column)
  52. {
  53. Int64? data = (reader.IsDBNull(reader.GetOrdinal(column))) ? (Int64?)null : Int64.Parse(reader[column].ToString());
  54. return data;
  55. }
  56. /// <summary>
  57. /// 转换为Int类型数据
  58. /// </summary>
  59. public int GetInt32(string column)
  60. {
  61. return GetInt32(column, 0);
  62. }
  63. /// <summary>
  64. /// 转换为Int类型数据
  65. /// </summary>
  66. public int GetInt32(string column, int defaultIfNull)
  67. {
  68. int data = (reader.IsDBNull(reader.GetOrdinal(column))) ? (int)defaultIfNull : int.Parse(reader[column].ToString());
  69. return data;
  70. }
  71. /// <summary>
  72. /// 转换为Int类型数据
  73. /// </summary>
  74. public int? GetInt32Nullable(string column)
  75. {
  76. int? data = (reader.IsDBNull(reader.GetOrdinal(column))) ? (int?)null : int.Parse(reader[column].ToString());
  77. return data;
  78. }
  79. /// <summary>
  80. /// 转换为Int16类型数据
  81. /// </summary>
  82. public short GetInt16(string column)
  83. {
  84. return GetInt16(column, 0);
  85. }
  86. /// <summary>
  87. /// 转换为Int16类型数据
  88. /// </summary>
  89. public short GetInt16(string column, short defaultIfNull)
  90. {
  91. short data = (reader.IsDBNull(reader.GetOrdinal(column))) ? defaultIfNull : short.Parse(reader[column].ToString());
  92. return data;
  93. }
  94. /// <summary>
  95. /// 转换为Int16类型数据
  96. /// </summary>
  97. public short? GetInt16Nullable(string column)
  98. {
  99. short? data = (reader.IsDBNull(reader.GetOrdinal(column))) ? (short?)null : short.Parse(reader[column].ToString());
  100. return data;
  101. }
  102. /// <summary>
  103. /// 转换为byte类型数据
  104. /// </summary>
  105. public byte GetByte(string column)
  106. {
  107. return GetByte(column, 0);
  108. }
  109. /// <summary>
  110. /// 转换为byte类型数据
  111. /// </summary>
  112. public byte GetByte(string column, byte defaultIfNull)
  113. {
  114. byte data = (reader.IsDBNull(reader.GetOrdinal(column))) ? defaultIfNull : byte.Parse(reader[column].ToString());
  115. return data;
  116. }
  117. /// <summary>
  118. /// 转换为byte类型数据
  119. /// </summary>
  120. public byte? GetByteNullable(string column)
  121. {
  122. byte? data = (reader.IsDBNull(reader.GetOrdinal(column))) ? (byte?)null : byte.Parse(reader[column].ToString());
  123. return data;
  124. }
  125. /// <summary>
  126. /// 转换为Float类型数据
  127. /// </summary>
  128. public float GetFloat(string column)
  129. {
  130. return GetFloat(column, 0);
  131. }
  132. /// <summary>
  133. /// 转换为Float类型数据
  134. /// </summary>
  135. public float GetFloat(string column, float defaultIfNull)
  136. {
  137. float data = (reader.IsDBNull(reader.GetOrdinal(column))) ? defaultIfNull : float.Parse(reader[column].ToString());
  138. return data;
  139. }
  140. /// <summary>
  141. /// 转换为Float类型数据
  142. /// </summary>
  143. public float? GetFloatNullable(string column)
  144. {
  145. float? data = (reader.IsDBNull(reader.GetOrdinal(column))) ? (float?)null : float.Parse(reader[column].ToString());
  146. return data;
  147. }
  148. /// <summary>
  149. /// 转换为Double类型数据
  150. /// </summary>
  151. public double GetDouble(string column)
  152. {
  153. return GetDouble(column, 0);
  154. }
  155. /// <summary>
  156. /// 转换为Double类型数据
  157. /// </summary>
  158. public double GetDouble(string column, double defaultIfNull)
  159. {
  160. double data = (reader.IsDBNull(reader.GetOrdinal(column))) ? defaultIfNull : double.Parse(reader[column].ToString());
  161. return data;
  162. }
  163. /// <summary>
  164. /// 转换为Double类型数据(可空类型)
  165. /// </summary>
  166. public double? GetDoubleNullable(string column)
  167. {
  168. double? data = (reader.IsDBNull(reader.GetOrdinal(column))) ? (double?)null : double.Parse(reader[column].ToString());
  169. return data;
  170. }
  171. /// <summary>
  172. /// 转换为Decimal类型数据
  173. /// </summary>
  174. public decimal GetDecimal(string column)
  175. {
  176. return GetDecimal(column, 0);
  177. }
  178. /// <summary>
  179. /// 转换为Decimal类型数据
  180. /// </summary>
  181. public decimal GetDecimal(string column, decimal defaultIfNull)
  182. {
  183. decimal data = (reader.IsDBNull(reader.GetOrdinal(column))) ? defaultIfNull : decimal.Parse(reader[column].ToString());
  184. return data;
  185. }
  186. /// <summary>
  187. /// 转换为Decimal类型数据(可空类型)
  188. /// </summary>
  189. public decimal? GetDecimalNullable(string column)
  190. {
  191. decimal? data = (reader.IsDBNull(reader.GetOrdinal(column))) ? (decimal?)null : decimal.Parse(reader[column].ToString());
  192. return data;
  193. }
  194. /// <summary>
  195. /// 转换为Single类型数据
  196. /// </summary>
  197. public Single GetSingle(string column)
  198. {
  199. return GetSingle(column, 0);
  200. }
  201. /// <summary>
  202. /// 转换为Single类型数据
  203. /// </summary>
  204. public Single GetSingle(string column, Single defaultIfNull)
  205. {
  206. Single data = (reader.IsDBNull(reader.GetOrdinal(column))) ? defaultIfNull : Single.Parse(reader[column].ToString());
  207. return data;
  208. }
  209. /// <summary>
  210. /// 转换为Single类型数据(可空类型)
  211. /// </summary>
  212. public Single? GetSingleNullable(string column)
  213. {
  214. Single? data = (reader.IsDBNull(reader.GetOrdinal(column))) ? (Single?)null : Single.Parse(reader[column].ToString());
  215. return data;
  216. }
  217. /// <summary>
  218. /// 转换为布尔类型数据
  219. /// </summary>
  220. public bool GetBoolean(string column)
  221. {
  222. return GetBoolean(column, false);
  223. }
  224. /// <summary>
  225. /// 转换为布尔类型数据
  226. /// </summary>
  227. public bool GetBoolean(string column, bool defaultIfNull)
  228. {
  229. string str = reader[column].ToString();
  230. bool result = false;
  231. bool.TryParse(str, out result);
  232. bool data = (reader.IsDBNull(reader.GetOrdinal(column))) ? defaultIfNull : result;
  233. return data;
  234. }
  235. /// <summary>
  236. /// 转换为布尔类型数据(可空类型)
  237. /// </summary>
  238. public bool? GetBooleanNullable(string column)
  239. {
  240. string str = reader[column].ToString();
  241. bool result = false;
  242. bool.TryParse(str, out result);
  243. bool? data = (reader.IsDBNull(reader.GetOrdinal(column))) ? (bool?)null : result;
  244. return data;
  245. }
  246. /// <summary>
  247. /// 转换为字符串类型数据
  248. /// </summary>
  249. public String GetString(string column)
  250. {
  251. return GetString(column, "");
  252. }
  253. /// <summary>
  254. /// 转换为字符串类型数据
  255. /// </summary>
  256. public string GetString(string column, string defaultIfNull)
  257. {
  258. string data = (reader.IsDBNull(reader.GetOrdinal(column))) ? defaultIfNull : reader[column].ToString();
  259. return data;
  260. }
  261. /// <summary>
  262. /// 转换为Byte字节数据类型数据
  263. /// </summary>
  264. public byte[] GetBytes(string column)
  265. {
  266. return GetBytes(column, null);
  267. }
  268. /// <summary>
  269. /// 转换为Byte字节数据类型数据
  270. /// </summary>
  271. public byte[] GetBytes(string column, string defaultIfNull)
  272. {
  273. //string data = (reader.IsDBNull(reader.GetOrdinal(column))) ? defaultIfNull : reader[column].ToString();
  274. //return System.Text.Encoding.UTF8.GetBytes(data);
  275. int ndx = reader.GetOrdinal(column);
  276. if (!reader.IsDBNull(ndx))
  277. {
  278. long size = reader.GetBytes(ndx, 0, null, 0, 0); //get the length of data
  279. byte[] values = new byte[size];
  280. int bufferSize = 1024;
  281. long bytesRead = 0;
  282. int curPos = 0;
  283. while (bytesRead < size)
  284. {
  285. bytesRead += reader.GetBytes(ndx, curPos, values, curPos, bufferSize);
  286. curPos += bufferSize;
  287. }
  288. return values;
  289. }
  290. else
  291. {
  292. return null;
  293. }
  294. }
  295. /// <summary>
  296. /// 转换为Guid类型数据
  297. /// </summary>
  298. public Guid GetGuid(string column)
  299. {
  300. return GetGuid(column, null);
  301. }
  302. /// <summary>
  303. /// 转换为Guid类型数据
  304. /// </summary>
  305. public Guid GetGuid(string column, string defaultIfNull)
  306. {
  307. string data = (reader.IsDBNull(reader.GetOrdinal(column))) ? defaultIfNull : reader[column].ToString();
  308. Guid guid = Guid.Empty;
  309. if (data != null)
  310. {
  311. guid = new Guid(data);
  312. }
  313. return guid;
  314. }
  315. /// <summary>
  316. /// 转换为Guid类型数据(可空类型)
  317. /// </summary>
  318. public Guid? GetGuidNullable(string column)
  319. {
  320. string data = (reader.IsDBNull(reader.GetOrdinal(column))) ? null : reader[column].ToString();
  321. Guid? guid = null;
  322. if (data != null)
  323. {
  324. guid = new Guid(data);
  325. }
  326. return guid;
  327. }
  328. /// <summary>
  329. /// 转换为DateTime类型数据
  330. /// </summary>
  331. public DateTime GetDateTime(string column)
  332. {
  333. return GetDateTime(column, defaultDate);
  334. }
  335. /// <summary>
  336. /// 转换为DateTime类型数据
  337. /// </summary>
  338. public DateTime GetDateTime(string column, DateTime defaultIfNull)
  339. {
  340. DateTime data = (reader.IsDBNull(reader.GetOrdinal(column))) ? defaultIfNull : Convert.ToDateTime(reader[column].ToString());
  341. return data;
  342. }
  343. /// <summary>
  344. /// 转换为可空DateTime类型数据
  345. /// </summary>
  346. public DateTime? GetDateTimeNullable(string column)
  347. {
  348. DateTime? data = (reader.IsDBNull(reader.GetOrdinal(column))) ? (DateTime?)null : Convert.ToDateTime(reader[column].ToString());
  349. return data;
  350. }
  351. /// <summary>
  352. /// 判断指定的值是否为Null类型
  353. /// </summary>
  354. /// <param name="value">指定的值</param>
  355. public bool IsNull(object value)
  356. {
  357. if (value == null)
  358. return true;
  359. if (value is System.Data.SqlTypes.INullable && ((System.Data.SqlTypes.INullable)value).IsNull)
  360. return true;
  361. if (value == DBNull.Value)
  362. return true;
  363. return false;
  364. }
  365. /// <summary>
  366. /// 转换指定的值为可空类型的值
  367. /// </summary>
  368. /// <param name="value">指定的值</param>
  369. /// <returns></returns>
  370. public T? ConvertToNullableValue<T>(object value) where T : struct
  371. {
  372. if (value == null)
  373. {
  374. return null;
  375. }
  376. else if (value == DBNull.Value)
  377. {
  378. return null;
  379. }
  380. else if (value is string && string.IsNullOrEmpty((string)value))
  381. {
  382. return null;
  383. }
  384. else
  385. {
  386. if (!(value is T))
  387. {
  388. try
  389. {
  390. value = Convert.ChangeType(value, typeof(T));
  391. }
  392. catch (Exception e)
  393. {
  394. throw new ArgumentException("Value值不是一个有效的类型", "value", e);
  395. }
  396. }
  397. return new T?((T)value);
  398. }
  399. }
  400. }
  401. }