by Suat TUNCER
11. August 2009 16:42
Geçenlerde bir öğrencimden mail aldım, mailde bir konudan yakınıyordu, diyordu ki;
"Merhaba Hocam,
Küçük bir projeye başladım ve bu projede ORM araçlarını kullanmak yerine ADO.Net ile yazmak istedim fakat DataReader ile veri okurken verinin null olup olmadığını kontrol etmekten uygun tiplere dönüştürmekten sıkıldım bu işin pratik bir yolu var mıdır?"
.Net ile heleki C# ile uygulama geliştiriyorsanız, mutlaka her şeyin bir pratik yolu vardır, şöyleki;
static bir sınıf içerisine aşağıdaki gibi bir methodu ekleyin.
public T ReadField<T>(OracleDataReader reader, string columnName) {
object value = reader[columnName];
Type targetType = typeof(T);
if (Convert.IsDBNull(value)) {
if (targetType == typeof(string))
return (T)Convert.ChangeType(String.Empty, typeof(string));
return default(T);
}
else {
targetType = Nullable.GetUnderlyingType(targetType);
if (targetType == null)
targetType = typeof(T);
return (T)Convert.ChangeType(value, targetType);
}
}
çağırırken ise, aşağıdaki gibi kullanmak yetecektir.
OracleConnection connection = new OracleConnection("ConnectionString");
OracleCommand command = connection.CreateCommand();
command.CommandText = "SELECT * FROM SourceTable";
command.Connection.Open();
OracleDataReader reader = command.ExecuteReader();
IList<Product> list = new List<Product>();
Product item = null;
while (reader.Read()) {
item = new Products();
item.ID = ReadField<int>(reader, "ID");
item.Quantity = ReadField<string>(reader, "Quantity");
item.UnitPrice = ReadField<decimal>(reader, "UnitPrice");
item.Description = ReadField<string>(reader, "Description");
}
command.Connection.Close();
NOT : beklenmeyen tip dönüşümlerinde kodun çatlamasını istemiyorsanız try catch kullanabilirsiniz.
Edit : Method Nullable tiplerle de çalışacak şekilde güncellendi.