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); }
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; } }
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()); }
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); } }