public virtual string SerializeDbData(Func <string, bool> tableNamePredicate = null) { var tables = this.DbInspector.GetTables(true, tableNamePredicate); var dbData = new DynamicRow(); // it is strange to store entire data in 'dynamic' 'row', but why to invent new dynamic ancestor? using (var command = this.Connection.CreateCommand()) { foreach (var table in tables) { var sql = this.Cruder.ScriptBuilder.BuildSelectAllScript(table); command.CommandText = sql; var rows = DbUtils .GetCommandRows(command); dbData.SetValue(table.Name, rows); } } var json = JsonConvert.SerializeObject(dbData, Formatting.Indented); return(json); }
public static IList <dynamic> GetCommandRows(IDbCommand command, ITableValuesConverter tableValuesConverter = null) { if (command == null) { throw new ArgumentNullException(nameof(command)); } if (command == null) { throw new ArgumentNullException(nameof(command)); } using (var reader = command.ExecuteReader()) { var rows = new List <dynamic>(); while (reader.Read()) { var row = new DynamicRow(true); for (var i = 0; i < reader.FieldCount; i++) { var name = reader.GetName(i); var value = reader[i]; if (tableValuesConverter == null) { // only simplest obvious transformation if (value == DBNull.Value) { value = null; } } else { var dbValueConverter = tableValuesConverter.GetColumnConverter(name); var convertedValue = dbValueConverter.FromDbValue(value); if (convertedValue == DBNull.Value) { throw new NotImplementedException(); // error in your converter logic. } if (convertedValue == null && value != DBNull.Value) { // the only case IDbValueConverter.FromDbValue returns null is value equal to DBNull.Value. throw new NotImplementedException(); } value = convertedValue; } row.SetValue(name, value); } rows.Add(row); } return(rows); } }