public override DataTable GetSchemaTable()
{
if (SchemaTable.Rows != null && SchemaTable.Rows.Count > 0) {
return SchemaTable;
}
ResultSetMetaData metaData;
if (Behavior == CommandBehavior.SchemaOnly) {
try {
metaData = ((PreparedStatement)_command.Statement).getMetaData();
}
catch(SQLException e) {
throw CreateException("CommandBehaviour.SchemaOnly is not supported by the JDBC driver.",e);
}
}
else {
metaData = ResultsMetaData;
}
if (metaData == null) {
return SchemaTable;
}
DatabaseMetaData dbMetaData = null;
AbstractDBConnection clonedConnection = null;
if ((_command.Behavior & CommandBehavior.KeyInfo) != 0) {
clonedConnection = (AbstractDBConnection)((ICloneable)_command.Connection).Clone();
try {
clonedConnection.Open();
dbMetaData = clonedConnection.JdbcConnection.getMetaData();
}
catch {
//suppress
if (clonedConnection != null) {
clonedConnection.Close();
}
}
}
try {
int tmp;
for(int i = 1; i <= metaData.getColumnCount(); i++) {
DataRow row = SchemaTable.NewRow ();
string columnName = metaData.getColumnLabel(i);
string baseColumnName = metaData.getColumnName(i);
row [(int)SCHEMA_TABLE.ColumnName] = columnName; // maybe we should use metaData.getColumnLabel(i);
row [(int)SCHEMA_TABLE.ColumnSize] = metaData.getColumnDisplaySize(i);
row [(int)SCHEMA_TABLE.ColumnOrdinal] = i - 1;
try {
// FIXME : workaround for Oracle JDBC driver bug
// getPrecision on BLOB, CLOB, NCLOB throws NumberFormatException
tmp = metaData.getPrecision(i);
}
catch(java.lang.NumberFormatException e) {
// supress exception
tmp = 255;
}
row [(int)SCHEMA_TABLE.NumericPrecision] = Convert.ToInt16(tmp > 255 ? 255 : tmp);
tmp = metaData.getScale(i);
row [(int)SCHEMA_TABLE.NumericScale] = Convert.ToInt16(tmp > 255 ? 255 : tmp);
row [(int)SCHEMA_TABLE.BaseServerName] = DBNull.Value;
string catalog = null;
try {
catalog = metaData.getCatalogName(i);
}
catch (Exception e) {
// supress exception
}
if (catalog != null && catalog.Length == 0)
catalog = ((AbstractDBConnection)_command.Connection).JdbcConnection.getCatalog();
row [(int)SCHEMA_TABLE.BaseCatalogName] = catalog;
row [(int)SCHEMA_TABLE.BaseColumnName] = baseColumnName;
string schemaName;
string tableName;
try {
tableName = metaData.getTableName(i);
}
catch {
tableName = null;
}
try {
schemaName = metaData.getSchemaName(i);
}
catch {
schemaName = null;
}
if (tableName != null && tableName.Length == 0)
tableName = null;
if (schemaName != null && schemaName.Length == 0)
schemaName = null;
row [(int)SCHEMA_TABLE.BaseSchemaName] = schemaName;
row [(int)SCHEMA_TABLE.BaseTableName] = tableName;
row [(int)SCHEMA_TABLE.AllowDBNull] = Convert.ToBoolean(metaData.isNullable(i));
InitKeyInfo(row, dbMetaData, catalog, schemaName, tableName);
row [(int)SCHEMA_TABLE.IsAliased] = columnName != baseColumnName;
row [(int)SCHEMA_TABLE.IsExpression] = false;
row [(int)SCHEMA_TABLE.IsAutoIncrement] = metaData.isAutoIncrement(i);
row [(int)SCHEMA_TABLE.IsHidden] = false;
row [(int)SCHEMA_TABLE.IsReadOnly] = metaData.isReadOnly(i);
SetSchemaType(row, metaData, i);
SchemaTable.Rows.Add (row);
}
}
catch (SQLException e) {
throw CreateException(e);
}
finally {
if (clonedConnection != null) {
clonedConnection.Close();
}
}
return SchemaTable;
}