// 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; }