private static string GetValue(IDataParameter parameter)
{
object rawValue = parameter.Value;
if (rawValue is DataTable)
{
var rows = new List<List<string>>();
foreach (DataRow row in ((DataTable)rawValue).Select())
{
var colValues = new List<string>();
foreach (DataColumn col in row.Table.Columns)
{
colValues.Add((row[col] == DBNull.Value || row[col] == null) ? "NULL" : row[col].ToString());
}
rows.Add(colValues);
}
return rows.ToJson();
}
if (rawValue == null || rawValue == DBNull.Value)
{
return null;
}
// This assumes that all SQL variants use the same parameter format, it works for T-SQL
if (parameter.DbType == DbType.Binary)
{
var bytes = rawValue as byte[];
if (bytes != null && bytes.Length <= MaxByteParameterSize)
{
return "0x" + BitConverter.ToString(bytes).Replace("-", string.Empty);
}
// Parameter is too long, so blank it instead
return null;
}
if (rawValue is DateTime)
{
return ((DateTime)rawValue).ToString("s", System.Globalization.CultureInfo.InvariantCulture);
}
// we want the integral value of an enum, not its string representation
var rawType = rawValue.GetType();
if (rawType.IsEnum)
{
// use ChangeType, as we can't cast - http://msdn.microsoft.com/en-us/library/exx3b86w(v=vs.80).aspx
return Convert.ChangeType(rawValue, Enum.GetUnderlyingType(rawType)).ToString();
}
return rawValue.ToString();
}