in EsentInteropSamples/DbUtil/DumpToCsv.cs [91:190]
private void DumpToCsv(string[] args)
{
if (args.Length != 2)
{
throw new ArgumentException("specify the database and table", "args");
}
string database = args[0];
string tableName = args[1];
const string Comma = ",";
using (var instance = new Instance("dumptocsv"))
{
instance.Parameters.Recovery = false;
instance.Init();
using (var session = new Session(instance))
{
JET_DBID dbid;
Api.JetAttachDatabase(session, database, AttachDatabaseGrbit.ReadOnly);
Api.JetOpenDatabase(session, database, null, out dbid, OpenDatabaseGrbit.ReadOnly);
var columnFormatters = new List<Func<JET_SESID, JET_TABLEID, string>>();
var columnNames = new List<string>();
foreach (ColumnInfo column in Api.GetTableColumns(session, dbid, tableName))
{
columnNames.Add(column.Name);
// create a local variable that will be captured by the lambda functions below
JET_COLUMNID columnid = column.Columnid;
switch (column.Coltyp)
{
case JET_coltyp.Bit:
columnFormatters.Add((s, t) => string.Format("{0}", Api.RetrieveColumnAsBoolean(s, t, columnid)));
break;
case VistaColtyp.LongLong:
case JET_coltyp.Currency:
columnFormatters.Add((s, t) => string.Format("{0}", Api.RetrieveColumnAsInt64(s, t, columnid)));
break;
case JET_coltyp.IEEEDouble:
columnFormatters.Add((s, t) => string.Format("{0}", Api.RetrieveColumnAsDouble(s, t, columnid)));
break;
case JET_coltyp.IEEESingle:
columnFormatters.Add((s, t) => string.Format("{0}", Api.RetrieveColumnAsFloat(s, t, columnid)));
break;
case JET_coltyp.Long:
columnFormatters.Add((s, t) => string.Format("{0}", Api.RetrieveColumnAsInt32(s, t, columnid)));
break;
case JET_coltyp.Text:
case JET_coltyp.LongText:
Encoding encoding = (column.Cp == JET_CP.Unicode) ? Encoding.Unicode : Encoding.ASCII;
columnFormatters.Add((s, t) => string.Format("{0}", Api.RetrieveColumnAsString(s, t, columnid, encoding)));
break;
case JET_coltyp.Short:
columnFormatters.Add((s, t) => string.Format("{0}", Api.RetrieveColumnAsInt16(s, t, columnid)));
break;
case JET_coltyp.UnsignedByte:
columnFormatters.Add((s, t) => string.Format("{0}", Api.RetrieveColumnAsByte(s, t, columnid)));
break;
case JET_coltyp.DateTime:
columnFormatters.Add((s, t) => string.Format("{0}", Api.RetrieveColumnAsDateTime(s, t, columnid)));
break;
case VistaColtyp.UnsignedShort:
columnFormatters.Add((s, t) => string.Format("{0}", Api.RetrieveColumnAsUInt16(s, t, columnid)));
break;
case VistaColtyp.UnsignedLong:
columnFormatters.Add((s, t) => string.Format("{0}", Api.RetrieveColumnAsUInt32(s, t, columnid)));
break;
case VistaColtyp.GUID:
columnFormatters.Add((s, t) => string.Format("{0}", Api.RetrieveColumnAsGuid(s, t, columnid)));
break;
case JET_coltyp.Binary:
case JET_coltyp.LongBinary:
default:
columnFormatters.Add((s, t) => Dbutil.FormatBytes(Api.RetrieveColumn(s, t, columnid)));
break;
}
}
Console.WriteLine(string.Join(Comma, columnNames.ToArray()));
using (var table = new Table(session, dbid, tableName, OpenTableGrbit.ReadOnly))
{
Api.JetSetTableSequential(session, table, SetTableSequentialGrbit.None);
Api.MoveBeforeFirst(session, table);
while (Api.TryMoveNext(session, table))
{
IEnumerable<string> columnData = from formatter in columnFormatters
select Dbutil.QuoteForCsv(formatter(session, table));
Console.WriteLine(string.Join(Comma, columnData.ToArray()));
}
Api.JetResetTableSequential(session, table, ResetTableSequentialGrbit.None);
}
}
}
}