Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.209.66.87] |
|
Сообщ.
#1
,
|
|
|
В базе MySQL числа хранятся в виде чисел, в программе числа используются в виде чисел.
Можно ли и забирать(вставлять) из базы числа в виде чисел? Получается слишком много бессмысленных преобразований, создающих нагрузку на процессор: 1. Число в программе преобразовываем в строку для создания запроса (SELECT * Where a>10) 2. MySQL полученное число в виде строки опять преобразовывает в число. 3. Полученные результаты опять из числа преобразовывает в строку. 4. В программе, полученное число в виде строки опять преобразовываем в число для дальнейших операций. Аналогично с добавлением и изменением данных в базе. Если операций не много, на это можно не обращать внимание, а если их десятки тысяч в секунду, появляется ощутимая задержка. Кто-нибудь знает, как эту процедуру можно ускорить? |
Сообщ.
#2
,
|
|
|
Использовать параметры? Например, для MSSQL в WinAPI есть функции SQLBindParameter и SQLBindCol, для привязки параметра и столбца соответственно. Думаю, что что-то подобное должно быть и для MySQL.
|
Сообщ.
#3
,
|
|
|
Спасибо!
По наводке нашел вот что (может кому будет полезно): 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); } |