Skip to content

Instantly share code, notes, and snippets.

@smoothdeveloper
Last active August 29, 2015 13:56
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save smoothdeveloper/0c5c0f6bbdad8b3b18af to your computer and use it in GitHub Desktop.
Save smoothdeveloper/0c5c0f6bbdad8b3b18af to your computer and use it in GitHub Desktop.
Npgsql datatable serializer
private void serializeDataTable(NpgsqlCopySerializer serializer, DataTable datatable, string[] columnNamesInFixedOrder)
{
var serializeRow = new List<Action<DataRow>>();
var serializeByType = new Dictionary<Type, Action<object>>();
serializeByType[typeof (bool)] = (o => { if (o == null) serializer.AddNull(); else serializer.AddBool((bool)o); });
serializeByType[typeof (string)] = (o => { if (o == null) serializer.AddNull(); else serializer.AddString((string)o); });
serializeByType[typeof (DateTime)] = (o => { if (o == null) serializer.AddNull(); else serializer.AddDateTime((DateTime)o); });
serializeByType[typeof(byte)] = (o => { if (o == null) serializer.AddNull(); else serializer.AddInt32((byte)o); });
serializeByType[typeof (int)] = (o => { if (o == null) serializer.AddNull(); else serializer.AddInt32((int)o); });
serializeByType[typeof (long)] = (o => { if (o == null) serializer.AddNull(); else serializer.AddInt64((long)o); });
serializeByType[typeof (double)] = (o => { if (o == null) serializer.AddNull(); else serializer.AddNumber((double)o); });
serializeByType[typeof (decimal)] = (o => { if (o == null) serializer.AddNull(); else serializer.AddNumber((double)(decimal)o); });
serializeByType[typeof (float)] = (o => { if (o == null) serializer.AddNull(); else serializer.AddNumber((double)(float)o); });
foreach (var column in columnNamesInFixedOrder)
{
var c = column;
var type = datatable.Columns[c].DataType;
serializeRow.Add(row => serializeByType[type](row.IsNull(c) ? null : row[c]));
}
foreach (DataRow row in datatable.Rows)
{
serializeRow.ForEach(action => action(row));
serializer.EndRow();
serializer.Flush();
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment