Access Database - Авто ВСТАВИТЬ \ ОБНОВЛЕНИЕ - Qt4 - PullRequest
1 голос
/ 01 мая 2011

В программном обеспечении для регистрации, созданном с помощью Qt4, я открываю базу данных Access .mdb, обновляя ее с помощью пользовательских полей.

В настоящее время у него есть таблица clients с шестью полями:

 CustomerNumber, FullName, CNICNumber, ResidentialAddress, ResidentialPhoneNumber, MobileNumber 

, где CustomerNumber - первичный ключ и номер, а все остальные - текстовые.Есть несколько записей.Но при попытке вставить другую запись с таким же CustomerNumber возникает ошибка:

QODBCResult :: exec: Невозможно выполнить инструкцию: "[Microsoft] [ODBC Microsoft Access Driver] TheЗапрошенные вами изменения в таблице не увенчались успехом, поскольку они будут создавать повторяющиеся значения в индексе, первичном ключе или взаимосвязи. Измените данные в поле или полях, содержащих повторяющиеся данные, удалите индекс или переопределите индекс, чтобы разрешить повторяющиеся записии попробуй еще раз."

"[Microsoft] [ODBC Microsoft Access Driver] Запрошенные вами изменения в таблице не увенчались успехом, так как они могли создать дублирующиеся значения в индексе, первичном ключе или отношении. Измените данные в поле или поляхкоторые содержат повторяющиеся данные, удаляют индекс или переопределяют индекс, чтобы разрешить повторяющиеся записи, и повторите попытку. "«QODBC3: невозможно выполнить оператор»

Затем я нашел запрос UPDATE, но следующий код выдает еще одну ошибку:

query.exec("UPDATE clients"
"SET FullName='"+cname+"', CNICNumber='"+cnic+"', ResidentialAddress='"+caddress+"', ResidentialPhoneNumber='"+cphone+"', MobileNumber='"+cmobile+"'"
"WHERE CustomerNumber="+cnumber+";");

Переменные cname, cninc, caddresss, cphone, cmobile, cnumber являются строкамисо значениями.Но ошибка с указанным выше кодом:

QODBCResult :: exec: Невозможно выполнить оператор: «[Microsoft] [Диспетчер драйверов ODBC] Ошибка последовательности функций» »[Microsoft] [Диспетчер драйверов ODBC]Ошибка последовательности функций "" QODBC3: невозможно выполнить оператор "

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

Ответы [ 4 ]

4 голосов
/ 01 мая 2011

Вам не хватает пробелов. Фактическая команда, которую вы выполняете, эквивалентна

    query.exec("UPDATE clientsSET Fullname...

нет такой таблицы как clientsSET.

Вот что вы намеревались

    query.exec("UPDATE clients"
    " SET FullName='"+cname+"', CNICNumber='"+cnic+"', ResidentialAddress='"+caddress+"', ResidentialPhoneNumber='"+cphone+"', MobileNumber='"+cmobile+"'"
    " WHERE CustomerNumber="+cnumber+";");

Если это пользовательские значения, вы уязвимы для внедрения SQL. Вы должны быть осторожны, чтобы очистить все строковые значения (например, заменить все «на»).

1 голос
/ 03 мая 2011

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

Это неофициально известно как UPSERT. См. этот ответ , относящийся к Access.

0 голосов
/ 01 мая 2011

Можете ли вы попробовать:

+ " SET FullName='"+cname+ ...
+ " WHERE CustomerNumber="+cnumber+";");

во втором и третьем ряду?

0 голосов
/ 01 мая 2011
query.exec("UPDATE clients"
...CNICNumber='"+cnic+"', ...

Я думаю, что CNICNumber не должен иметь одинарных кавычек.

...CNICNumber="+cnic+", ...

Но невозможно сказать наверняка, не зная структуру таблицы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...