//получение информации о внешних ключах public List <ForeignKeyDescription> GetForeingKeys(string pkCatalogName, string pkSchemaName, string pkTableName, string fkCatalogName, string fkSchemaName, string fkTableName) { var foreignKeyData = new List <ForeignKeyDescription>(); if (_initialized) { using (ODBCHStatement statement = new ODBCHStatement(_connectionHandle)) { List <ODBCData> data = null; ForeignKeysStatementDefinition foreignStatementDefinition = new ForeignKeysStatementDefinition(); try { data = BindBuffer(foreignStatementDefinition); if (ODBCNative.ODBCMethods.GetForeignKeys(statement, pkCatalogName, pkSchemaName, pkTableName, fkCatalogName, fkSchemaName, fkTableName)) { if (BindColumns(data, statement)) { bool fetched = ODBCNative.ODBCMethods.Fetch(statement); while (fetched) { List <string> _fkColumns = new List <string>(); List <string> _pkColumns = new List <string>(); string _fkName = ODBCMethods.ReadString(data[11].ColumnData); string _pkName = ODBCMethods.ReadString(data[12].ColumnData); short _updateRule = ODBCMethods.ReadShort(data[9].ColumnData); short _deleteRule = ODBCMethods.ReadShort(data[10].ColumnData); while ((fetched) & (_fkName == ODBCMethods.ReadString(data[11].ColumnData))) { string _pkcolumnName = ODBCMethods.ReadString(data[3].ColumnData); string _fkcolumnName = ODBCMethods.ReadString(data[7].ColumnData); _fkColumns.Add(_fkcolumnName); _pkColumns.Add(_pkcolumnName); fetched = ODBCNative.ODBCMethods.Fetch(statement); } ForeignKeyDescription _fkd = new ForeignKeyDescription(_fkName, _pkName, _pkColumns, _fkColumns, _updateRule, _deleteRule); foreignKeyData.Add(_fkd); } } } } finally { foreach (var record in data) { record.Dispose(); } } } } return(foreignKeyData); }
private static void FillInternalData(ref List <ODBCData> data)// считываем данные из неуправляемой памяти в локальный буфер { foreach (var locData in data) { if (locData.ColumnType == ODBCDataType.Char) { locData.InternalData.strVal = ODBCMethods.ReadString(data[locData.ColumnIndex].ColumnData); locData.InternalData.intVal = -1; } if (locData.ColumnType == ODBCDataType.Integer) { locData.InternalData.intVal = ODBCMethods.ReadShort(data[locData.ColumnIndex].ColumnData); } } }