![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
ADO и параметры [D6, MSSQL]
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;