Отправляет email-рассылки с помощью сервиса Sendsay

RFpro.ru: СУБД и Delphi/Lazarus

  Все выпуски  

RusFAQ.ru: СУБД и Delphi


Хостинг Портала RusFAQ.ru:
MosHoster.ru - Профессиональный хостинг на Windows 2008

РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / СУБД и Delphi

Выпуск № 505
от 20.10.2008, 17:05

Администратор:Gh0stik
В рассылке:Подписчиков: 245, Экспертов: 22
В номере:Вопросов: 1, Ответов: 2

Нам важно Ваше мнение об этой рассылке.
Оценить этот выпуск рассылки >>


Вопрос № 147310: Прошу совета я выложу код он работает не всегда корректно в базу заносятся значения через раз.. где допустил ошибку не знаю <img src="http://rusfaq.ru/images/Forum/7.gif" border="0"> ...

Вопрос № 147.310
Прошу совета я выложу код он работает не всегда корректно в базу заносятся значения через раз.. где допустил ошибку не знаю

Приложение:

Отправлен: 15.10.2008, 17:04
Вопрос задал: Agkadekin (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 2)

Отвечает: Шичко Игорь
Здравствуйте, Agkadekin!
Вы не написали с какой СУБД работаете, но навскидку несколько советов (из-за которых могут не работать запросы на добавление и занесение данных):
1. При занесении строковых данных используйте конструкцию QuotedStr('текст'). Она сама добавит кавычки где нужно.
2. Если поле TAB_ID числовое, то не нужно дополнительных кавычек.
Запрос преобразуется в вид:
With DataModule1.IBSQL1.SQL Do
Begin
Clear;
Add('INSERT INTO Sotr_Table');
Add(' (FIO,');
Add(' TAB_ID,');
Add(' Data,');
Add(' Time_Prix)');

Add(' VALUES (QuotedStr(suiEdit2.Text) + ', ');
Add(QuotedStr(Tabel.Text) + ', '); // или Add(Tabel.Text + ', '); {если TAB_ID - числовое поле}
Add(QuotedStr(DateToStr(DateTimePicker1.Date)) + ', ');
Add(QuotedStr(TimeToStr(Now())) + ') ');
DataMod ule1.Updates;
DataModule1.IBSQL1.ExecQuery;
End;
Далее нужно разобраться в каком формате даты СУБД воспринимает данные.
Функция DateToStr() формирует дату в виде dd.mm.yyyy.
Попробовать заносить её в виде yyyy-mm-dd.
Эти же пожелания относятся и к запросам SELECT и UPDATE.
Будут вопросы или неясности, пишите в личную почту.
Ответ отправил: Шичко Игорь (статус: 10-ый класс)
Ответ отправлен: 16.10.2008, 09:11

Отвечает: Виктор Пырлик
Здравствуйте, Agkadekin!

SelectSQL.Add(' SELECT User_Spisok.*, Sotr_Table.*');
SelectSQL.Add(' FROM User_Spisok, Sotr_Table');


Конструкция весьма странная.. вы хотите получить полное объединение, причем, никоим образом не связанных таблиц.
Да и проще: SelectSQL.Add(' SELECT User_Spisok.*, Sotr_Table.* FROM User_Spisok, Sotr_Table');

вот, немного подправлено:
Код:
procedure TProxod_Form.Proverka;
var s:String;
begin
With DataModule1.IBDataSet2 do
if DateToStr(DateTimePicker1.Date) = FieldByName('Data').AsString then begin

if Tabel.Text = FieldByName('Tab_ID').AsString Then
Begin
Act ive := False;
SelectSQL.Clear;
s := Format('SELECT * FROM SOTR_TABLE WHERE TAB_ID = %d AND DATA = %s',
[
StrToInt(Tabel.Text),
QuotedStr(DateToStr(DateTimePicker1.Date))
]
); // ТАК ПРОЩЕ
SelectSQL.SQL.Add(s);
Active := True;
Timer1.Enabled := True
end
else
begin
//Timer3.Enabled := True
pusk
end;
end;
end;
procedure TProxod_Form.Pusk;
begin
Timer3.Enabled := True;
end;


Код:
procedure TProxod_Form.SaveClick(Sender: TObject);
var s:String;
begin
If Ta bel.Text <> '' Then

With DataModule1.IBSQL1.SQL Do
Begin
Clear;
s := Format( 'INSERT INTO Sotr_Table (FIO,TAB_ID,Data,Time_Prix)'
+' VALUES (%s,%d,%s,%s)',
[
QuotedStr(suiEdit2.Text),
StrToInt(Tabel.Text),
QuotedStr(DateToStr(DateTimePicker1.Date)),
QuotedStr(TimeToStr(Now()))
]
);
Add(s);
try
DataModule1.IBSQL1.ExecQuery;
except on E: Exception do
MessageBox(GetActiveWindow,PChar(e.Message,'Ошибка',MB_OK+MB_ICONSTOP));
end;
End;
DataModule1.IBTransaction1.CommitRetaining;
Zapusk;
end;


Ну и.. у Вас есть поля, в которые Вы заносите текущую дату/время.. Для этого, можно назначи ть в базе данных таким полям значения по умолчанию.. т.е. например, CURRENT_TIMESTAMP
Тогда, Вам не надо будет в INSERT передавать эти значения.. СУБД сама заполнит их текущими значениями.

PS: Не рекомендую использовать повсеместно конструкцию With – в ней затруднена отладка (не видны переменные). Это удобно порой, согласен, но в меру..
Так же, при всех манипуляциях с данными, делайте это в защищенном участке кода
Например:
try
DataModule1.IBSQL1.ExecQuery;
except on E: Exception do
MessageBox(GetActiveWindow,PChar(e.Message,'Ошибка',MB_OK+MB_ICONSTOP));
end;





---------
не получается там - где не пробуют
Ответ отправил: Виктор Пырлик (статус: Профессионал)
Россия, Екатеринбург
Тел.: 89043822027
ICQ: 490191733
----
Ответ отправлен: 16.10.2008, 09:45


Вы имеете возможность оценить этот выпуск рассылки.
Нам очень важно Ваше мнение!
Оценить этот выпуск рассылки >>

Отправить вопрос экспертам этой рассылки

Приложение (если необходимо):

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

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


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2008, Портал RusFAQ.ru, Россия, Москва.
Авторское право: ООО "Мастер-Эксперт Про"
Техподдержка портала, тел.: +7 (926) 535-23-31
Хостинг: "Московский хостер"
Поддержка: "Московский дизайнер"
Авторские права | Реклама на портале

∙ Версия системы: 5.6 от 14.10.2008

Яндекс Rambler's Top100
RusFAQ.ru | MosHoster.ru | MosDesigner.ru
RusIRC.ru | Kalashnikoff.ru | RadioLeader.ru

В избранное