Исключение mySql Connector (библиотека C++ для mysql) при вставке строки в непустую таблицу

Я вообще не занимался программированием баз данных. Я работаю с некоторым примером кода для использования MySQL Connector/С++.

Когда я запускаю следующий код, я получаю сбой в последней строке некоторого кода std::string, но он ТОЛЬКО сбой, когда таблица не пуста. Если таблица пуста, она вставляет строку и работает нормально. Если таблица не пуста, происходит сбой. Я довольно смущен. Что-то я делаю неправильно с первичным ключом или другими значениями? (названия столбцов здесь изменены, в остальном код дословный)

Когда я смотрю на переменную в коде шаблона std::string (то немногое, что я вижу), я не вижу никаких знакомых значений данных, которые я пытался вставить, так что это совсем не помогло. Я вижу что-то вроде "HY000" как строковое значение, но я не уверен, откуда оно взялось.

Первоначально я думал, что это может быть строка даты, но код отлично работает с пустой таблицей, а затем вылетает, когда она не пуста. Это указывает на то, что строка даты работает нормально.

prep_stmt = con->prepareStatement("INSERT INTO 
   sometable(val1, val2, val3, Date, val5, val6, val7) 
   VALUES (?, ?, ?, ?, ?, ?, ?)");

        /*
            `idLicenses` INT NOT NULL ,
            `val1` VARCHAR(45) NOT NULL ,
            `val2` INT NOT NULL ,
            `val3` INT ZEROFILL NULL ,
            `Date` DATETIME NOT NULL ,
            `val5` VARCHAR(45) NOT NULL ,
            `val6` VARCHAR(45) NOT NULL ,
            `val7` VARCHAR(45) NOT NULL ,
        */

        //  val1, val5, val6 and val7 are std::strings, val2 and val3 are ints.
        prep_stmt->setString(1, val1);
        prep_stmt->setInt(2, val2);
        prep_stmt->setInt(3, 0);
        prep_stmt->setDateTime(4, /* I created some date string here*/);
        prep_stmt->setString(5, val5);
        prep_stmt->setString(6, val6);
        prep_stmt->setString(7, val7);
        prep_stmt->execute();

Это на платформе MS с использованием Visual Studio 2008.

База данных запущена и работает, и я могу использовать другие инструменты запросов к базе данных, чтобы просмотреть таблицы и т. д.

РЕДАКТИРОВАТЬ:

Я вижу исключение mysql, которое я получаю:

«Используется неподдерживаемый тип буфера: 4191960 (параметр: 3)» errno 2036

РЕДАКТИРОВАТЬ:

Я не уверен, что принятый ответ был правильным ответом, но это помогло мне найти решение. По сути, я удалил все ненулевые атрибуты, убрал нулевое заполнение и установил для первичного ключа автоинкремент. Теперь он работает нормально


person Tim    schedule 03.12.2009    source источник
comment
Можете ли вы опубликовать объявления переменных для val1 и т. д. Также похоже на опечатку для vale1.   -  person zooropa    schedule 03.12.2009
comment
Я предполагаю, что vale1 (и т. д.) не был частью его фактического кода, а просто скрывал от мира свои фактические имена столбцов. :)   -  person Dolph    schedule 03.12.2009
comment
Да - просто скрытие реальных значений. код компилируется и запускается. Целые числа — это целые числа, а строки символов — std::strings.   -  person Tim    schedule 03.12.2009


Ответы (1)


Я подозреваю, что это либо ваш нулевой столбец INT, либо столбец DATETIME (не уверен, что это столбец 3).

Попробуйте создать таблицу с чем-то вроде:

`val3` INT(10) ZEROFILL ,

где 10 — количество позиций для заполнения нулями. Я также не уверен, что NULL необходим, поэтому я исключил его выше.

Кроме того, можете ли вы опубликовать созданную вами строку даты, если вышеизложенное не работает?

person Dolph    schedule 03.12.2009
comment
Спасибо за предложение - буду обновлять. Любопытно, почему это работает, когда таблица пуста, но НЕ когда в таблице есть строка... - person Tim; 03.12.2009
comment
Я попробую удалить таблицу и создать ее по-другому. - person Tim; 03.12.2009
comment
Я не уверен, что это был правильный ответ, но он помог мне найти решение. По сути, я удалил все ненулевые атрибуты, убрал нулевое заполнение и установил для первичного ключа автоинкремент. Теперь он работает нормально - person Tim; 03.12.2009
comment
Ах, я не понял, что ПК не был установлен на авто. Я не знаю, почему это БУДЕТ работать в первый раз (и что означает эта ошибка), но вы определенно нарушали NOT NULL в своем поле PK, не устанавливая его вручную. Рад, что смог помочь, если бы помог :P - person Dolph; 04.12.2009
comment
Я предполагаю, что это также было нулевое заполнение, поэтому оно просто сделало его нулевым для первого. (Когда была одна запись, идентификатор был 0) - person Tim; 05.12.2009