2013-08-16 5 views
-1

Я использую Delphi XE3 с базой данных MySQL. У меня есть привязка SQLconnection - SQLquery - DataSetProvider - ClientDataSet. Когда я ApplyUpdates изменения в CDS, это изменение влияет на базу данных правильно, но когда я обновляю CDS, «старые» значения заменяются. Код я использую:clientdataset.refresh получает старые данные

CDS.IndexFieldNames:='pop0'; 
CDS.first; 
for W := 1 to 5 do begin // display the original data 
    memo2.lines.add (IntToStr(CDS['pop0'])); CDS.Next; 
end; 
memo2.lines.add(''); 

    CDS.first; 
    CDS.Edit;     // modify data 
    CDS['pop0']:= 3004; 
    CDS.Post; 
    CDS.first; 
for W := 1 to 5 do begin // display the modified data 
    memo2.lines.add (IntToStr(CDS['pop0'])); CDS.Next; 
end; 
memo2.lines.add(''); 

CDS.ApplyUpdates(0) ; 
messagedlg('Check database',mtInformation,[mbOK],0); 
CDS.refresh; 

CDS.first; 
for W := 1 to 5 do begin // display the updated data 
    memo2.lines.add (IntToStr(CDS['pop0'])); CDS.Next; 
end; 

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

3 
4 
375 
597 
678 

4 
375 
597 
678 
986 

3 
4 
375 
597 
678 

Я попытался закрыть и открыть СД в качестве альтернативы для обновления, но я получил то же самое результат. Есть идеи, почему это происходит?

+0

Я ожидаю, что первая строка станет «3004» для модифицированных данных. Ваш результат действительно отражает ваш тестовый пример? –

+0

Вы должны проверить результат ApplyUpdates, чтобы убедиться, что ваши изменения фактически записаны в базу данных. –

+0

Какой запрос? –

ответ

1

Не могли бы вы рассказать нам, почему звонок для обновления? TClientDataSet (CDS) обычно не требует этого.

Кроме того, был открыт или закрыт SQLQuery при открытии CDS? Он должен быть закрыт, поэтому DatasetProvider (DSP) откроет его, извлечет все строки и закроет их.

Если DSP обнаруживает, что набор данных уже открыт, он будет перемещаться по записям, создавать пакет записи (называемый данными) и отправлять его на CDS. Набор данных будет оставлен один, без закрытия.

Смежные вопросы