Many a times, I have seen that people end up writing lot of codes to read from SQL data reader or there is no fail safe mechanism to handle, if parse fails out.
I have tried with integer, string and double in similar way other types of variable can be used as well.
If we want to skip rows on failure of any parse, then we could use:
That is all we need for parsing. The single DbTryParse is taking care of every possible parses.
Let's look into the implementation part. If we see all TryParse from .Net they accept string as first parameter and then the out parameter to parse value. For that a TryParseHandler<T> delegate wrapper is created. The generic parse functions are restricted with struct type which takes care of value type. The same function is overloaded to handle string type.
Here are codes:
Source: http://www.mindfiresolutions.com/Database-Reader-Object-Parsing-in-NET-2673.php
In this article, I will try to cover up above issue and implement uniform way to handle things with fail safe mechanism using TryParse approach. Mainly, I will extend inbuilt try parse mechanism comes with .Net. Int.TryParse and similar type of methods was introduced in 2.0 Framework, so the code should be compatible with 2.0 or higher framework.
Let's directly dive into usage since we have just single function DbTryParse. I will be explaining function on later stage.
We can use with fail safe mechanism where some values are not properly parsed then row will get skipped or in normal way, we define some default value and move ahead with other rows.
int id;
string val;
double dbl;
reader["id"].DbTryParse(out id, int.TryParse, 89);
reader["val"].DbTryParse(out val, "NA");
reader["doubleTest"].DbTryParse(out dbl, double.TryParse);
I have tried with integer, string and double in similar way other types of variable can be used as well.
In this, I am reading integer Id column and sending logic for parsing with int.TryParse. If parse fails then it will set 100 as a default, this is optional parameter. Check out double parsing where we are not setting the default value.
Since we do not have inbuilt function like TryParse for string and it's a reference type. There is no need of handler and it is implemented in different way that we will see it later.
reader["val"].DbTryParse(out val, "NA");
If we want to skip rows on failure of any parse, then we could use:
if (reader["id"].DbTryParse(out id, int.TryParse) &&
reader["val"].DbTryParse(out val) &&
reader["doubleTest"].DbTryParse(out dbl, double.TryParse))
{
Console.WriteLine("Parsing successful");
}
else
{
Console.WriteLine("Parsing failed.");
}
That is all we need for parsing. The single DbTryParse is taking care of every possible parses.
Let's look into the implementation part. If we see all TryParse from .Net they accept string as first parameter and then the out parameter to parse value. For that a TryParseHandler<T> delegate wrapper is created. The generic parse functions are restricted with struct type which takes care of value type. The same function is overloaded to handle string type.
Here are codes:
public static class CommonExtensionMethods
{
/// <summary>
/// Try parse handler
/// </summary>
/// <typeparam name="T">The result type</typeparam>
/// <param name="value">The string literal.</param>
/// <param name="result">The result of typecasting.</param>
/// <returns>True, if typecasting is successful, else false.</returns>
public delegate bool TryParseHandler<T>(string value, out T result);
/// <summary>
/// Generic try parse.
/// </summary>
/// <typeparam name="T">Type of the value</typeparam>
/// <param name="value">The string literal.</param>
/// <param name="parsedValue">The parsed value.</param>
/// <param name="handler">The type casting handler.</param>
/// <param name="defaultValue">The default value. This value will be set in case of failed parsing.</param>
/// <returns>Parsed object</returns>
/// <exception cref="System.ArgumentNullException">handler</exception>
public static bool TryParse<T>(this string value, out T parsedValue, TryParseHandler<T> handler,
T defaultValue = default(T))
where T : struct
{
if (handler == null)
{
throw new ArgumentNullException("handler");
}
if (String.IsNullOrEmpty(value))
{
parsedValue = defaultValue;
return false;
}
return handler(value, out parsedValue);
}
/// <summary>
/// Generic try parse for databases object.
/// </summary>
/// <typeparam name="T">The type of object for parsing value</typeparam>
/// <param name="val">The value.</param>
/// <param name="parsedValue">The parsed value.</param>
/// <param name="handler">The parsing handler.</param>
/// <param name="defaultValue">The default value. This value will be set in case of failed parsing.</param>
/// <returns>
/// Parsed object
/// </returns>
public static bool DbTryParse<T>(this object val, out T parsedValue, TryParseHandler<T> handler
, T defaultValue = default(T))
where T : struct
{
if (val == DBNull.Value)
{
parsedValue = defaultValue;
return false;
}
return Convert.ToString(val).TryParse(out parsedValue, handler, defaultValue);
}
/// <summary>
/// Databases object parsing to string.
/// </summary>
/// <param name="val">The value.</param>
/// <param name="parsedValue">The parsed value.</param>
/// <param name="defaultValue">The default value. This value will be set in case of failed parsing.</param>
/// <returns>String representation of parsed object</returns>
public static bool DbTryParse(this object val, out string parsedValue
, string defaultValue = null)
{
if (val == DBNull.Value)
{
parsedValue = defaultValue;
return false;
}
parsedValue = Convert.ToString(val) ?? defaultValue;
return parsedValue == defaultValue ? false : true;
}
/// <summary>
/// Databases object parsing to string.
/// </summary>
/// <param name="val">The value.</param>
/// <param name="defaultValue">The default value. This value will be set in case of failed parsing.</param>
/// <returns>String representation of given object</returns>
public static string DbParse(this object val, string defaultValue = null)
{
return val == DBNull.Value ? defaultValue : Convert.ToString(val) ?? defaultValue;
}
}
Source: http://www.mindfiresolutions.com/Database-Reader-Object-Parsing-in-NET-2673.php
Comments
Post a Comment