Ошибка «Невозможно найти строку для обновления» [другой]

1

Я работаю с Delphi (XE3) и должен подключиться к базе данных MySQL. У меня странная проблема, которая кажется довольно распространенной, но я все еще не полностью решил эту проблему.

традиционные решения включают:

  • установка "Критерии обновления" в adCriteriaKey.
  • убедитесь, что таблица имеет первичный ключ (и сообщите об этом в таблице ADO)

проблема 1: запустите приложение, выполните код: если новое значение будет соответствовать тому, что уже есть в базе данных, я получаю ошибку в позиции "B".

проблема 2: запустите приложение, выполните код: если новое значение отличается от того, что уже находится в базе данных, оно будет успешно выполнено один раз и после этого, сообщите об ошибке в позиции "A".

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

object conMain: TADOConnection
  Connected = True
  ConnectionString = 
    'Provider=MSDASQL.1;Password=p;Persist Security Info=True;U' +
    'ser ID=M;Extended Properties="Driver={MySQL ODBC 5.3 ANSI Dri' +
    'ver};SERVER=yukon;DATABASE=db;UID=M;Pwd=p;PORT=3306;' +
    '"'
  LoginPrompt = False
  Mode = cmShareDenyNone
  Left = 48
  Top = 24
end

object ADOTable1: TADOTable
  Connection = conMain
  IndexFieldNames = 'FacilityID'
  TableName = 'facility'
  Left = 152
  Top = 24
end

procedure TForm1.Button1Click(Sender: TObject);
begin
  conMain.Open;
  ADOTable1.Open;
  ADOTable1.Properties.Item['Update Criteria'].Value:=adCriteriaKey;
  // **A**
  if ADOTable1.Locate('facilityid', '{C0FADCC8-15C9-48C8-8003-3BBD4AB74586}', []) then
    begin
      ADOTable1.Edit;
      ADOTable1.FieldByName('facilityaddress1').AsString:='mickey street';
      ADOTable1.Properties.Item['Update Criteria'].Value:=adCriteriaKey;
      // **B**
      ADOTable1.Post;
    end
    else
    showmessage('not found!');
  ADOTable1.Close;
  conMain.Close;
end;

это как если бы метод Post или соединение покинули базу данных в некотором промежуточном состоянии...

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

M@D3400 on db
SET NAMES latin1
SET character_set_results = NULL
SET SQL_AUTO_IS_NULL = 0
select database()
select database()
SHOW GLOBAL STATUS
SELECT @@tx_isolation
set @@sql_select_limit=DEFAULT
select * from facility
SHOW KEYS FROM 'facility'
UPDATE 'db'.'facility' SET 'FacilityAddress1'=? WHERE 'facilityid'=?
UPDATE 'db'.'facility' SET 'FacilityAddress1'='mickey street22' WHERE 'facilityid'='{C0FADCC8-15C9-48C8-8003-3BBD4AB74586}'

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

SHOW GLOBAL STATUS
M@D3400 on db
SET NAMES latin1
SET character_set_results = NULL
SET SQL_AUTO_IS_NULL = 0
select database()
select database()
SELECT @@tx_isolation
set @@sql_select_limit=DEFAULT
select * from facility
SHOW KEYS FROM 'facility'
UPDATE 'db'.'facility' SET 'FacilityAddress1'=? WHERE 'facilityid'=?
// SUCCESSFUL
UPDATE 'db'.'facility' SET 'FacilityAddress1'='mickey street22' WHERE 'facilityid'='{C0FADCC8-15C9-48C8-8003-3BBD4AB74586}'
SHOW GLOBAL STATUS
SHOW GLOBAL STATUS
SHOW GLOBAL STATUS
db
select * from facility
UPDATE 'db'.'facility' SET 'FacilityAddress1'=? WHERE 'facilityid'=?
// ERROR!
UPDATE 'db'.'facility' SET 'FacilityAddress1'='mickey street22' WHERE 'facilityid'='{C0FADCC8-15C9-48C8-8003-3BBD4AB74586}'
SHOW GLOBAL STATUS

установка "Критерии обновления" в разных местах не помогла.

уменьшил таблицу до двух полей: objectid varchar (38), facilityaddress1 varchar (50). тот же результат...

  • 0
    Вы можете получить данные из объекта WHERE facilityid = «{C0FADCC8-15C9-48C8-8003-3BBD4AB74586}» с помощью MySQL командной строки, PHPMyAdmin или mysqlworkbench?
  • 0
    да; на самом деле, я могу выполнить запрос с помощью ADOConnection столько раз, сколько я хочу (каждый раз затрагивается 1 строка).
Показать ещё 8 комментариев
Теги:
ado

1 ответ

0
Лучший ответ

form http://www.connectionstrings.com/mysql-connector-odbc-5-2/, я обнаружил:

Provider = MSDASQL; Driver = {MySQL ODBC 5.3 UNICODE Driver}; Persist Security Info = True; Server = yukon; Database = ocean; User = M; Password = p; Опция = 2;

"Вариант = 2" предлагается для VB http://dev.mysql.com/doc/connector-odbc/en/connector-odbc-configuration-connection-parameters.html#codbc-dsn-option-combos

работает!

Спасибо всем за ваш вклад.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню