Подготовленный оператор mysql: запрос на обновление

Я пытаюсь выполнить программу C, используя API mysql C, подключаясь к mysql с запросом на обновление, и я не получаю никаких ошибок компиляции или связывания, но строки в таблице db не обновляются.

Когда я запускаю этот код, я получаю пустые значения, обновленные в emp. поле состояния

#define STRING_SIZE 256

char* eStatus,myeStatus;

int myempid,empid;


int i;
for(i = 0; i < 5 ; i++){
const char* sqlQuery = "update employee_info set estatus = ? where empID = ?";
    if (mysql_stmt_prepare(stmt, sqlQuery, strlen(sqlQuery))) {
            fprintf(stderr, " mysql_stmt_prepare(), update failed\n");
            fprintf(stderr, " %s\n", mysql_stmt_error(stmt));
            return -1;
          }

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

if (info.state == 2)

      eStatus = "present";

else
      eStatus = "absent";

empid = i;
// Init param structure
            // Select
            param[0].buffer_type = MYSQL_TYPE_STRING;
            param[0].buffer = (void *) &eStatus;
            param[0].buffer_length = STRING_SIZE;
            param[0].is_null = 0;
            param[0].length = &str_length;

            param[1].buffer_type = MYSQL_TYPE_SHORT;
            param[1].buffer = (void *) &myempID;
            param[1].buffer_length = STRING_SIZE;

            param[1].is_null = 0;
            param[1].length = 0;

        myeStatus = eStatus;
    myempid = empid;
               if (mysql_stmt_bind_param(stmt, param) != 0) {
            fprintf(stderr, " mysql_stmt_bind_param() failed\n");
            fprintf(stderr, " %s\n", mysql_stmt_error(stmt));
            return -1;
        }
               /* Execute the statement */
        if (mysql_stmt_execute(stmt)) {
            fprintf(stderr, " mysql_stmt_execute(), failed\n");
            fprintf(stderr, " %s\n", mysql_stmt_error(stmt));
                return -1;
        }

} // end of for loop

Схема таблицы в mysql

empid INT(11)

состояние варчар (10)

Я не могу понять, почему статус не обновляется в таблице mysql. Это несоответствие типов данных или значения неправильно привязаны к sqlquery?
Есть подсказки? Спасибо.


person Kerol Karper    schedule 05.09.2012    source источник


Ответы (2)


Вы можете найти здесь: Запись в базу данных mysql из одноплатный компьютер с использованием c полный пример того, как использовать MYSQL C API для выполнения запросов, если у вас все еще есть проблемы, опубликуйте весь код.

person TOC    schedule 05.09.2012
comment
ОП запрашивает подготовленные заявления. Где они встречаются в приведенном вами примере? - person Leo; 05.02.2013

Почему вы пытаетесь использовать «где empID =?». Если вы хотите, чтобы он выполнялся для каждого сотрудника, просто опустите предложение where. Если для конкретного сотрудника, то там должен быть его id.

Проблем может быть и больше, но это первое, что я нашел.

Вы можете проверить это, попытавшись выполнить тот же запрос в командной строке mysql.

Редактировать: я также не вижу никакого установленного соединения с базой данных и какой-либо информации, связанной с этим. Что-то типа

MYSQL *conn = mysql_init(NULL);

*conn = mysql_real_connect(*conn, DB_HOST, DB_USER, DB_PASS, DB_NAME, 0, NULL, flags);

if (*conn != NULL)
{
    printf("Connection Successfull\n");
    status = 0;
}
person fkl    schedule 05.09.2012
comment
У меня есть этот код подключения к базе данных, правильно написанный и протестированный ... я написал предложение where, потому что я обновляю несколько строк для empid 0,1,2,3,4 ... и соответствующий статус я получаю в константе переменной C. .. на основе этого значения я должен обновить статус - person Kerol Karper; 05.09.2012
comment
У вас есть вызов инициализации? Поскольку вы используете подготовленные операторы, это будет stmt = mysql_stmt_init(mysql); перед любым другим вызовом? dev.mysql.com/doc/refman/5.0/ ru/mysql-stmt-execute.html - person fkl; 05.09.2012
comment
да ... все присутствует ... и тот же код работает со статическими запросами, такими как выбор из таблицы, создание таблицы ... оба работают правильно ... просто это обновление создает проблему, поскольку мне нужно привязать значения к запросу динамично - person Kerol Karper; 05.09.2012
comment
@Kerol, значит, вы имеете в виду фактическое предложение where в вашем случае имеет empid = 1 или 2 (некоторое число) вместо вопросительного знака? - person fkl; 05.09.2012
comment
Поля param[1] привяжут значение ко второму '?' в запросе во время привязки, и param[1] привяжет к нему estatus. - person Kerol Karper; 05.09.2012