Запрос обновления OleDb не обновляет базу данных

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

Код запроса на обновление выглядит следующим образом:

conn.Open();
OleDbCommand UpdateUserCMD = new OleDbCommand("Update Accounts_Info Set Unique_ID=@Unique_ID, Last_Login_Date=@Last_Login_Date, Last_IP=@Last_IP, Last_MAC=@Last_MAC" + " Where Unique_ID=@Unique_ID", conn);
UpdateUserCMD.Parameters.AddWithValue("@Last_Login_Date", DateTime.Now.ToString("yyyy.MM.dd_hh:mm:ss"));
UpdateUserCMD.Parameters.AddWithValue("@Last_IP", GetIPAddress(Dns.GetHostName()).ToString());
UpdateUserCMD.Parameters.AddWithValue("@Last_MAC", GetMACAddress());
UpdateUserCMD.Parameters.AddWithValue("@Unique_ID", TempGUIDHolder);
UpdateUserCMD.ExecuteNonQuery();
conn.Close();

Строка подключения выглядит следующим образом:

OleDbConnection conn = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=E:/A-Level/Development/A_Level_AI_Project/A_Level_AI_Project/resources/Accounts.accdb");

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


person Community    schedule 12.11.2019    source источник
comment
Просто для двойной проверки, потому что вы используете базу данных на основе файлов: а) вы абсолютно уверены, что ищете в том же файле базы данных, который изменяет ваш код? И б) вы уверены, что нет ничего (например, процесса сборки), которое копирует более раннюю базу данных поверх базы данных, которую ваша программа изменяет   -  person Caius Jard    schedule 13.11.2019
comment
Совершенно точно, я могу заменить обновление запросом на вставку или удаление с использованием того же имени таблицы, и оба они работают нормально. Все остальные экземпляры соединения, открываемого с базой данных, закрываются после каждого запроса, и команды после этого запроса в той же таблице работают нормально, поэтому я не думаю, что что-то копирует более раннюю базу данных.   -  person    schedule 13.11.2019
comment
Вы меняете Unique_ID? Потому что, если вы измените его на новое значение, вы не сможете надеяться найти правильную запись в операторе where. И вы уверены, что у вас нет пустой попытки/поймать этот блок кода. Как написано, вы должны получить исключение   -  person Steve    schedule 13.11.2019


Ответы (1)


Я думаю, вам следует удалить часть вашего запроса на обновление, где вы УСТАНАВЛИВАЕТЕ уникальный идентификатор

Update Accounts_Info Set Unique_ID=@Unique_ID, Last_Login_Date ...
                         ^^^^^^^^^^^^^^^^
                         don't put this in

Причина, по которой я говорю это, заключается в том, что я почти уверен, что OLE НЕ поддерживает именованные параметры, даже если вы их написали, и это «кажется, работает» для других запросов. OLE поддерживает только позиционные параметры, поэтому порядок вызовов AddWithValue должен соответствовать порядку появления параметров в запросе.

поскольку ваш запрос содержит дополнительный параметр Uniqueid, порядок, который вы назвали AddWithValue, означает, что ваша дата входа в систему назначается для uid, ваш ip назначается для даты входа в систему, mac для ip. На самом деле он не должен запускаться, потому что для 5-го параметра не указано значение.

Если у вас возникли проблемы с пониманием того, что я имею в виду, измените все имена параметров @ в запросе на ?

После того, как вы разобрались с параметрами, зафиксируйте возвращаемое значение из ExecuteNonQuery, и оно сообщит вам, сколько записей было затронуто. Если это 0, то предложение where ничего не соответствует; дважды проверьте, что значение в tempGuidHolder отображается в таблице

Если вы перехватываете и проглатываете исключение (и я считаю, что этот код должен вызывать исключение, потому что не все параметры заполнены), не делайте этого;)

person Caius Jard    schedule 12.11.2019
comment
Насколько я знаю, правильное использование именованных параметров - можете ли вы указать что-нибудь, что говорит, что OLEDB не поддерживает это? Я уверен, что сам использовал это много раз в прошлом. Но, безусловно, нет причин обновлять уникальный идентификатор, поскольку он использовался для выбора строки в первую очередь. - person TomC; 13.11.2019
comment
docs.microsoft. com/en-us/dotnet/framework/data/adonet/ говорит При использовании параметров с OleDbCommand или OdbcCommand порядок параметров, добавляемых в коллекцию Parameters, должен соответствовать порядку определенных параметров. .. . - Я считаю, что вы можете использовать именованные параметры, но внутренне они будут обрабатываться так, как если бы вы создали их все? и вы можете поместить все, что угодно, в имя Add - named или иначе порядок важен, и для этого оператора есть 4 параметра, предоставленных оператору, который содержит 5 заполнителей. - person Caius Jard; 13.11.2019
comment
Также docs.microsoft .com/en-us/dotnet/api/ раздел комментариев OLE не поддерживает named... (другая ссылка говорит о хранимых процедурах, хотя я не ожидаю никакой разницы. .) - person Caius Jard; 13.11.2019
comment
Привет, спасибо @CaiusJard. Я должен проверить это, но это выглядит довольно ясно. Большая часть моей работы была связана с клиентом sql, поэтому это не было проблемой. Спасибо за указание на документ. - person TomC; 14.11.2019