public ODBCHEnvironment(ODBCVersion version) : base(ODBCHType.Environment) { bool res = ODBCMethods.AllocateHandle(ODBCHType.Environment, IntPtr.Zero, out handle); if (res) { ODBCMethods.SetIntEnvironmentAttribute(this, ODBCEnvAttr.Version, version); } }
protected override bool ReleaseHandle() { IntPtr lhandle = handle; if (lhandle == IntPtr.Zero) { return(true); } return(ODBCMethods.ReleaseHandle(HandleType, lhandle)); }
//получение информации о внешних ключах 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 bool BindColumns(List <ODBCData> columns, ODBCHStatement statement)//привязка выделенной памяти к определенным колонкам в результирующем наборе { bool res = true; foreach (var col in columns) { if (!ODBCMethods.SQLBindColumn(statement, col)) { res = false; break; } } return(res); }
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); } } }
//получение полей первичного ключа public IndexData GetPrimaryKey(string schemaName, string tableName) { var _primData = new IndexData(); if (_initialized) { using (ODBCHStatement statement = new ODBCHStatement(_connectionHandle)) { PrimaryKeyStatementDefinition primaryKeyDefinition = new PrimaryKeyStatementDefinition(); List <ODBCData> data = null; try { data = BindBuffer(primaryKeyDefinition); if (ODBCMethods.GetPrimKey(statement, schemaName, tableName)) { if (BindColumns(data, statement)) { while (ODBCMethods.Fetch(statement)) { FillInternalData(ref data); _primData.SetData(0, ""); ColumnData _cd = new ColumnData(data[0].InternalData.strVal, data[1].InternalData.intVal, true); _primData.AddColumnData(_cd); //PrimaryKeyData prim = new PrimaryKeyData(data[0].InternalData.strVal, data[1].InternalData.intVal); // _primData.Add(prim); } } } } finally { foreach (var record in data) { record.Dispose(); } // statement.Close(); } } return(_primData); } else { throw new ODBCErrorNotInitialized("You must connect to database!"); } }
//получение информации об источниках ODBC public List <ODBCSources> GetODBCSources() { var list = new List <ODBCSources>(); if (!_initialized) { Initialize(ODBCVersion.Version2); } StringBuilder serverName = new StringBuilder(); StringBuilder description = new StringBuilder(); var result = ODBCMethods.GetDataSources(_enviromentHandle, ODBCConstants.SQL_FETCH_FIRST, out serverName, out description); if ((result != ODBCResult.Error) && (result != ODBCResult.InvalidHandle)) { while (result != ODBCResult.NoData) { var source = new ODBCSources(serverName.ToString(), description.ToString()); list.Add(source); result = ODBCMethods.GetDataSources(_enviromentHandle, ODBCConstants.SQL_FETCH_NEXT, out serverName, out description); } } return(list); }
//получение информации об индексах, полях, входящих в них public List <IndexData> GetIndexData(string schemaName, string tableName) { var _indexesData = new List <IndexData>(); const ushort _indexType = 1; //all indexes; if (_initialized) { using (ODBCHStatement statement = new ODBCHStatement(_connectionHandle)) { List <ODBCData> data = null; IndexStatementDefinition indexStatementDefinition = new IndexStatementDefinition(); try { data = BindBuffer(indexStatementDefinition); if (ODBCNative.ODBCMethods.GetIndexInfo(statement, schemaName, tableName, _indexType)) { if (BindColumns(data, statement)) { bool fetched = ODBCNative.ODBCMethods.Fetch(statement); while (fetched) { FillInternalData(ref data); string indexName = data[1].InternalData.strVal; if (indexName.Length > 1) { IndexData _indexData = new IndexData(); _indexData.SetData(data[0].InternalData.intVal, data[1].InternalData.strVal); while ((fetched) & (indexName.Equals(data[1].InternalData.strVal))) { int _unique = ODBCMethods.ReadShort(data[0].ColumnData); if ((_unique == ODBCNative.ODBCConstants.SQL_IS_INDEX_UNIQUE) | (_unique == ODBCNative.ODBCConstants.SQL_IS_INDEX_DUPLICATE)) { bool asc = (data[4].InternalData.strVal == "A"); ColumnData cd = new ColumnData(data[3].InternalData.strVal, data[2].InternalData.intVal, asc); _indexData.AddColumnData(cd); } fetched = ODBCNative.ODBCMethods.Fetch(statement); if (fetched) { FillInternalData(ref data); } } _indexesData.Add(_indexData); } else { fetched = ODBCNative.ODBCMethods.Fetch(statement); } } } } } finally { foreach (var record in data) { record.Dispose(); } } } return(_indexesData); } else { throw new ODBCErrorNotInitialized("You must connect to database!"); } }
public ODBCHStatement(ODBCHConnection cHandle) : base(ODBCHType.Statement) { bool res = ODBCMethods.AllocateHandle(ODBCHType.Statement, cHandle, out handle); }
public ODBCHConnection(ODBCHEnvironment eHandle) : base(ODBCHType.Connection) { bool res = ODBCMethods.AllocateHandle(ODBCHType.Connection, eHandle, out handle); }