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


Автор: Mackey 4.4.2013, 10:04
В базе MySQL числа хранятся в виде чисел, в программе числа используются в виде чисел.
Можно ли и забирать(вставлять) из базы числа в виде чисел?
Получается слишком много бессмысленных преобразований, создающих нагрузку на процессор:
1. Число в программе преобразовываем в строку для создания запроса (SELECT * Where a>10)
2. MySQL полученное число в виде строки опять преобразовывает в число.
3. Полученные результаты опять из числа преобразовывает в строку.
4. В программе, полученное число в виде строки опять преобразовываем в число для дальнейших операций.

Аналогично с добавлением и изменением данных в базе.

Если операций не много, на это можно не обращать внимание, а если их десятки тысяч в секунду, появляется ощутимая задержка.
Кто-нибудь знает, как эту процедуру можно ускорить?

Автор: borisbn 4.4.2013, 12:54
Для этого существуют функции xxx_bind. Я не знаю MySQL и тем более не знаю компоненты, которые ты используешь для записи/чтения, но уверен на 99,9(9)%, что в этих компонентах такие ф-ции должны быть

Автор: Mackey 5.4.2013, 08:25
Спасибо!
По наводке нашел вот что (может кому будет полезно):
Create an MYSQL structure to manage the MySQL connection
========================================================== */
if ( (conn = mysql_init(NULL) ) == NULL )
{
printf("Error %u: %s\n", mysql_errno(conn), mysql_error(conn));
exit(1);
}

/* -----------------------------------------------
Establishes a connection to the database
----------------------------------------------- */
if (mysql_real_connect(conn,server,user,passwd,database,0,NULL,0) == NULL )
{
fprintf(stderr, "%s\n", mysql_error(conn));
exit(1);
}

/* Allocate statement handler */
MYSQL_STMT *stmt;
stmt = mysql_stmt_init(conn);

if (stmt == NULL)
{
printf("Could not initialize statement handler\n");
exit(1);
}


// Prepare the statement
// Output format: string, string, double
const char *sql = "select fname, lname, salary from employee";

if (mysql_stmt_prepare(stmt, sql, strlen(sql)) != 0)
{
printf("Could not prepare statement\n");
exit(1);
}


// Bind variables
// Output format: string, string, double

MYSQL_BIND result[3]; // 3 variables

char fn[100]; // fname
char ln[100]; // lname
double sal; // salary

memset (result, 0, sizeof (result)); /* zero the structures */

result[0].buffer = (void *) &fn; // first field in fn
result[0].buffer_type = MYSQL_TYPE_STRING; // Return data as string
result[0].buffer_length = 100;

result[1].buffer = (void *) &ln; // Second field in ln
result[1].buffer_type = MYSQL_TYPE_STRING; // Return data as string
result[1].buffer_length = 100;

result[2].buffer = (void *) &sal; // 3rd field in sal
result[2].buffer_type = MYSQL_TYPE_DOUBLE; // Return data as double

if (mysql_stmt_bind_result(stmt, result) != 0)
{
printf("Could not bind results");
exit(1);
}

// Execute!!
if (mysql_stmt_execute(stmt) != 0)
{
printf("Could not execute statement");
exit(1);
}

// Prepare to retrieve the result
if (mysql_stmt_store_result(stmt) != 0)
{
printf("Could not buffer result set");
exit(1);
}


/* ===========================================
Fetch one row at a time....
=========================================== */
double totalSal = 0;

while ( mysql_stmt_fetch (stmt) == 0 )
{
printf("%s %s: Salary = %lf\n", fn, ln, sal );
totalSal += sal;
}

printf("\nTotal Salary = %lf\n\n", totalSal );

/* ===========================================
Release memory space used by stmt
=========================================== */
mysql_stmt_free_result(stmt); /* deallocate result set */

/* ===========================================
Close SQL connection
=========================================== */
mysql_close(conn);
} 

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