これは、DataReader から値を読み取って返すのに役立つカスタム dataconverter ヘルパー クラスです。
public class DataConvertor<T> where T : IhasIndexer
{
public DataConvertorField<string, T> String;
public DataConvertorField<int, T> Int;
T reader;
public void Initialise(T reader)
{
this.reader = reader;
String = new DataConvertorField<string, T>(reader, Convert.ToString);
Int = new DataConvertorField<int, T>(reader, Convert.ToInt32);
}
public bool has(string name)
{
try
{
object o = reader[name];
return true;
}
catch
{
return false;
}
}
}
public class DataConvertorField<T, O> where O : IhasIndexer
{
O parent;
DataConvertorMethod convertor;
public DataConvertorField(O parent, DataConvertorMethod convertor)
{
this.parent = parent;
this.convertor = convertor;
}
public T this[string name]
{
get
{
if (parent[name] == DBNull.Value)
{
if (typeof(T).Equals(typeof(string)))
return (T)(object)string.Empty;
else
return default(T);
}
else
return convertor(parent[name]);
}
}
public delegate T DataConvertorMethod(object o);
}
public interface IhasIndexer
{
object this[string key] { get; }
}
次に、以下のようにADO.Net コードで使用するだけです
using (DBDataReaderWrapper reader = cmd.ExecuteReader())
{
while (reader.Read())
{
user.UserId = reader.Int["UserId"];
user.UserName = reader.String["UserName"];
}
public class DBDataReaderWrapper : DataConvertor<DBDataReaderWrapper>,
IDisposable, IhasIndexer
{
SqlDataReader reader;
public DBDataReaderWrapper(SqlDataReader reader)
{
Initialise(this);
this.reader = reader;
}
public object this[string name]
{
get
{
return reader[name];
}
}
public bool Read()
{
return reader.Read();
}
public bool NextResult()
{
return reader.NextResult();
}
public void Dispose()
{
reader.Close();
reader.Dispose();
}
}
}
問題は、ヘルパー クラスを使用してデータベースから画像を読み取る方法です。のように DataConverter を追加したい
public DataConvertorField<byte[], T> Bytes;
および Initialise() メソッドで
Bytes = new DataConvertorField<byte[]>(reader, Convert.to??????);
どうすればこれを達成できますか? 私のニーズに合わせて利用できるc#組み込みまたはヘルパーメソッドはありますか? だから私はADO.Netコードのようなものを使うことができます
reader.Bytes["UserImage"]; //use custom data covertor and gives bytes[]