using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ProjectBase.Util
{
///
/// 转换IDataReader字段对象的格式辅助类
/// 可以转换有默认值、可空类型的字段数据
///
public sealed class SmartDataReader
{
private DateTime defaultDate;
private IDataReader reader;
///
/// 构造函数,传入IDataReader对象
///
///
public SmartDataReader(IDataReader reader)
{
this.defaultDate = Convert.ToDateTime("01/01/1900 00:00:00");
this.reader = reader;
}
///
/// 继续读取下一个操作
///
public bool Read()
{
return this.reader.Read();
}
///
/// 转换为BigInt类型数据
///
public Int64 GetInt64(string column)
{
return GetInt64(column, 0);
}
///
/// 转换为Int类型数据
///
public Int64 GetInt64(string column, Int64 defaultIfNull)
{
Int64 data = (reader.IsDBNull(reader.GetOrdinal(column))) ? (Int64)defaultIfNull : Int64.Parse(reader[column].ToString());
return data;
}
///
/// 转换为Int类型数据
///
public Int64? GetInt64Nullable(string column)
{
Int64? data = (reader.IsDBNull(reader.GetOrdinal(column))) ? (Int64?)null : Int64.Parse(reader[column].ToString());
return data;
}
///
/// 转换为Int类型数据
///
public int GetInt32(string column)
{
return GetInt32(column, 0);
}
///
/// 转换为Int类型数据
///
public int GetInt32(string column, int defaultIfNull)
{
int data = (reader.IsDBNull(reader.GetOrdinal(column))) ? (int)defaultIfNull : int.Parse(reader[column].ToString());
return data;
}
///
/// 转换为Int类型数据
///
public int? GetInt32Nullable(string column)
{
int? data = (reader.IsDBNull(reader.GetOrdinal(column))) ? (int?)null : int.Parse(reader[column].ToString());
return data;
}
///
/// 转换为Int16类型数据
///
public short GetInt16(string column)
{
return GetInt16(column, 0);
}
///
/// 转换为Int16类型数据
///
public short GetInt16(string column, short defaultIfNull)
{
short data = (reader.IsDBNull(reader.GetOrdinal(column))) ? defaultIfNull : short.Parse(reader[column].ToString());
return data;
}
///
/// 转换为Int16类型数据
///
public short? GetInt16Nullable(string column)
{
short? data = (reader.IsDBNull(reader.GetOrdinal(column))) ? (short?)null : short.Parse(reader[column].ToString());
return data;
}
///
/// 转换为byte类型数据
///
public byte GetByte(string column)
{
return GetByte(column, 0);
}
///
/// 转换为byte类型数据
///
public byte GetByte(string column, byte defaultIfNull)
{
byte data = (reader.IsDBNull(reader.GetOrdinal(column))) ? defaultIfNull : byte.Parse(reader[column].ToString());
return data;
}
///
/// 转换为byte类型数据
///
public byte? GetByteNullable(string column)
{
byte? data = (reader.IsDBNull(reader.GetOrdinal(column))) ? (byte?)null : byte.Parse(reader[column].ToString());
return data;
}
///
/// 转换为Float类型数据
///
public float GetFloat(string column)
{
return GetFloat(column, 0);
}
///
/// 转换为Float类型数据
///
public float GetFloat(string column, float defaultIfNull)
{
float data = (reader.IsDBNull(reader.GetOrdinal(column))) ? defaultIfNull : float.Parse(reader[column].ToString());
return data;
}
///
/// 转换为Float类型数据
///
public float? GetFloatNullable(string column)
{
float? data = (reader.IsDBNull(reader.GetOrdinal(column))) ? (float?)null : float.Parse(reader[column].ToString());
return data;
}
///
/// 转换为Double类型数据
///
public double GetDouble(string column)
{
return GetDouble(column, 0);
}
///
/// 转换为Double类型数据
///
public double GetDouble(string column, double defaultIfNull)
{
double data = (reader.IsDBNull(reader.GetOrdinal(column))) ? defaultIfNull : double.Parse(reader[column].ToString());
return data;
}
///
/// 转换为Double类型数据(可空类型)
///
public double? GetDoubleNullable(string column)
{
double? data = (reader.IsDBNull(reader.GetOrdinal(column))) ? (double?)null : double.Parse(reader[column].ToString());
return data;
}
///
/// 转换为Decimal类型数据
///
public decimal GetDecimal(string column)
{
return GetDecimal(column, 0);
}
///
/// 转换为Decimal类型数据
///
public decimal GetDecimal(string column, decimal defaultIfNull)
{
decimal data = (reader.IsDBNull(reader.GetOrdinal(column))) ? defaultIfNull : decimal.Parse(reader[column].ToString());
return data;
}
///
/// 转换为Decimal类型数据(可空类型)
///
public decimal? GetDecimalNullable(string column)
{
decimal? data = (reader.IsDBNull(reader.GetOrdinal(column))) ? (decimal?)null : decimal.Parse(reader[column].ToString());
return data;
}
///
/// 转换为Single类型数据
///
public Single GetSingle(string column)
{
return GetSingle(column, 0);
}
///
/// 转换为Single类型数据
///
public Single GetSingle(string column, Single defaultIfNull)
{
Single data = (reader.IsDBNull(reader.GetOrdinal(column))) ? defaultIfNull : Single.Parse(reader[column].ToString());
return data;
}
///
/// 转换为Single类型数据(可空类型)
///
public Single? GetSingleNullable(string column)
{
Single? data = (reader.IsDBNull(reader.GetOrdinal(column))) ? (Single?)null : Single.Parse(reader[column].ToString());
return data;
}
///
/// 转换为布尔类型数据
///
public bool GetBoolean(string column)
{
return GetBoolean(column, false);
}
///
/// 转换为布尔类型数据
///
public bool GetBoolean(string column, bool defaultIfNull)
{
string str = reader[column].ToString();
bool result = false;
bool.TryParse(str, out result);
bool data = (reader.IsDBNull(reader.GetOrdinal(column))) ? defaultIfNull : result;
return data;
}
///
/// 转换为布尔类型数据(可空类型)
///
public bool? GetBooleanNullable(string column)
{
string str = reader[column].ToString();
bool result = false;
bool.TryParse(str, out result);
bool? data = (reader.IsDBNull(reader.GetOrdinal(column))) ? (bool?)null : result;
return data;
}
///
/// 转换为字符串类型数据
///
public String GetString(string column)
{
return GetString(column, "");
}
///
/// 转换为字符串类型数据
///
public string GetString(string column, string defaultIfNull)
{
string data = (reader.IsDBNull(reader.GetOrdinal(column))) ? defaultIfNull : reader[column].ToString();
return data;
}
///
/// 转换为Byte字节数据类型数据
///
public byte[] GetBytes(string column)
{
return GetBytes(column, null);
}
///
/// 转换为Byte字节数据类型数据
///
public byte[] GetBytes(string column, string defaultIfNull)
{
//string data = (reader.IsDBNull(reader.GetOrdinal(column))) ? defaultIfNull : reader[column].ToString();
//return System.Text.Encoding.UTF8.GetBytes(data);
int ndx = reader.GetOrdinal(column);
if (!reader.IsDBNull(ndx))
{
long size = reader.GetBytes(ndx, 0, null, 0, 0); //get the length of data
byte[] values = new byte[size];
int bufferSize = 1024;
long bytesRead = 0;
int curPos = 0;
while (bytesRead < size)
{
bytesRead += reader.GetBytes(ndx, curPos, values, curPos, bufferSize);
curPos += bufferSize;
}
return values;
}
else
{
return null;
}
}
///
/// 转换为Guid类型数据
///
public Guid GetGuid(string column)
{
return GetGuid(column, null);
}
///
/// 转换为Guid类型数据
///
public Guid GetGuid(string column, string defaultIfNull)
{
string data = (reader.IsDBNull(reader.GetOrdinal(column))) ? defaultIfNull : reader[column].ToString();
Guid guid = Guid.Empty;
if (data != null)
{
guid = new Guid(data);
}
return guid;
}
///
/// 转换为Guid类型数据(可空类型)
///
public Guid? GetGuidNullable(string column)
{
string data = (reader.IsDBNull(reader.GetOrdinal(column))) ? null : reader[column].ToString();
Guid? guid = null;
if (data != null)
{
guid = new Guid(data);
}
return guid;
}
///
/// 转换为DateTime类型数据
///
public DateTime GetDateTime(string column)
{
return GetDateTime(column, defaultDate);
}
///
/// 转换为DateTime类型数据
///
public DateTime GetDateTime(string column, DateTime defaultIfNull)
{
DateTime data = (reader.IsDBNull(reader.GetOrdinal(column))) ? defaultIfNull : Convert.ToDateTime(reader[column].ToString());
return data;
}
///
/// 转换为可空DateTime类型数据
///
public DateTime? GetDateTimeNullable(string column)
{
DateTime? data = (reader.IsDBNull(reader.GetOrdinal(column))) ? (DateTime?)null : Convert.ToDateTime(reader[column].ToString());
return data;
}
///
/// 判断指定的值是否为Null类型
///
/// 指定的值
public bool IsNull(object value)
{
if (value == null)
return true;
if (value is System.Data.SqlTypes.INullable && ((System.Data.SqlTypes.INullable)value).IsNull)
return true;
if (value == DBNull.Value)
return true;
return false;
}
///
/// 转换指定的值为可空类型的值
///
/// 指定的值
///
public T? ConvertToNullableValue(object value) where T : struct
{
if (value == null)
{
return null;
}
else if (value == DBNull.Value)
{
return null;
}
else if (value is string && string.IsNullOrEmpty((string)value))
{
return null;
}
else
{
if (!(value is T))
{
try
{
value = Convert.ChangeType(value, typeof(T));
}
catch (Exception e)
{
throw new ArgumentException("Value值不是一个有效的类型", "value", e);
}
}
return new T?((T)value);
}
}
}
}