|
|
@@ -57,7 +57,7 @@ namespace System.Data.ProviderBase
|
|
|
[Flags]
|
|
|
private enum ReaderState { Uninitialized = 0, Empty = 1, HasRows = 2, FirstRed = 4, Eof = 8, Fetching = 16 };
|
|
|
|
|
|
- internal enum SCHEMA_TABLE { ColumnName,
|
|
|
+ protected internal enum SCHEMA_TABLE { ColumnName,
|
|
|
ColumnOrdinal,
|
|
|
ColumnSize,
|
|
|
NumericPrecision,
|
|
|
@@ -743,107 +743,88 @@ namespace System.Data.ProviderBase
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ protected virtual IReaderCacheContainer CreateReaderCacheContainer(int jdbcType, int columnIndex) {
|
|
|
+ switch ((DbConvert.JavaSqlTypes)jdbcType) {
|
|
|
+ case DbConvert.JavaSqlTypes.ARRAY :
|
|
|
+ return new ArrayReaderCacheContainer();
|
|
|
+ case DbConvert.JavaSqlTypes.BIGINT :
|
|
|
+ return new Int64ReaderCacheContainer();
|
|
|
+ case DbConvert.JavaSqlTypes.BINARY :
|
|
|
+ case DbConvert.JavaSqlTypes.VARBINARY :
|
|
|
+ case DbConvert.JavaSqlTypes.LONGVARBINARY :
|
|
|
+ return new BytesReaderCacheContainer();
|
|
|
+ case DbConvert.JavaSqlTypes.BIT :
|
|
|
+ return new BooleanReaderCacheContainer();
|
|
|
+ case DbConvert.JavaSqlTypes.BLOB :
|
|
|
+ return new BlobReaderCacheContainer();
|
|
|
+ case DbConvert.JavaSqlTypes.CHAR :
|
|
|
+ if (String.CompareOrdinal("uniqueidentifier", ResultsMetaData.getColumnTypeName(columnIndex)) == 0) {
|
|
|
+ return new GuidReaderCacheContainer();
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ return new StringReaderCacheContainer();
|
|
|
+ }
|
|
|
+ case DbConvert.JavaSqlTypes.CLOB :
|
|
|
+ return new ClobReaderCacheContainer();
|
|
|
+ case DbConvert.JavaSqlTypes.TIME :
|
|
|
+ return new TimeSpanReaderCacheContainer();
|
|
|
+ case DbConvert.JavaSqlTypes.DATE :
|
|
|
+ AbstractDBConnection conn = (AbstractDBConnection)((ICloneable)_command.Connection);
|
|
|
+ string driverName = conn.JdbcConnection.getMetaData().getDriverName();
|
|
|
+
|
|
|
+ if (driverName.StartsWith("PostgreSQL")) {
|
|
|
+ return new DateTimeReaderCacheContainer();
|
|
|
+ }
|
|
|
+ else
|
|
|
+ goto case DbConvert.JavaSqlTypes.TIMESTAMP;
|
|
|
+ case DbConvert.JavaSqlTypes.TIMESTAMP :
|
|
|
+ return new TimestampReaderCacheContainer();
|
|
|
+ case DbConvert.JavaSqlTypes.DECIMAL :
|
|
|
+ case DbConvert.JavaSqlTypes.NUMERIC :
|
|
|
+ // jdbc driver for oracle identitfies both FLOAT and NUMBEr columns as
|
|
|
+ // java.sql.Types.NUMERIC (2), columnTypeName NUMBER, columnClassName java.math.BigDecimal
|
|
|
+ // therefore we relay on scale
|
|
|
+ int scale = ResultsMetaData.getScale(columnIndex);
|
|
|
+ if (scale == -127) {
|
|
|
+ // Oracle db type FLOAT
|
|
|
+ return new DoubleReaderCacheContainer();
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ return new DecimalReaderCacheContainer();
|
|
|
+ }
|
|
|
+ case DbConvert.JavaSqlTypes.DOUBLE :
|
|
|
+ case DbConvert.JavaSqlTypes.FLOAT :
|
|
|
+ return new DoubleReaderCacheContainer();
|
|
|
+ case DbConvert.JavaSqlTypes.INTEGER :
|
|
|
+ return new Int32ReaderCacheContainer();
|
|
|
+ case DbConvert.JavaSqlTypes.LONGVARCHAR :
|
|
|
+ case DbConvert.JavaSqlTypes.VARCHAR :
|
|
|
+ return new StringReaderCacheContainer();
|
|
|
+ case DbConvert.JavaSqlTypes.NULL :
|
|
|
+ return new NullReaderCacheContainer();
|
|
|
+ case DbConvert.JavaSqlTypes.REAL :
|
|
|
+ return new FloatReaderCacheContainer();
|
|
|
+ case DbConvert.JavaSqlTypes.REF :
|
|
|
+ return new RefReaderCacheContainer();
|
|
|
+ case DbConvert.JavaSqlTypes.SMALLINT :
|
|
|
+ return new Int16ReaderCacheContainer();
|
|
|
+ case DbConvert.JavaSqlTypes.TINYINT :
|
|
|
+ return new ByteReaderCacheContainer();
|
|
|
+ case DbConvert.JavaSqlTypes.DISTINCT :
|
|
|
+ case DbConvert.JavaSqlTypes.JAVA_OBJECT :
|
|
|
+ case DbConvert.JavaSqlTypes.OTHER :
|
|
|
+ case DbConvert.JavaSqlTypes.STRUCT :
|
|
|
+ default :
|
|
|
+ return new ObjectReaderCacheContainer();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
private IReaderCacheContainer[] CreateReaderCache()
|
|
|
{
|
|
|
try {
|
|
|
IReaderCacheContainer[] readerCache = new IReaderCacheContainer[FieldCount];
|
|
|
- for(int i=0; i < readerCache.Length; i++) {
|
|
|
- DbConvert.JavaSqlTypes javaSqlType = (DbConvert.JavaSqlTypes) ResultsMetaData.getColumnType(i + 1);
|
|
|
- switch (javaSqlType) {
|
|
|
- case DbConvert.JavaSqlTypes.ARRAY :
|
|
|
- readerCache[i] = new ArrayReaderCacheContainer();
|
|
|
- break;
|
|
|
- case DbConvert.JavaSqlTypes.BIGINT :
|
|
|
- readerCache[i] = new Int64ReaderCacheContainer();
|
|
|
- break;
|
|
|
- case DbConvert.JavaSqlTypes.BINARY :
|
|
|
- case DbConvert.JavaSqlTypes.VARBINARY :
|
|
|
- case DbConvert.JavaSqlTypes.LONGVARBINARY :
|
|
|
- readerCache[i] = new BytesReaderCacheContainer();
|
|
|
- break;
|
|
|
- case DbConvert.JavaSqlTypes.BIT :
|
|
|
- readerCache[i] = new BooleanReaderCacheContainer();
|
|
|
- break;
|
|
|
- case DbConvert.JavaSqlTypes.BLOB :
|
|
|
- readerCache[i] = new BlobReaderCacheContainer();
|
|
|
- break;
|
|
|
- case DbConvert.JavaSqlTypes.CHAR :
|
|
|
- if ("uniqueidentifier".Equals(ResultsMetaData.getColumnTypeName(i + 1))) {
|
|
|
- readerCache[i] = new GuidReaderCacheContainer();
|
|
|
- }
|
|
|
- else {
|
|
|
- readerCache[i] = new StringReaderCacheContainer();
|
|
|
- }
|
|
|
- break;
|
|
|
- case DbConvert.JavaSqlTypes.CLOB :
|
|
|
- readerCache[i] = new ClobReaderCacheContainer();
|
|
|
- break;
|
|
|
- case DbConvert.JavaSqlTypes.TIME :
|
|
|
- readerCache[i] = new TimeSpanReaderCacheContainer();
|
|
|
- break;
|
|
|
- case DbConvert.JavaSqlTypes.DATE :
|
|
|
- AbstractDBConnection conn = (AbstractDBConnection)((ICloneable)_command.Connection);
|
|
|
- string driverName = conn.JdbcConnection.getMetaData().getDriverName();
|
|
|
-
|
|
|
- if (driverName.StartsWith("PostgreSQL")) {
|
|
|
- readerCache[i] = new DateTimeReaderCacheContainer();
|
|
|
- break;
|
|
|
- }
|
|
|
- else
|
|
|
- goto case DbConvert.JavaSqlTypes.TIMESTAMP;
|
|
|
- case DbConvert.JavaSqlTypes.TIMESTAMP :
|
|
|
- readerCache[i] = new TimestampReaderCacheContainer();
|
|
|
- break;
|
|
|
- case DbConvert.JavaSqlTypes.DECIMAL :
|
|
|
- case DbConvert.JavaSqlTypes.NUMERIC :
|
|
|
- // jdbc driver for oracle identitfies both FLOAT and NUMBEr columns as
|
|
|
- // java.sql.Types.NUMERIC (2), columnTypeName NUMBER, columnClassName java.math.BigDecimal
|
|
|
- // therefore we relay on scale
|
|
|
- int scale = ResultsMetaData.getScale(i + 1);
|
|
|
- if (scale == -127) {
|
|
|
- // Oracle db type FLOAT
|
|
|
- readerCache[i] = new DoubleReaderCacheContainer();
|
|
|
- }
|
|
|
- else {
|
|
|
- readerCache[i] = new DecimalReaderCacheContainer();
|
|
|
- }
|
|
|
- break;
|
|
|
- case DbConvert.JavaSqlTypes.DOUBLE :
|
|
|
- case DbConvert.JavaSqlTypes.FLOAT :
|
|
|
- readerCache[i] = new DoubleReaderCacheContainer();
|
|
|
- break;
|
|
|
- case DbConvert.JavaSqlTypes.INTEGER :
|
|
|
- readerCache[i] = new Int32ReaderCacheContainer();
|
|
|
- break;
|
|
|
- case DbConvert.JavaSqlTypes.LONGVARCHAR :
|
|
|
- case DbConvert.JavaSqlTypes.VARCHAR :
|
|
|
- readerCache[i] = new StringReaderCacheContainer();
|
|
|
- break;
|
|
|
- case DbConvert.JavaSqlTypes.NULL :
|
|
|
- readerCache[i] = new NullReaderCacheContainer();
|
|
|
- break;
|
|
|
- case DbConvert.JavaSqlTypes.REAL :
|
|
|
- readerCache[i] = new FloatReaderCacheContainer();
|
|
|
- break;
|
|
|
- case DbConvert.JavaSqlTypes.REF :
|
|
|
- readerCache[i] = new RefReaderCacheContainer();
|
|
|
- break;
|
|
|
- case DbConvert.JavaSqlTypes.SMALLINT :
|
|
|
- readerCache[i] = new Int16ReaderCacheContainer();
|
|
|
- break;
|
|
|
- case DbConvert.JavaSqlTypes.TINYINT :
|
|
|
- readerCache[i] = new ByteReaderCacheContainer();
|
|
|
- break;
|
|
|
- case DbConvert.JavaSqlTypes.DISTINCT :
|
|
|
- case DbConvert.JavaSqlTypes.JAVA_OBJECT :
|
|
|
- case DbConvert.JavaSqlTypes.OTHER :
|
|
|
- case DbConvert.JavaSqlTypes.STRUCT :
|
|
|
- default :
|
|
|
- readerCache[i] = new ObjectReaderCacheContainer();
|
|
|
- break;
|
|
|
- }
|
|
|
- // ((ReaderCacheContainerBase)readerCache[i])._jdbcType = (int) javaSqlType;
|
|
|
- }
|
|
|
+ for(int i=1; i <= readerCache.Length; i++)
|
|
|
+ readerCache[i-1] = CreateReaderCacheContainer(ResultsMetaData.getColumnType(i), i);
|
|
|
|
|
|
return readerCache;
|
|
|
}
|
|
|
@@ -879,6 +860,200 @@ namespace System.Data.ProviderBase
|
|
|
throw new NotSupportedException();
|
|
|
}
|
|
|
|
|
|
+ protected virtual void SetSchemaType(DataRow schemaRow, ResultSetMetaData metaData, int columnIndex) {
|
|
|
+ DbConvert.JavaSqlTypes columnType = (DbConvert.JavaSqlTypes)metaData.getColumnType(columnIndex);
|
|
|
+
|
|
|
+ switch (columnType) {
|
|
|
+ case DbConvert.JavaSqlTypes.ARRAY: {
|
|
|
+ schemaRow [(int)SCHEMA_TABLE.ProviderType] = GetProviderType((int)columnType);
|
|
|
+ schemaRow [(int)SCHEMA_TABLE.DataType] = typeof (java.sql.Array);
|
|
|
+ schemaRow [(int)SCHEMA_TABLE.IsLong] = false;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ case DbConvert.JavaSqlTypes.BIGINT: {
|
|
|
+ schemaRow [(int)SCHEMA_TABLE.ProviderType] = GetProviderType((int)columnType);
|
|
|
+ schemaRow [(int)SCHEMA_TABLE.DataType] = DbTypes.TypeOfInt64;
|
|
|
+ schemaRow [(int)SCHEMA_TABLE.IsLong] = false;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ case DbConvert.JavaSqlTypes.BINARY: {
|
|
|
+ schemaRow [(int)SCHEMA_TABLE.ProviderType] = GetProviderType((int)columnType);
|
|
|
+ schemaRow [(int)SCHEMA_TABLE.DataType] = DbTypes.TypeOfByteArray;
|
|
|
+ schemaRow [(int)SCHEMA_TABLE.IsLong] = true;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ case DbConvert.JavaSqlTypes.BIT: {
|
|
|
+ schemaRow [(int)SCHEMA_TABLE.ProviderType] = GetProviderType((int)columnType);
|
|
|
+ schemaRow [(int)SCHEMA_TABLE.DataType] = DbTypes.TypeOfBoolean;
|
|
|
+ schemaRow [(int)SCHEMA_TABLE.IsLong] = false;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ case DbConvert.JavaSqlTypes.BLOB: {
|
|
|
+ schemaRow [(int)SCHEMA_TABLE.ProviderType] = GetProviderType((int)columnType);
|
|
|
+ schemaRow [(int)SCHEMA_TABLE.DataType] = DbTypes.TypeOfByteArray;
|
|
|
+ schemaRow [(int)SCHEMA_TABLE.IsLong] = true;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ case DbConvert.JavaSqlTypes.CHAR: {
|
|
|
+ // FIXME : specific for Microsoft SQl Server driver
|
|
|
+ if (metaData.getColumnTypeName(columnIndex).Equals("uniqueidentifier")) {
|
|
|
+ schemaRow [(int)SCHEMA_TABLE.ProviderType] = DbType.Guid;
|
|
|
+ schemaRow [(int)SCHEMA_TABLE.DataType] = DbTypes.TypeOfGuid;
|
|
|
+ schemaRow [(int)SCHEMA_TABLE.IsLong] = false;
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ schemaRow [(int)SCHEMA_TABLE.ProviderType] = GetProviderType((int)columnType);
|
|
|
+ schemaRow [(int)SCHEMA_TABLE.DataType] = DbTypes.TypeOfString;
|
|
|
+ schemaRow [(int)SCHEMA_TABLE.IsLong] = false;
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ case DbConvert.JavaSqlTypes.CLOB: {
|
|
|
+ schemaRow [(int)SCHEMA_TABLE.ProviderType] = GetProviderType((int)columnType);
|
|
|
+ schemaRow [(int)SCHEMA_TABLE.DataType] = DbTypes.TypeOfString; // instead og .java.sql.Clob
|
|
|
+ schemaRow [(int)SCHEMA_TABLE.IsLong] = true;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ case DbConvert.JavaSqlTypes.DATE: {
|
|
|
+ schemaRow [(int)SCHEMA_TABLE.ProviderType] = GetProviderType((int)columnType);
|
|
|
+ schemaRow [(int)SCHEMA_TABLE.DataType] = DbTypes.TypeOfDateTime;
|
|
|
+ schemaRow [(int)SCHEMA_TABLE.IsLong] = false;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ // else if(DbConvert.JavaSqlTypes.DISTINCT)
|
|
|
+ // {
|
|
|
+ // schemaRow ["ProviderType = (int)GetProviderType((int)columnType);
|
|
|
+ // schemaRow ["DataType = typeof (?);
|
|
|
+ // schemaRow ["IsLong = false;
|
|
|
+ // }
|
|
|
+ case DbConvert.JavaSqlTypes.DOUBLE: {
|
|
|
+ schemaRow [(int)SCHEMA_TABLE.ProviderType] = GetProviderType((int)columnType);
|
|
|
+ schemaRow [(int)SCHEMA_TABLE.DataType] = DbTypes.TypeOfDouble; // was typeof(float)
|
|
|
+ schemaRow [(int)SCHEMA_TABLE.IsLong] = false;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ case DbConvert.JavaSqlTypes.FLOAT: {
|
|
|
+ schemaRow [(int)SCHEMA_TABLE.ProviderType] = GetProviderType((int)columnType);
|
|
|
+ schemaRow [(int)SCHEMA_TABLE.DataType] = DbTypes.TypeOfDouble;
|
|
|
+ schemaRow [(int)SCHEMA_TABLE.IsLong] = false;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ case DbConvert.JavaSqlTypes.REAL: {
|
|
|
+ schemaRow [(int)SCHEMA_TABLE.ProviderType] = GetProviderType((int)columnType);
|
|
|
+ schemaRow [(int)SCHEMA_TABLE.DataType] = DbTypes.TypeOfFloat;
|
|
|
+ schemaRow [(int)SCHEMA_TABLE.IsLong] = false;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ case DbConvert.JavaSqlTypes.INTEGER: {
|
|
|
+ schemaRow [(int)SCHEMA_TABLE.ProviderType] = GetProviderType((int)columnType);
|
|
|
+ schemaRow [(int)SCHEMA_TABLE.DataType] = DbTypes.TypeOfInt32;
|
|
|
+ schemaRow [(int)SCHEMA_TABLE.IsLong] = false;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ case DbConvert.JavaSqlTypes.JAVA_OBJECT: {
|
|
|
+ schemaRow [(int)SCHEMA_TABLE.ProviderType] = GetProviderType((int)columnType);
|
|
|
+ schemaRow [(int)SCHEMA_TABLE.DataType] = DbTypes.TypeOfObject;
|
|
|
+ schemaRow [(int)SCHEMA_TABLE.IsLong] = false;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ case DbConvert.JavaSqlTypes.LONGVARBINARY: {
|
|
|
+ schemaRow [(int)SCHEMA_TABLE.ProviderType] = GetProviderType((int)columnType);
|
|
|
+ schemaRow [(int)SCHEMA_TABLE.DataType] = DbTypes.TypeOfByteArray;
|
|
|
+ schemaRow [(int)SCHEMA_TABLE.IsLong] = true;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ case DbConvert.JavaSqlTypes.LONGVARCHAR: {
|
|
|
+ schemaRow [(int)SCHEMA_TABLE.ProviderType] = GetProviderType((int)columnType);
|
|
|
+ schemaRow [(int)SCHEMA_TABLE.DataType] = DbTypes.TypeOfString;
|
|
|
+ schemaRow [(int)SCHEMA_TABLE.IsLong] = true;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ case DbConvert.JavaSqlTypes.DECIMAL:
|
|
|
+ case DbConvert.JavaSqlTypes.NUMERIC: {
|
|
|
+ int scale = ResultsMetaData.getScale(columnIndex);
|
|
|
+ if (scale == -127) {
|
|
|
+ schemaRow [(int)SCHEMA_TABLE.ProviderType] = GetProviderType((int)columnType);
|
|
|
+ schemaRow [(int)SCHEMA_TABLE.DataType] = DbTypes.TypeOfDouble;
|
|
|
+ schemaRow [(int)SCHEMA_TABLE.IsLong] = false;
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ schemaRow [(int)SCHEMA_TABLE.ProviderType] = GetProviderType((int)columnType);
|
|
|
+ schemaRow [(int)SCHEMA_TABLE.DataType] = DbTypes.TypeOfDecimal;
|
|
|
+ schemaRow [(int)SCHEMA_TABLE.IsLong] = false;
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ case DbConvert.JavaSqlTypes.REF: {
|
|
|
+ schemaRow [(int)SCHEMA_TABLE.ProviderType] = GetProviderType((int)columnType);
|
|
|
+ schemaRow [(int)SCHEMA_TABLE.DataType] = typeof (java.sql.Ref);
|
|
|
+ schemaRow [(int)SCHEMA_TABLE.IsLong] = true;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ case DbConvert.JavaSqlTypes.SMALLINT: {
|
|
|
+ schemaRow [(int)SCHEMA_TABLE.ProviderType] = GetProviderType((int)columnType);
|
|
|
+ schemaRow [(int)SCHEMA_TABLE.DataType] = DbTypes.TypeOfInt16;
|
|
|
+ schemaRow [(int)SCHEMA_TABLE.IsLong] = false;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ case DbConvert.JavaSqlTypes.STRUCT: {
|
|
|
+ schemaRow [(int)SCHEMA_TABLE.ProviderType] = GetProviderType((int)columnType);
|
|
|
+ schemaRow [(int)SCHEMA_TABLE.DataType] = typeof (java.sql.Struct);
|
|
|
+ schemaRow [(int)SCHEMA_TABLE.IsLong] = false;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ case DbConvert.JavaSqlTypes.TIME: {
|
|
|
+ schemaRow [(int)SCHEMA_TABLE.ProviderType] = GetProviderType((int)columnType);
|
|
|
+ schemaRow [(int)SCHEMA_TABLE.DataType] = DbTypes.TypeOfTimespan;
|
|
|
+ schemaRow [(int)SCHEMA_TABLE.IsLong] = false;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ case DbConvert.JavaSqlTypes.TIMESTAMP: {
|
|
|
+ schemaRow [(int)SCHEMA_TABLE.ProviderType] = GetProviderType((int)columnType);
|
|
|
+ schemaRow [(int)SCHEMA_TABLE.DataType] = DbTypes.TypeOfDateTime;
|
|
|
+ schemaRow [(int)SCHEMA_TABLE.IsLong] = false;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ case DbConvert.JavaSqlTypes.TINYINT: {
|
|
|
+ schemaRow [(int)SCHEMA_TABLE.ProviderType] = GetProviderType((int)columnType);
|
|
|
+ schemaRow [(int)SCHEMA_TABLE.DataType] = DbTypes.TypeOfByte;
|
|
|
+ schemaRow [(int)SCHEMA_TABLE.IsLong] = false;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ case DbConvert.JavaSqlTypes.VARBINARY: {
|
|
|
+ schemaRow [(int)SCHEMA_TABLE.ProviderType] = GetProviderType((int)columnType);
|
|
|
+ schemaRow [(int)SCHEMA_TABLE.DataType] = DbTypes.TypeOfByteArray;
|
|
|
+ schemaRow [(int)SCHEMA_TABLE.IsLong] = true;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ case DbConvert.JavaSqlTypes.VARCHAR: {
|
|
|
+ // FIXME : specific for Microsoft SQl Server driver
|
|
|
+ if (metaData.getColumnTypeName(columnIndex).Equals("sql_variant")) {
|
|
|
+ schemaRow [(int)SCHEMA_TABLE.ProviderType] = DbType.Object;
|
|
|
+ schemaRow [(int)SCHEMA_TABLE.DataType] = DbTypes.TypeOfObject;
|
|
|
+ schemaRow [(int)SCHEMA_TABLE.IsLong] = false;
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ schemaRow [(int)SCHEMA_TABLE.ProviderType] = GetProviderType((int)columnType);
|
|
|
+ schemaRow [(int)SCHEMA_TABLE.DataType] = DbTypes.TypeOfString;// (char[]);
|
|
|
+ schemaRow [(int)SCHEMA_TABLE.IsLong] = false;//true;
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ // else if(columnType == -8 && metaData.getColumnTypeName(columnIndex).Equals("ROWID")) {
|
|
|
+ // // FIXME : specific for Oracle JDBC driver : OracleTypes.ROWID
|
|
|
+ // schemaRow [(int)SCHEMA_TABLE.ProviderType] = DbType.String;
|
|
|
+ // schemaRow [(int)SCHEMA_TABLE.DataType] = DbTypes.TypeOfString;
|
|
|
+ // schemaRow [(int)SCHEMA_TABLE.IsLong] = false;
|
|
|
+ // }
|
|
|
+ default: {
|
|
|
+ schemaRow [(int)SCHEMA_TABLE.ProviderType] = DbType.Object;
|
|
|
+ schemaRow [(int)SCHEMA_TABLE.DataType] = DbTypes.TypeOfObject;
|
|
|
+ schemaRow [(int)SCHEMA_TABLE.IsLong] = true;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
public override DataTable GetSchemaTable()
|
|
|
{
|
|
|
if (SchemaTable.Rows != null && SchemaTable.Rows.Count > 0) {
|
|
|
@@ -994,166 +1169,8 @@ namespace System.Data.ProviderBase
|
|
|
row [(int)SCHEMA_TABLE.IsHidden] = false;
|
|
|
row [(int)SCHEMA_TABLE.IsReadOnly] = metaData.isReadOnly(i);
|
|
|
|
|
|
- int columnType = metaData.getColumnType(i);
|
|
|
- string columnTypeName = metaData.getColumnTypeName(i);
|
|
|
- if(columnType == Types.ARRAY) {
|
|
|
- row [(int)SCHEMA_TABLE.ProviderType] = GetProviderType(columnType);
|
|
|
- row [(int)SCHEMA_TABLE.DataType] = typeof (java.sql.Array);
|
|
|
- row [(int)SCHEMA_TABLE.IsLong] = false;
|
|
|
- }
|
|
|
- else if(columnType == Types.BIGINT) {
|
|
|
- row [(int)SCHEMA_TABLE.ProviderType] = GetProviderType(columnType);
|
|
|
- row [(int)SCHEMA_TABLE.DataType] = DbTypes.TypeOfInt64;
|
|
|
- row [(int)SCHEMA_TABLE.IsLong] = false;
|
|
|
- }
|
|
|
- else if(columnType == Types.BINARY) {
|
|
|
- row [(int)SCHEMA_TABLE.ProviderType] = GetProviderType(columnType);
|
|
|
- row [(int)SCHEMA_TABLE.DataType] = DbTypes.TypeOfByteArray;
|
|
|
- row [(int)SCHEMA_TABLE.IsLong] = true;
|
|
|
- }
|
|
|
- else if(columnType == Types.BIT) {
|
|
|
- row [(int)SCHEMA_TABLE.ProviderType] = GetProviderType(columnType);
|
|
|
- row [(int)SCHEMA_TABLE.DataType] = DbTypes.TypeOfBoolean;
|
|
|
- row [(int)SCHEMA_TABLE.IsLong] = false;
|
|
|
- }
|
|
|
- else if(columnType == Types.BLOB) {
|
|
|
- row [(int)SCHEMA_TABLE.ProviderType] = GetProviderType(columnType);
|
|
|
- row [(int)SCHEMA_TABLE.DataType] = DbTypes.TypeOfByteArray;
|
|
|
- row [(int)SCHEMA_TABLE.IsLong] = true;
|
|
|
- }
|
|
|
- else if(columnType == Types.CHAR) {
|
|
|
- // FIXME : specific for Microsoft SQl Server driver
|
|
|
- if (columnTypeName.Equals("uniqueidentifier")) {
|
|
|
- row [(int)SCHEMA_TABLE.ProviderType] = DbType.Guid;
|
|
|
- row [(int)SCHEMA_TABLE.DataType] = DbTypes.TypeOfGuid;
|
|
|
- row [(int)SCHEMA_TABLE.IsLong] = false;
|
|
|
- }
|
|
|
- else {
|
|
|
- row [(int)SCHEMA_TABLE.ProviderType] = GetProviderType(columnType);
|
|
|
- row [(int)SCHEMA_TABLE.DataType] = DbTypes.TypeOfString;
|
|
|
- row [(int)SCHEMA_TABLE.IsLong] = false;
|
|
|
- }
|
|
|
- }
|
|
|
- else if(columnType == Types.CLOB) {
|
|
|
- row [(int)SCHEMA_TABLE.ProviderType] = GetProviderType(columnType);
|
|
|
- row [(int)SCHEMA_TABLE.DataType] = DbTypes.TypeOfString; // instead og .java.sql.Clob
|
|
|
- row [(int)SCHEMA_TABLE.IsLong] = true;
|
|
|
- }
|
|
|
- else if(columnType == Types.DATE) {
|
|
|
- row [(int)SCHEMA_TABLE.ProviderType] = GetProviderType(columnType);
|
|
|
- row [(int)SCHEMA_TABLE.DataType] = DbTypes.TypeOfDateTime;
|
|
|
- row [(int)SCHEMA_TABLE.IsLong] = false;
|
|
|
- }
|
|
|
- else if(columnType == Types.DECIMAL) {
|
|
|
- row [(int)SCHEMA_TABLE.ProviderType] = GetProviderType(columnType);
|
|
|
- row [(int)SCHEMA_TABLE.DataType] = DbTypes.TypeOfDecimal;
|
|
|
- row [(int)SCHEMA_TABLE.IsLong] = false;
|
|
|
- }
|
|
|
- // else if(columnType == Types.DISTINCT)
|
|
|
- // {
|
|
|
- // row ["ProviderType = (int)GetProviderType(columnType);
|
|
|
- // row ["DataType = typeof (?);
|
|
|
- // row ["IsLong = false;
|
|
|
- // }
|
|
|
- else if(columnType == Types.DOUBLE) {
|
|
|
- row [(int)SCHEMA_TABLE.ProviderType] = GetProviderType(columnType);
|
|
|
- row [(int)SCHEMA_TABLE.DataType] = DbTypes.TypeOfDouble; // was typeof(float)
|
|
|
- row [(int)SCHEMA_TABLE.IsLong] = false;
|
|
|
- }
|
|
|
- else if(columnType == Types.FLOAT) {
|
|
|
- row [(int)SCHEMA_TABLE.ProviderType] = GetProviderType(columnType);
|
|
|
- row [(int)SCHEMA_TABLE.DataType] = DbTypes.TypeOfDouble;
|
|
|
- row [(int)SCHEMA_TABLE.IsLong] = false;
|
|
|
- }
|
|
|
- else if(columnType == Types.REAL) {
|
|
|
- row [(int)SCHEMA_TABLE.ProviderType] = GetProviderType(columnType);
|
|
|
- row [(int)SCHEMA_TABLE.DataType] = DbTypes.TypeOfFloat;
|
|
|
- row [(int)SCHEMA_TABLE.IsLong] = false;
|
|
|
- }
|
|
|
- else if(columnType == Types.INTEGER) {
|
|
|
- row [(int)SCHEMA_TABLE.ProviderType] = GetProviderType(columnType);
|
|
|
- row [(int)SCHEMA_TABLE.DataType] = DbTypes.TypeOfInt32;
|
|
|
- row [(int)SCHEMA_TABLE.IsLong] = false;
|
|
|
- }
|
|
|
- else if(columnType == Types.JAVA_OBJECT) {
|
|
|
- row [(int)SCHEMA_TABLE.ProviderType] = GetProviderType(columnType);
|
|
|
- row [(int)SCHEMA_TABLE.DataType] = DbTypes.TypeOfObject;
|
|
|
- row [(int)SCHEMA_TABLE.IsLong] = false;
|
|
|
- }
|
|
|
- else if(columnType == Types.LONGVARBINARY) {
|
|
|
- row [(int)SCHEMA_TABLE.ProviderType] = GetProviderType(columnType);
|
|
|
- row [(int)SCHEMA_TABLE.DataType] = DbTypes.TypeOfByteArray;
|
|
|
- row [(int)SCHEMA_TABLE.IsLong] = true;
|
|
|
- }
|
|
|
- else if(columnType == Types.LONGVARCHAR) {
|
|
|
- row [(int)SCHEMA_TABLE.ProviderType] = GetProviderType(columnType);
|
|
|
- row [(int)SCHEMA_TABLE.DataType] = DbTypes.TypeOfString;
|
|
|
- row [(int)SCHEMA_TABLE.IsLong] = true;
|
|
|
- }
|
|
|
- else if(columnType == Types.NUMERIC) {
|
|
|
- row [(int)SCHEMA_TABLE.ProviderType] = GetProviderType(columnType);
|
|
|
- row [(int)SCHEMA_TABLE.DataType] = DbTypes.TypeOfDecimal;
|
|
|
- row [(int)SCHEMA_TABLE.IsLong] = false;
|
|
|
- }
|
|
|
- else if(columnType == Types.REF) {
|
|
|
- row [(int)SCHEMA_TABLE.ProviderType] = GetProviderType(columnType);
|
|
|
- row [(int)SCHEMA_TABLE.DataType] = typeof (java.sql.Ref);
|
|
|
- row [(int)SCHEMA_TABLE.IsLong] = true;
|
|
|
- }
|
|
|
- else if(columnType == Types.SMALLINT) {
|
|
|
- row [(int)SCHEMA_TABLE.ProviderType] = GetProviderType(columnType);
|
|
|
- row [(int)SCHEMA_TABLE.DataType] = DbTypes.TypeOfInt16;
|
|
|
- row [(int)SCHEMA_TABLE.IsLong] = false;
|
|
|
- }
|
|
|
- else if(columnType == Types.STRUCT) {
|
|
|
- row [(int)SCHEMA_TABLE.ProviderType] = GetProviderType(columnType);
|
|
|
- row [(int)SCHEMA_TABLE.DataType] = typeof (java.sql.Struct);
|
|
|
- row [(int)SCHEMA_TABLE.IsLong] = false;
|
|
|
- }
|
|
|
- else if(columnType == Types.TIME) {
|
|
|
- row [(int)SCHEMA_TABLE.ProviderType] = GetProviderType(columnType);
|
|
|
- row [(int)SCHEMA_TABLE.DataType] = DbTypes.TypeOfTimespan;
|
|
|
- row [(int)SCHEMA_TABLE.IsLong] = false;
|
|
|
- }
|
|
|
- else if(columnType == Types.TIMESTAMP) {
|
|
|
- row [(int)SCHEMA_TABLE.ProviderType] = GetProviderType(columnType);
|
|
|
- row [(int)SCHEMA_TABLE.DataType] = DbTypes.TypeOfDateTime;
|
|
|
- row [(int)SCHEMA_TABLE.IsLong] = false;
|
|
|
- }
|
|
|
- else if(columnType == Types.TINYINT) {
|
|
|
- row [(int)SCHEMA_TABLE.ProviderType] = GetProviderType(columnType);
|
|
|
- row [(int)SCHEMA_TABLE.DataType] = DbTypes.TypeOfByte;
|
|
|
- row [(int)SCHEMA_TABLE.IsLong] = false;
|
|
|
- }
|
|
|
- else if(columnType == Types.VARBINARY) {
|
|
|
- row [(int)SCHEMA_TABLE.ProviderType] = GetProviderType(columnType);
|
|
|
- row [(int)SCHEMA_TABLE.DataType] = DbTypes.TypeOfByteArray;
|
|
|
- row [(int)SCHEMA_TABLE.IsLong] = true;
|
|
|
- }
|
|
|
- else if(columnType == Types.VARCHAR) {
|
|
|
- // FIXME : specific for Microsoft SQl Server driver
|
|
|
- if (columnTypeName.Equals("sql_variant")) {
|
|
|
- row [(int)SCHEMA_TABLE.ProviderType] = DbType.Object;
|
|
|
- row [(int)SCHEMA_TABLE.DataType] = DbTypes.TypeOfObject;
|
|
|
- row [(int)SCHEMA_TABLE.IsLong] = false;
|
|
|
- }
|
|
|
- else {
|
|
|
- row [(int)SCHEMA_TABLE.ProviderType] = GetProviderType(columnType);
|
|
|
- row [(int)SCHEMA_TABLE.DataType] = DbTypes.TypeOfString;// (char[]);
|
|
|
- row [(int)SCHEMA_TABLE.IsLong] = false;//true;
|
|
|
- }
|
|
|
- }
|
|
|
- else if(columnType == -8 && columnTypeName.Equals("ROWID")) {
|
|
|
- // FIXME : specific for Oracle JDBC driver : OracleTypes.ROWID
|
|
|
- row [(int)SCHEMA_TABLE.ProviderType] = DbType.String;
|
|
|
- row [(int)SCHEMA_TABLE.DataType] = DbTypes.TypeOfString;
|
|
|
- row [(int)SCHEMA_TABLE.IsLong] = false;
|
|
|
- }
|
|
|
- else {
|
|
|
- row [(int)SCHEMA_TABLE.ProviderType] = DbType.Object;
|
|
|
- row [(int)SCHEMA_TABLE.DataType] = DbTypes.TypeOfObject;
|
|
|
- row [(int)SCHEMA_TABLE.IsLong] = true;
|
|
|
- }
|
|
|
+ SetSchemaType(row, metaData, i);
|
|
|
+
|
|
|
SchemaTable.Rows.Add (row);
|
|
|
}
|
|
|
}
|