public override DataTable GetColumns() { var dataTable = SchemaTables.GetColumnsDataTable(); // There is no way to get the scale of a decimal with DAO. Looks like someone at Microsoft just forgot to // implement it. // Therefore, either ADO has to be used, or DAO together with the GetSchema() // method (that contains precision and scale, but no default value when using ODBC, because again, looks // like someone at Microsoft just forgot to implement it). Dictionary <(string TableName, string ColumnName), int?> numericScales = null; if (!_naturalOnly) { var schemaTable = _connection.InnerConnection.GetSchema("Columns"); numericScales = schemaTable.Rows .Cast <DataRow>() .ToDictionary( t => (TableName: (string)t["TABLE_NAME"], ColumnName: (string)t["COLUMN_NAME"]), t => t.Table.Columns.Contains("DECIMAL_DIGITS") ? t["DECIMAL_DIGITS"] != DBNull.Value ? (int?)(short?)t["DECIMAL_DIGITS"] : null : t["NUMERIC_SCALE"] != DBNull.Value ? (int?)(short?)t["NUMERIC_SCALE"] : null); } var objectDefsCollection = new[]
public override DataTable GetColumns() { var dataTable = SchemaTables.GetColumnsDataTable(); // There is no way to get the ordinal position of a column with ADOX. Looks like someone at Microsoft just forgot to // implement it. // Therefore, either DAO has to be used, or ADOX together with the OpenSchema() // method. Dictionary <(string TableName, string ColumnName), int> ordinalPositions = null; if (!_naturalOnly) { using (var recordset = _connection.OpenSchema(SchemaEnum.adSchemaColumns)) { ordinalPositions = new Dictionary <(string TableName, string ColumnName), int>(); using var fields = recordset.Fields; using var tableNameField = fields["TABLE_NAME"]; using var columnNameField = fields["COLUMN_NAME"]; using var ordinalPositionField = fields["ORDINAL_POSITION"]; recordset.MoveFirst(); while (!recordset.EOF) { var tableName = (string)tableNameField.Value; var columnName = (string)columnNameField.Value; var ordinalPosition = (int)ordinalPositionField.Value - 1; ordinalPositions.Add((tableName, columnName), ordinalPosition); recordset.MoveNext(); } recordset.Close(); } } using var tables = _catalog.Tables; var tableCount = tables.Count; for (var i = 0; i < tableCount; i++) { using var table = tables[i]; var tableName = (string)table.Name; using var columns = table.Columns; var columnCount = columns.Count; for (var j = 0; j < columnCount; j++) { using var column = columns[j]; using var properties = column.Properties; var columnName = (string)column.Name; var attributes = (ColumnAttributesEnum)column.Attributes; var ordinalPosition = ordinalPositions?[(tableName, columnName)] ?? j;