Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Базы данных > mysql_close из libmysql не закрывает соединение


Автор: ClickF1 24.9.2009, 20:23
Приветствую!
У меня проблема, я активно использую базу данных MySQL версии 5.0.67-community-nt под Windows Server 2003 Web Edition. В комплекте с базой данных идет Заголовочные файлы и lib файлы. Код отлично компилируется и прекрасно работает, за исключением закрытия соединения. 

И это только одна из 20 функций которая использует базу данных. Дело в том что функция mysql_close не закрывает соединение с сервером базы данных, в последствии чего после более 2к коннектов база просто не принимает соединения, и код соответственно не работает..

Что делать?
Код

BOOL server_sql_connect(MYSQL *hSql)
{
#define __LOG_FUNC__
#ifndef __LOG_FUNC__
#define DbgPrint 
#endif
    BOOL bRet = FALSE;

    mysql_init(hSql);
    mysql_options(hSql,MYSQL_READ_DEFAULT_GROUP,SQL_DB_NAME);
    
    if (!(mysql_real_connect(hSql,SQL_SERVER,SQL_LOGIN,SQL_PASSW,SQL_DB_NAME,0,NULL,0)))
    {
        DbgPrint("SQL-> Error connect to SQL Server!\n");
        goto end;
    }    else    {
        DbgPrint("SQL-> Succefull connected to SQL Server. Database [%s] selected\n",SQL_DB_NAME);
        bRet = TRUE;
    }

end:
    return bRet;
#ifndef __LOG_FUNC__
#define DbgPrint DbgPrintEx
#endif
}

BOOL server_get_currency(PCHAR CurrencyId,PCHAR Currency)
{
    CHAR SqlQuery[200 * 2] =  { 0 };
    MYSQL sqlHandle;
    MYSQL_ROW sqlRow;
    MYSQL_RES *sqlRes;
    my_ulonglong Rows = 0,Fields = 0;

    if(!server_sql_connect(&sqlHandle))
    {
        goto error_end;
    }

    sprintf((PCHAR)&SqlQuery,"SELECT currency_title FROM _currency WHERE currency_id = '%d' LIMIT 1",CurrencyId);
    
    DbgPrint("-> SqlQuery %s\n",(PCHAR)&SqlQuery);
    
    if(mysql_query(&sqlHandle,(PCHAR)&SqlQuery) == 0)
    {
        sqlRes = mysql_store_result( &sqlHandle );
        if(sqlRes != NULL)
        {
            Rows = mysql_num_rows( sqlRes );
            if(Rows == 1)
            {
                while((sqlRow = mysql_fetch_row(sqlRes)))
                {
                    Rows = mysql_num_fields(sqlRes);
                    DbgPrint("-> Currency is : %s\n",sqlRow[0]);
                    strcpy(Currency,sqlRow[0]);
                    //
                }
                mysql_free_result(sqlRes);
                mysql_close(&sqlHandle);
                goto end;
            }    else    {
                DbgBreak();
                DbgPrint("-> Error get currency!1 fix it !\n");
                return FALSE;
            }
        }
    }    else    {
        // !mysql_query
        DbgPrint("-> server_get_currency. Error. Cant do SQL query %s\n",(PCHAR)&SqlQuery);
        DbgBreak();
        goto error_end;
    }


error_end:
    return FALSE;
end:
    return TRUE;
}




http://ipicture.ru/Gallery/Viewfull/24167979.html

Автор: jonie 24.9.2009, 21:17
а функция mysql_close чего - возращает void чтоли? посмотрите что она возращает, возможно поймете в чем ошибка. Проверье, что хендл при открытии равен тому что вы передаете при закрытии...

Автор: ClickF1 24.9.2009, 21:29
Код

void mysql_close(MYSQL *mysql);


Вот так...а хэндл это указатель на структуру в которой почти ничего не понятно.

Автор: jonie 24.9.2009, 22:35
ну один фиг есть mysql_error наверняка, или нет?

Автор: ClickF1 25.9.2009, 00:39
Цитата

СИНТАКСИС:

char *mysql_error(MYSQL *mysql)
ОПИСАНИЕ:

Выводит сообщение об ошибке, если ошибку вернула последняя вызванная функция MySQL. В противном случае возвращает пусту


В моем случае возвращает пустую строку..

Автор: ClickF1 25.9.2009, 00:58
Код

void my_mysql_close(MYSQL *Handle)
{
    PCHAR Error = 0;
    closesocket(Handle->net.fd);
    mysql_close(Handle);    
    Error = mysql_error(Handle);
    if(Error)
    {
        DbgPrint("my_mysql_close error : %s\n",Error);
    }
}


"MySQL server has gone away". Wtf ?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)