Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

ADO и параметры [D6, MSSQL]


Страницы:   1 2

Evgeny V ©   (2008-03-14 09:38:00) 

Имеется MS SQL 2005, поле в базе типа DateTime, D6 и ADO и Студия 2005 и ADO.NET.
Есть запрос на вставку примерно такого плана для дельфи и ADO

Insert into TxRxAnalize (OperData,Duration, Base) VALUES (:P1,:P2,:P3)

(заполнение параметра происходит примерно так

AdoQuery1.Parameters.ParamByName('P1').Value:=Now; )

и для студии и ADO.NET

Insert into TxRxAnalize (OperData,Duration, Base) VALUES (@P1,@P2,@P3)

OperData - тип DateTime в базе данных.

При выполнении запроса через дельфи6-ADO ,усекается OperData до секунд, миллисекунды обнуляются. При выполнении этого запроса через ADO.NET или через ADO, но  без параметров (передаю явные значения) - усечения не происходит.  Такое же усечение наблюдается и для типа данных
Decimal при передаче значения через параметр...

Вопрос, где у меня ошибка для связки дельфи-ADO, или это его ограничение??


sniknik   (2008-03-14 10:36:00) [21]

> Не лучше ли в триггере проставлять серверное время.
на инсерт ка у тебя дальше? имхо не лучше, лучше тогда уж просто при создании таблицы поставить GetDate() полю как дефаултное значение.


ЮЮ   (2008-03-14 10:27:00) [22]

Странное желание записывать на сервере показания часов на клиенте. Не лучше ли в триггере проставлять серверное время.

Но даже записав так

CREATE TRIGGER TrustedConnections_OnInsert ON dbo.TrustedConnections
INSTEAD OF INSERT
AS
BEGIN
 INSERT INTO TrustedConnections(
   [StudentConnection],
   [TeacherConnection],
   [Test],
   [Started],
   [Finished]
 )
 SELECT
   [StudentConnection],
   [TeacherConnection],
   [Test],
    GetDate(),
   case when [Finished] IS NULL then NULL else GetDate()end
 FROM
   inserted
END


я при обычном просмотре таблицы в Manager-е не наблюдаю милисекунд.

Но это проблема отображения, а не отсечения, ибо выполнив
select * from dbo.TrustedConnections
в SQL Explorer-е я наблюжаю datetime поля в ином, отличном от Manager-а, формате и вижу, что мс там присутствуют.


sniknik   (2008-03-14 10:24:00) [23]

> миллисекунды обнуляются. При выполнении этого запроса через ADO.NET или через ADO, но  без параметров (передаю явные значения) - усечения не происходит.
не знаю как в ADO.NET передается, а в ADO параметры передаются через варианты, а в варианте в дататайме миллисекунд нет... (было так во всяком случая, когда проверял. давно)

> Такое же усечение наблюдается и для типа данных Decimal при передаче значения через параметр...
а вот это неправда... если именно тип Decimal, хотя если денежный то допускаю, там действительно только 4 знака после запятой. посмотри если гдето внутри к currency приводится то...
передавай через тип с плавающей запятой (double например).


Evgeny V   (2008-03-14 10:18:00) [24]


> Johnmen ©   (14.03.08 10:06) [2]

 -согласен, короче и удобнее и читабельнее -
так и было вначале, но  на суть не влияет, ибо то же самое делается в ParamByName...

Вопрос про усечение в силе


Johnmen   (2008-03-14 10:06:00) [25]


>  par:=Aq1.Parameters.FindParam('P1');
> ...

Зачем такие танцы?
Почему бы по-человечески не написать Aq1.Parameters.ParamByName('P1').Value:=Now;?


Evgeny V   (2008-03-14 09:59:00) [26]

Что бы удобнее искать строку #17

Так происходит усечение

procedure TMainForm.InsertRecord;
var
 par: Tparameter;
begin
 Aq1.SQL.Text := ' insert into TxRxAnalize (OperData,Duration, Base) VALUES (:P1,:P2,:P3)';
 par:=Aq1.Parameters.FindParam('P1');
 par.Value:=Now;
 par:=Aq1.Parameters.FindParam('P2');
 par.Value:=0.3985214778;
 par:=Aq1.Parameters.FindParam('P3');
 par.Value:=1;
 Aq1.ExecSQL;
end;

Так НЕ происходит усечение

procedure TMainForm.InsertRecord;
begin
 Aq1.SQL.Text := ' insert into TxRxAnalize (OperData,Duration, Base) VALUES (''15/03/2008 14:22:03.887'',0.3985214778,1)';
  Aq1.ExecSQL;
end;


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо