Exemplo n.º 1
0
        public DB2OpenConnection GetOpenConnection(DB2Connection db2Conn)
        {
            DB2OpenConnection connection = null;

            lock (openFreeConnections.SyncRoot)
            {
                if ((connectionSettings.ConnectionPoolSizeMax > 0) && (connectionsOpen >= connectionSettings.ConnectionPoolSizeMax))
                {
                    throw new ArgumentException("Maximum connections reached for connectionstring");
                }

                while (connectionsOpen > connectionsInUse)
                {
                    connection = (DB2OpenConnection)openFreeConnections[openFreeConnections.Count - 1];
                    openFreeConnections.RemoveAt(openFreeConnections.Count - 1);

                    // check if connection is dead
                    int isDead;
                    DB2Constants.RetCode sqlRet = (DB2Constants.RetCode)DB2CLIWrapper.SQLGetConnectAttr(connection.DBHandle, DB2Constants.SQL_ATTR_CONNECTION_DEAD, out isDead, 0, IntPtr.Zero);
                    if (((sqlRet == DB2Constants.RetCode.SQL_SUCCESS_WITH_INFO) || (sqlRet == DB2Constants.RetCode.SQL_SUCCESS)) && (isDead == DB2Constants.SQL_CD_FALSE))
                    {
                        connectionsInUse++;
                        break;
                    }
                    else
                    {
                        connectionsOpen--;
                        connection.Dispose();
                        connection = null;
                    }
                }
                if (connectionsOpen == connectionsInUse)
                {
                    if (timer != null)
                    {
                        timer.Dispose();
                        timer = null;
                    }
                }
            }
            if (connection == null)
            {
                openFreeConnections.Clear();
                connectionsUsableOffset = 0;

                connection = new DB2OpenConnection(connectionSettings, db2Conn);
                connectionsOpen++;
                connectionsInUse++;
            }

            return(connection);
        }
Exemplo n.º 2
0
        private void InternalOpen(string connnectionString, DB2Connection connection)
        {
            try
            {
                DB2Constants.RetCode sqlRet = (DB2Constants.RetCode)DB2CLIWrapper.SQLAllocHandle(DB2Constants.SQL_HANDLE_DBC, DB2Environment.Instance.PenvHandle, out dbHandle);
                DB2ClientUtils.DB2CheckReturn(sqlRet, DB2Constants.SQL_HANDLE_DBC, DB2Environment.Instance.PenvHandle, "Unable to allocate database handle in DB2Connection.", connection);

                StringBuilder outConnectStr = new StringBuilder(DB2Constants.SQL_MAX_OPTION_STRING_LENGTH);
                short         numOutCharsReturned;

                sqlRet = (DB2Constants.RetCode)DB2CLIWrapper.SQLDriverConnect(dbHandle, IntPtr.Zero,
                                                                              connnectionString, DB2Constants.SQL_NTS,
                                                                              outConnectStr, DB2Constants.SQL_MAX_OPTION_STRING_LENGTH, out numOutCharsReturned,
                                                                              DB2Constants.SQL_DRIVER_NOPROMPT);

                DB2ClientUtils.DB2CheckReturn(sqlRet, DB2Constants.SQL_HANDLE_DBC, dbHandle, "Unable to connect to the database.", connection);

                databaseProductName = SQLGetInfo(dbHandle, DB2Constants.SQL_DBMS_NAME);
                databaseVersion     = SQLGetInfo(dbHandle, DB2Constants.SQL_DBMS_VER);

                /* Set the attribute SQL_ATTR_XML_DECLARATION to skip the XML declaration from XML Data */
                sqlRet = (DB2Constants.RetCode)DB2CLIWrapper.SQLSetConnectAttr(dbHandle, DB2Constants.SQL_ATTR_XML_DECLARATION, new IntPtr(DB2Constants.SQL_XML_DECLARATION_NONE), DB2Constants.SQL_NTS);
                DB2ClientUtils.DB2CheckReturn(sqlRet, DB2Constants.SQL_HANDLE_DBC, dbHandle, "Unable to set SQL_ATTR_XML_DECLARATION", connection);


                connection.NativeOpenPerformed = true;

                if ((settings.Pool == null) || (settings.Pool.databaseProductName == null))
                {
                    settings.Pool.databaseProductName = databaseProductName;
                    settings.Pool.databaseVersion     = databaseVersion;
                }
                else if (settings.Pool != null)
                {
                    if (settings.Pool != null)
                    {
                        databaseProductName = settings.Pool.databaseProductName;
                        databaseVersion     = settings.Pool.databaseVersion;
                    }
                }
            }
            catch
            {
                if (dbHandle != IntPtr.Zero)
                {
                    DB2CLIWrapper.SQLFreeHandle(DB2Constants.SQL_HANDLE_DBC, dbHandle);
                    dbHandle = IntPtr.Zero;
                }
                throw;
            }
        }
Exemplo n.º 3
0
        public string SQLGetInfo(IntPtr dbHandle, short infoType)
        {
            StringBuilder sb = new StringBuilder(DB2Constants.SQL_MAX_OPTION_STRING_LENGTH);
            short         stringLength;

            DB2Constants.RetCode sqlRet = (DB2Constants.RetCode)DB2CLIWrapper.SQLGetInfo(dbHandle, infoType, sb, DB2Constants.SQL_MAX_OPTION_STRING_LENGTH, out stringLength);

            if (sqlRet != DB2Constants.RetCode.SQL_SUCCESS && sqlRet != DB2Constants.RetCode.SQL_SUCCESS_WITH_INFO)
            {
                throw new DB2Exception(DB2Constants.SQL_HANDLE_DBC, dbHandle, "SQLGetInfo Error");
            }

            return(sb.ToString().Trim());
        }
Exemplo n.º 4
0
        public static void DB2CheckReturn(DB2Constants.RetCode sqlRet, short handleType, IntPtr handle, string message, DB2Connection connection)
        {
            switch (sqlRet)
            {
            case DB2Constants.RetCode.SQL_SUCCESS_WITH_INFO:
                if (connection != null)
                {
                    connection.OnInfoMessage(handleType, handle);
                }
                goto case DB2Constants.RetCode.SQL_SUCCESS;

            case DB2Constants.RetCode.SQL_SUCCESS:
            case DB2Constants.RetCode.SQL_NO_DATA:
                return;

            case DB2Constants.RetCode.SQL_INVALID_HANDLE:
                throw new ArgumentException("Invalid handle");

            default:
            case DB2Constants.RetCode.SQL_ERROR:
                throw new DB2Exception(handleType, handle, message);
            }
        }