Ejemplo n.º 1
0
        // create DataColumns
        // add DataColumns to DataTable
        // add schema information to DataTable
        // generate unique column names
        private void BuildSchemaTableInfoTable(int columnCount, IntPtr columnInfos, bool filterITypeInfo, bool filterChapters) {
            Debug.Assert(0 < columnCount, "BuildSchemaTableInfoTable - no column");

            int rowCount = 0;
            MetaData[] metainfo = new MetaData[columnCount];

            // for every column, build an equivalent to tagDBCOLUMNINFO
            tagDBCOLUMNINFO dbColumnInfo = new tagDBCOLUMNINFO();
            for (int i = 0, offset = 0; i < columnCount; ++i, offset += ODB.SizeOf_tagDBCOLUMNINFO) {
                Marshal.PtrToStructure(ADP.IntPtrOffset(columnInfos, offset), dbColumnInfo);
#if WIN32
                if (0 >= (int) dbColumnInfo.iOrdinal) {
#else
                if (0 >= (long) dbColumnInfo.iOrdinal) {
#endif
                    continue;
                }
                if (OleDbDataReader.DoColumnDropFilter(dbColumnInfo.dwFlags)) {
                    continue;
                }

                if (null == dbColumnInfo.pwszName) {
                    dbColumnInfo.pwszName = "";
                }
                if (filterITypeInfo && (ODB.DBCOLUMN_TYPEINFO == dbColumnInfo.pwszName)) { // MDAC 65306
                    continue;
                }
                if (filterChapters && (NativeDBType.HCHAPTER == dbColumnInfo.wType)) {
                    continue;  // filter chapters in IRowset from IDBSchemaRowset for DumpToTable
                }

                bool islong  = OleDbDataReader.IsLong(dbColumnInfo.dwFlags);
                bool isfixed = OleDbDataReader.IsFixed(dbColumnInfo.dwFlags);
                NativeDBType dbType = NativeDBType.FromDBType(dbColumnInfo.wType, islong, isfixed);

                MetaData info = new MetaData();
                info.columnName = dbColumnInfo.pwszName;
                info.type = dbType;
                info.ordinal = dbColumnInfo.iOrdinal;
#if WIN32
                    info.size = (int)dbColumnInfo.ulColumnSize;
#else
                    long maxsize = (long) dbColumnInfo.ulColumnSize;
                    info.size = (((maxsize < 0) || (Int32.MaxValue < maxsize)) ? Int32.MaxValue : (int)maxsize);
#endif
                info.flags = dbColumnInfo.dwFlags;
                info.precision = dbColumnInfo.bPrecision;
                info.scale = dbColumnInfo.bScale;

                info.kind = dbColumnInfo.columnid.eKind;
                switch(dbColumnInfo.columnid.eKind) {
                    case ODB.DBKIND_GUID_NAME:
                    case ODB.DBKIND_GUID_PROPID:
                    case ODB.DBKIND_GUID:
                        info.guid = dbColumnInfo.columnid.uGuid;
                        break;
                    default:
                        Debug.Assert(ODB.DBKIND_PGUID_NAME != dbColumnInfo.columnid.eKind, "OLE DB providers never return pGuid-style bindings.");
                        Debug.Assert(ODB.DBKIND_PGUID_PROPID != dbColumnInfo.columnid.eKind, "OLE DB providers never return pGuid-style bindings.");
                        info.guid = Guid.Empty;
                        break;
                }
                switch(dbColumnInfo.columnid.eKind) {
                    case ODB.DBKIND_GUID_PROPID:
                    case ODB.DBKIND_PROPID:
                        info.propid = dbColumnInfo.columnid.ulPropid;
                        break;
                    case ODB.DBKIND_GUID_NAME:
                    case ODB.DBKIND_NAME:
                        if (ADP.PtrZero != dbColumnInfo.columnid.ulPropid) {
                            info.idname = Marshal.PtrToStringUni(dbColumnInfo.columnid.ulPropid);
                        }
                        else {
                            info.idname = null;
                        }
                        break;
                    default:
                        info.propid = ADP.PtrZero;
                        break;
                }
                metainfo[rowCount] = info;

#if DEBUG
                if (AdapterSwitches.DataSchema.TraceVerbose) {
                    Debug.WriteLine("OleDbDataReader[" + info.ordinal.ToInt64().ToString(CultureInfo.InvariantCulture) + ", " + dbColumnInfo.pwszName + "]=" + dbType.enumOleDbType.ToString() + "," + dbType.dataSourceType + ", " + dbType.wType);
                }
#endif
                rowCount++;
            }
            if (rowCount < columnCount) { // shorten names array appropriately
                MetaData[] tmpinfo = new MetaData[rowCount];
                for (int i = 0; i < rowCount; ++i) {
                    tmpinfo[i] = metainfo[i];
                }
                metainfo = tmpinfo;
            }
            _visibleFieldCount = rowCount;
            _metadata = metainfo;
        }
        private void BuildSchemaTableInfoTable(int columnCount, IntPtr columnInfos, bool filterITypeInfo, bool filterChapters)
        {
            int index = 0;
            System.Data.OleDb.MetaData[] dataArray = new System.Data.OleDb.MetaData[columnCount];
            tagDBCOLUMNINFO structure = new tagDBCOLUMNINFO();
            int num4 = 0;
            for (int i = 0; num4 < columnCount; i += ODB.SizeOf_tagDBCOLUMNINFO)
            {
                Marshal.PtrToStructure(ADP.IntPtrOffset(columnInfos, i), structure);
                if ((0 >= ((int) structure.iOrdinal)) || DoColumnDropFilter(structure.dwFlags))
                {
                    goto Label_01EC;
                }
                if (structure.pwszName == null)
                {
                    structure.pwszName = "";
                }
                if ((filterITypeInfo && ("DBCOLUMN_TYPEINFO" == structure.pwszName)) || (filterChapters && (0x88 == structure.wType)))
                {
                    goto Label_01EC;
                }
                bool isLong = IsLong(structure.dwFlags);
                bool isFixed = IsFixed(structure.dwFlags);
                NativeDBType type = NativeDBType.FromDBType(structure.wType, isLong, isFixed);
                System.Data.OleDb.MetaData data = new System.Data.OleDb.MetaData {
                    columnName = structure.pwszName,
                    type = type,
                    ordinal = structure.iOrdinal,
                    size = (int) structure.ulColumnSize,
                    flags = structure.dwFlags,
                    precision = structure.bPrecision,
                    scale = structure.bScale,
                    kind = structure.columnid.eKind
                };
                switch (structure.columnid.eKind)
                {
                    case 0:
                    case 1:
                    case 6:
                        data.guid = structure.columnid.uGuid;
                        break;

                    default:
                        data.guid = Guid.Empty;
                        break;
                }
                switch (structure.columnid.eKind)
                {
                    case 0:
                    case 2:
                        if (!(ADP.PtrZero != structure.columnid.ulPropid))
                        {
                            break;
                        }
                        data.idname = Marshal.PtrToStringUni(structure.columnid.ulPropid);
                        goto Label_01E3;

                    case 1:
                    case 5:
                        data.propid = structure.columnid.ulPropid;
                        goto Label_01E3;

                    default:
                        data.propid = ADP.PtrZero;
                        goto Label_01E3;
                }
                data.idname = null;
            Label_01E3:
                dataArray[index] = data;
                index++;
            Label_01EC:
                num4++;
            }
            if (index < columnCount)
            {
                System.Data.OleDb.MetaData[] dataArray2 = new System.Data.OleDb.MetaData[index];
                for (int j = 0; j < index; j++)
                {
                    dataArray2[j] = dataArray[j];
                }
                dataArray = dataArray2;
            }
            this._visibleFieldCount = index;
            this._metadata = dataArray;
        }