System.Data.ProviderBase.AbstractDataReader.GetSchemaTable C# (CSharp) Method

GetSchemaTable() public method

public GetSchemaTable ( ) : DataTable
return System.Data.DataTable
		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;
		}