Skip to content

Instantly share code, notes, and snippets.

@mahmut-gundogdu
Last active August 29, 2015 14:04
Show Gist options
  • Save mahmut-gundogdu/4fd2172671977d06f17d to your computer and use it in GitHub Desktop.
Save mahmut-gundogdu/4fd2172671977d06f17d to your computer and use it in GitHub Desktop.
SqlDataReader ve null gelen veri sorununa prait çözümler. Çözüm 1: SqlDataReader için generic extension olusturulur. Çözüm 2: de bir static fonksiyon olusturulur. Bu fonksiyon null ile default değeri gönderir yoksa convert ederek verir.Convert.ToInt32() yerine düşünün. Çözüm 3: c# ?? operatörü.
//Kaynak: http://stackoverflow.com/questions/18550769/sqldatareader-best-way-to-check-for-null-values-sqldatareader-isdbnull-vs-dbnul
using System;
using System.ComponentModel;
using System.Data.SqlClient;
public static class SqlReaderHelper
{
private static bool IsNullableType(Type theValueType)
{
return (theValueType.IsGenericType && theValueType.GetGenericTypeDefinition().Equals(typeof(Nullable<>)));
}
/// <summary>
/// Returns the value, of type T, from the SqlDataReader, accounting for both generic and non-generic types.
/// </summary>
/// <typeparam name="T">T, type applied</typeparam>
/// <param name="theReader">The SqlDataReader object that queried the database</param>
/// <param name="theColumnName">The column of data to retrieve a value from</param>
/// <returns>T, type applied; default value of type if database value is null</returns>
public static T GetValue<T>(this SqlDataReader theReader, string theColumnName)
{
// Read the value out of the reader by string (column name); returns object
object theValue = theReader[theColumnName];
// Cast to the generic type applied to this method (i.e. int?)
Type theValueType = typeof(T);
// Check for null value from the database
if (DBNull.Value != theValue)
{
// We have a null, do we have a nullable type for T?
if (!IsNullableType(theValueType))
{
// No, this is not a nullable type so just change the value's type from object to T
return (T)Convert.ChangeType(theValue, theValueType);
}
else
{
// Yes, this is a nullable type so change the value's type from object to the underlying type of T
NullableConverter theNullableConverter = new NullableConverter(theValueType);
return (T)Convert.ChangeType(theValue, theNullableConverter.UnderlyingType);
}
}
// The value was null in the database, so return the default value for T; this will vary based on what T is (i.e. int has a default of 0)
return default(T);
}
}
//yourSqlReaderObject.GetValue<int?>("SOME_ID_COLUMN");
//yourSqlReaderObject.GetValue<string>("SOME_VALUE_COLUMN");
//Diyerek de kullanabiliriz.
//Kaynak: http://stackoverflow.com/questions/17509144/how-to-get-null-values-in-sqldatareader
private static T GetValue<T>(object value)
{
return value == DBNull.Value
? default(T)
: (T) Convert.ChangeType(value, typeof(T));
}
// s.id = GetValue<long>(reader["so_id"]);
// s.senderid = GetValue<long>(reader["so_senderid"]);
// Diyerek de bunu kullanabilrisiniz.
//Kaynak: http://msdn.microsoft.com/en-us/library/ms173224.aspx
int? x = null;
// Set y to the value of x if x is NOT null; otherwise,
// if x = null, set y to -1.
int y = x ?? -1;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment