Я работаю с Delphi (XE3) и должен подключиться к базе данных MySQL. У меня странная проблема, которая кажется довольно распространенной, но я все еще не полностью решил эту проблему.
традиционные решения включают:
проблема 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). тот же результат...
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
работает!
Спасибо всем за ваш вклад.
facilityid
= «{C0FADCC8-15C9-48C8-8003-3BBD4AB74586}» с помощью MySQL командной строки, PHPMyAdmin или mysqlworkbench?