public static class DataReaderExtensions { public static IEnumerable Stream(this IDbCommand command, Func converter) { using (var reader = command.ExecuteReader(CommandBehavior.SingleResult)) { while (reader.Read()) yield return converter(reader); } } public static Nullable ValueOrNull(this IDataRecord record, string field) where T : struct { var value = record[field]; if (value == DBNull.Value) return new Nullable(); return (T)value; } public static T ValueOrDefault(this IDataRecord record, string field) { var value = record[field]; if (value == DBNull.Value) return default(T); return (T)value; } public static long? Long(this IDataRecord record, string column) { var value = record[column]; if (value == DBNull.Value) return null; return (long)value; } public static string String(this IDataRecord record, string column) { var value = record[column]; if (value == DBNull.Value) return null; return (string)value; } public static Guid? Guid(this IDataRecord record, string column) { var value = record[column]; if (value == DBNull.Value) return null; return (Guid)value; } public static DateTime? Date(this IDataRecord record, string column) { var value = record[column]; if (value == DBNull.Value) return null; return (DateTime)value; } public static int? Int(this IDataRecord record, string column) { var value = record[column]; if (value == DBNull.Value) return null; return (int)value; } public static bool? Boolean(this IDataRecord record, string column) { var value = record[column]; if (value == DBNull.Value) return null; if (value is bool) return (bool)value; if (value is int) return ((int)value) == 1; return Convert.ToBoolean(value); } public static long? RowVersion(this IDataRecord record, string column) { object value = record[column]; if (value == DBNull.Value) return null; // can't use BitConverter as value coming out is big-endian byte[] bytes = (byte[])value; long ret = 0; for (int i = 0; i < 8; i++) { ret = unchecked((ret << 8) | bytes[i]); } return ret; } public static decimal? Decimal(this IDataRecord record, string column) { var value = record[column]; if (value == DBNull.Value) return null; return (decimal)value; } public static byte[] Binary(this IDataRecord record, string column) { int idx = record.GetOrdinal(column); if (record.IsDBNull(idx)) return null; // copy data into memory using (var memory = new MemoryStream()) { int bufferSize = 4096; byte[] buffer = new byte[bufferSize]; int offset = 0; while (true) { // read in the data and increment our offset long length = record.GetBytes(idx, offset, buffer, 0, bufferSize); offset += bufferSize; // write the resulting bytes to the memory stream memory.Write(buffer, 0, (int)length); // if we didn't read full buffer, then we are likely done if (length < bufferSize) break; } return memory.ToArray(); } } }