コード例 #1
0
ファイル: ODBCHandles.cs プロジェクト: oconnKate/ODBCInterop
        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);
            }
        }
コード例 #2
0
ファイル: ODBCHandles.cs プロジェクト: oconnKate/ODBCInterop
        protected override bool ReleaseHandle()
        {
            IntPtr lhandle = handle;

            if (lhandle == IntPtr.Zero)
            {
                return(true);
            }
            return(ODBCMethods.ReleaseHandle(HandleType, lhandle));
        }
コード例 #3
0
        //получение информации о внешних ключах
        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);
        }
コード例 #4
0
        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);
        }
コード例 #5
0
 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);
         }
     }
 }
コード例 #6
0
        //получение полей первичного ключа
        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!");
            }
        }
コード例 #7
0
        //получение информации об источниках 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);
        }
コード例 #8
0
        //получение информации об индексах, полях, входящих в них
        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!");
            }
        }
コード例 #9
0
ファイル: ODBCHandles.cs プロジェクト: oconnKate/ODBCInterop
 public ODBCHStatement(ODBCHConnection cHandle)
     : base(ODBCHType.Statement)
 {
     bool res = ODBCMethods.AllocateHandle(ODBCHType.Statement, cHandle, out handle);
 }
コード例 #10
0
ファイル: ODBCHandles.cs プロジェクト: oconnKate/ODBCInterop
 public ODBCHConnection(ODBCHEnvironment eHandle)
     : base(ODBCHType.Connection)
 {
     bool res = ODBCMethods.AllocateHandle(ODBCHType.Connection, eHandle, out handle);
 }