Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Как отучить C# вставлять 30.12.1899? / 10 сообщений из 10, страница 1 из 1
28.05.2004, 16:02
    #32539191
Pipensa
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как отучить C# вставлять 30.12.1899?
В базе на MSSQL2000 есть табличка с одним из полей с типом DateTime.
Табличка уже заполнена, и все значения приведены к виду 12:30:00, то есть только время, дата отброшена, и сервер позволяет такое.
А вот для С# это посто немыслимо!!
Ему обязательно надо засунуть в это поле еще и дату!
Причем какую-нить левую типа 30.12.1899.
То есть если я создаю датаадаптер к этой табличке (визардом), генерирую им датасет, то в датасете появится поле с типом System.DateTime.
Соответствующие параметры в командах датаадаптера тоже требуют этот тип.

Из всего этого вытекают следующие проблемы:
1. При отображении в гриде мы увидим: 30.12.1899, а время - фиг.
Эту проблему тут уже вроде как решили в теме "В Ацессе одно, в Гриде другое! Где вилы?" (/topic/82233&hl=datetime), с помощью DataGridTableStyle.

2. Даже если мы и будем в гриде отображать только время, в датасете всеравно будет лежать полная версия вместе с днем, месяцем и годом. И как только мы сделаем Update или Insert - датаадаптер вставит в базу полную версию, то есть получим чтото типа: 28.05.2004 12:30:00! А мне этого в базе совсем не хочется.

Как с этим бороться?? (с пунктом 2)

В той теме автор вроде как юзал OleDbType.DBTimeStamp для oleDbUpdateCommand1.Parameters.
Но у меня sqlDataAdapter и MSSQL2000, и при генерации датасета адаптер автоматически выставляет тип DateTime!
То есть SelectCommand заполняет датасет типом Datetime.
А если у UpdateCommand поменять тип параметра на любой отличный от DateTime то сразу будет ошибка преобразования типа, ведь мы его заставляем из датасета взять тип DateTime, а в базу записать его как другой.

Я просто в тупике, как быть то?
...
Рейтинг: 0 / 0
28.05.2004, 16:05
    #32539197
Hermitap
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как отучить C# вставлять 30.12.1899?
я бы необращал внимание на C# и обработал сохранение Даты сохраненкой в которой T-SQLем дата была приведена в нужный мне формат.
...
Рейтинг: 0 / 0
28.05.2004, 17:36
    #32539420
Pipensa
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как отучить C# вставлять 30.12.1899?
Честно говоря не хотелось бы лезть в базу и вносить там какие-то изменения, а хотелось бы все решить на уровне приложения, не затрагивая базу.
Неужели нет решения?
Если так, то можно поподробнее насчет хранимых процедур - мне нужно будет полностью весь датаадаптер создавать на основе процедур?
И вообще как это будет выглядеть. Ведь когда создаешь адаптер визардом, то там три варианта:
- на основе SQL запроса
- на основе новой процедуры
- на основе уже существующей процедуры
какой выбирать? Понятно что если третий то в базе нужно самому создать процедуры для всех 4 команд -select, delete, insert и update. А где именно указывать обработчик для даты?
Я так понимаю нужна процедура которая бы преобразовывала DateTime в что-то типа 12:30:00, и которую можно было бы использовать в качестве UpdateCommand для sqlDataAdaptera.
Можно показать примерно как это все будет выглядеть?
...
Рейтинг: 0 / 0
28.05.2004, 18:05
    #32539454
Hermitap
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как отучить C# вставлять 30.12.1899?
Ой.
Значится так. Если Вы пишите более менее мощное приложение, то переходите на insert ... Update.... Delete таблиц через сохраненку.
Потому как работая через сохраненку можно максимальное количество логики при insert update delete перенести на сервер. Это позволит при необходимости менять логику не трогая клиена.
...
Рейтинг: 0 / 0
28.05.2004, 18:23
    #32539481
Hermitap
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как отучить C# вставлять 30.12.1899?
Вот например сохраненка на insert update b delete
(на select совсем необязательно делать сохраненку)
90% логики в сохраненке.

сразу после слова AS можно написать код который обработает дату к нужному Вам формату. Во вторых и от клинта независеть будете.






Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
228.
229.
230.
231.
232.
233.
234.
235.
236.
237.
238.
239.
240.
241.
242.
243.
244.
245.
246.
247.
248.
249.
250.
251.
252.
253.
254.
255.
256.
257.
258.
259.
260.
261.
262.
263.
264.
265.
266.
267.
268.
269.
270.
271.
272.
273.
274.
275.
276.
277.
278.
279.
280.
281.
282.
283.
284.
285.
286.
287.
288.
289.
290.
291.
292.
293.
294.
295.
296.
297.
298.
299.
300.
301.
302.
303.
304.
305.
306.
307.
308.
309.
310.
311.
312.
313.
314.
315.
316.
317.
318.
319.
320.
321.
322.
323.
324.
325.
326.
327.
328.
329.
330.
331.
332.
333.
334.
335.
336.
337.
338.
339.
340.
341.
342.
343.
344.
345.
346.
347.
348.
349.
350.
351.
CREATE PROCEDURE EntWorkSpaceActionEdit

	 @EntWorkSpaceActionID INT,
	 @TypeAction int, 
	 @StuffID int, 
	 @EntStuffID int, 
	 @DateOperation datetime, 
	 @hUnit int, 
	 @hUploader varchar ( 100 ), 
	 @Qnty float, 
	 @Topic varchar ( 150 ), 
	 @hParty int, 
	 @invoiceNum varchar ( 60 ), 
	 @hInvoice int, 
         @Uploaders Varchar( 50 ),
         @OnOrders Varchar( 100 ),
         @Blocked int =  0 ,
         @OnReserved Int =  0 ,
         @ReservedID Int =  0 ,
         @OrdrID Int =  0 ,
         @PartyNum Varchar( 50 ) = '0',
         @EntStuffWorkSpaceID int =  0 ,
         @RearEntrance Int =  0 ,  -- Черный ход
 
         @R3Num varchar( 60 ) = '',
         @NormQnty float =  0 ,
         @EntMixingActID int =  0 ,
	 @MasterMixsingMaterial int =  0 ,
         @StatusParty int =  1 ,
         @MasterEntWorkSpaceActionID INT =  0 ,  -- поле для определения зависимости расхода от прихода
 
         @NeedControlParty int =  0 
AS

Declare @LastIdentity Int 
Select @LastIdentity =  0 
IF @StatusParty is NULL Select @StatusParty =  1 
IF @EntMixingActID is Null Select @EntMixingActID =  0 
IF @MasterMixsingMaterial is Null Select @MasterMixsingMaterial =  0 
IF @MasterEntWorkSpaceActionID is Null Select @MasterEntWorkSpaceActionID =  0 

Select @Qnty = Round(@Qnty, 4 )  -- Округляем количество до 4 знаков ....
 


IF (Select Blocked from EntWorkSpaceAction where EntWorkSpaceActionID  = @EntWorkSpaceActionID) =  1 
 BEGIN
	     RAISERROR ('Запись заблокирована. ', 16 , 10 ) 
	     RETURN
 END

IF @EntStuffWorkSpaceID =  0  
	   BEGIN
	     RAISERROR ('В программе сделаны изменения. Перезапустите программу', 16 , 10 ) 
	     RETURN
	   END



IF @EntWorkSpaceActionID =  0  
BEGIN
 --=====================================================================================
 
IF @ReservedID >  0   --Проверяем не резерв ли это И обрабатываем соответственно.
 
BEGIN
	IF @TypeAction =  2 
	 BEGIN
	  IF (dbo.EntRestOnStuffWControlParty(@EntStuffID,@StuffID, 1 )-@Qnty) < 0  
	   BEGIN
	     RAISERROR ('Добавить расход из резерва невозможно. Это приведет к отрицательному остатку.Отредактируйте количество выдачи.', 16 , 10 ) 
	     RETURN
	   END
         --(((((((((((((((((((((((((((((((((((((((
 
          Select @Blocked =  1 
          IF  (select Qnty from EntWorkSpaceAction where EntWorkSpaceActionID = @EntWorkSpaceActionID) > @Qnty
	   BEGIN
	     RAISERROR ('Выдать из резерва невозможно. Вы пытаетесь выдать больше чем зарезервировано.', 16 , 10 ) 
	     RETURN
	   END

          exec EntUpdateReservedCount @ReservedID,@Qnty
          
         --(((((((((((((((((((((((((((((((((((((((
 
	END
END
IF @ReservedID =  0    -- Обработка обычного расхода
 
BEGIN
	IF @TypeAction =  2  and @StatusParty =  1 
        BEGIN
         IF @RearEntrance =  0   -- Черный ход выключен
 
             BEGIN
	     IF (dbo.EntRestOnStuffWControlParty(@EntStuffID,@StuffID, 1 ) - dbo.EntReserveOnStuff(@EntStuffID,@StuffID) - @Qnty) < 0  
	           BEGIN
                   RAISERROR ('Добавить расход невозможно. Это приведет к отрицательному остатку', 16 , 10 ) 
 	           RETURN
                   END
	     END
         IF @RearEntrance =  1   -- Черный ход включен (для перемещений между складами без учета резерва)
 
             BEGIN
	     IF (dbo.EntRestOnStuffWControlParty(@EntStuffID,@StuffID, 1 ) - @Qnty) < 0  
	           BEGIN
                   RAISERROR ('Добавить расход невозможно. Это приведет к отрицательному остатку', 16 , 10 ) 
 	           RETURN
                   END
	     END
        END
	IF @TypeAction =  2  and @StatusParty <>  1   -- Выдаем партию попартийно.
 
        BEGIN
          IF @StatusParty =  0 
         	   BEGIN
                   RAISERROR ('Партия непроверена. Расход невозможен.', 16 , 10 ) 
 	           RETURN
                   END
          IF @StatusParty >  1 
         	   BEGIN
                   IF @Qnty > (Select Qnty from EntWorkSpaceAction where EntWorkSpaceActionID = @MasterEntWorkSpaceActionID) - (Select ISNULL(SUM(QNTY), 0 ) from EntWorkSpaceAction where Typeaction =  2  and MasterEntWorkSpaceActionID = @MasterEntWorkSpaceActionID)
                      BEGIN
                       Select @Qnty = (Select Qnty from EntWorkSpaceAction where EntWorkSpaceActionID = @MasterEntWorkSpaceActionID) - (Select ISNULL(SUM(QNTY), 0 ) from EntWorkSpaceAction where Typeaction =  2  and MasterEntWorkSpaceActionID = @MasterEntWorkSpaceActionID)
                       IF @Qnty =  0  or @QNTY < 0 
                          BEGIN
		                   RAISERROR ('Эта партия выдана.', 16 , 10 ) 
 	        		   RETURN
                          END
                      END
                   END
        END
END



 IF (@Qnty <=  0  )
   BEGIN
     RAISERROR ('Неверно указано количество материала.', 16 , 10 ) 
     RETURN
   END

 --=====================================================================================
 
 --=====================================================================================
 
 --IF @TypeAction = 3
 
 -- BEGIN
 
 --  IF (dbo.EntRestOnStuff(@EntStuffID,@StuffID) - @Qnty) <0 
 
 --   BEGIN
 
 --     RAISERROR ('Добавить резерв невозможно. Это приведет к отрицательному остатку',16,10) 
 
 --     RETURN
 
 --   END
 
 --END
 
 --=====================================================================================
 
 --IF @PartyNum<>'' Select @StatusParty = 1
 
IF @NeedControlParty =  1  and @TypeAction <>  2  Select @StatusParty =  0   --Контроль партии на расходе неможнт существовать.
 
IF @StatusParty= 0  and @TypeAction =  2  Select @StatusParty =  1  --Контроль партии на расходе неможнт существовать.
 
IF @StatusParty= 0  and @TypeAction =  3  Select @StatusParty =  1  --Контроль партии на расходе неможнт существовать.
 

INSERT EntWorkSpaceAction (
	 [EntStuffWorkSpaceID],
	 [TypeAction],
	 [StuffID],
	 [EntStuffID],
	 [DateOperation],
	 [hUnit],
	 [hUploader],
	 [Qnty],
	 [Topic],
	 [hParty],
	 [invoiceNum],
	 [hInvoice],
	 [Blocked],
	 [OnOrders],
	 [OnReserved],
	 [OrdrID],
	 [PartyNum],
         realDateOperation,
         R3Num,
         NormQnty,
         EntMixingActID,
         MasterMixsingMaterial,
         StatusParty,
         MasterEntWorkSpaceActionID,
         NeedControlParty
	)
VALUES (
	 @EntStuffWorkSpaceID,
	 @TypeAction,
	 @StuffID,
	 @EntStuffID,
	 @DateOperation,
	 @hUnit,
	 @hUploader,
	 @Qnty,
	 @Topic,
	 @hParty,
	 @invoiceNum,
	 @hInvoice,
	 @Blocked,
	 @OnOrders,
	 @OnReserved,
	 @OrdrID,
	 @PartyNum,
         GetDate(),
         @R3Num,
         @NormQnty,
         @EntMixingActID,
         @MasterMixsingMaterial,
         @StatusParty,
         @MasterEntWorkSpaceActionID,
         @NeedControlParty
	)

Select @LastIdentity = @@IDentity
END

IF @EntWorkSpaceActionID >  0  
BEGIN
IF (Select Blocked from EntWorkSpaceAction where EntWorkSpaceActionID = -@EntWorkSpaceActionID)> 0  
   BEGIN
     RAISERROR ('Редактирование невозможно.Запись заблокирована. (Либо выдача из резерва, либо требуется контроль партии ', 16 , 10 ) 
   RETURN
   END
 IF (@Qnty <=  0  )
   BEGIN
     RAISERROR ('Неверно указано количество материала.', 16 , 10 ) 
     RETURN
   END


UPDATE EntWorkSpaceAction SET
	 [TypeAction] = @TypeAction,
	 [DateOperation] = @DateOperation,
	 [hUnit] = @hUnit,
	 [hUploader] = @hUploader,
	 [Qnty] = @Qnty,
	 [Topic] = @Topic,
	 [hParty] = @hParty,
	 [invoiceNum] = @invoiceNum,
         OnOrders=@OnOrders,
         OnReserved=@OnReserved,
         OrdrID=@OrdrID,
 --         PartyNum=@PartyNum,
 
         realDateOperation = GetDate(),
         R3Num = @R3Num,
         NormQnty = @NormQnty
WHERE  	 [EntWorkSpaceActionID] = @EntWorkSpaceActionID

 -- Обнуляем партию если это обычный приход.
 
IF @PartyNum = '' 
UPDATE EntWorkSpaceAction 
SET  StatusParty =  1  where [EntWorkSpaceActionID] = @EntWorkSpaceActionID

Select @LastIdentity = @EntWorkSpaceActionID
END

IF @EntWorkSpaceActionID <  0  
BEGIN
 --=====================================================================================
 
 --IF @TypeAction = 3
 
 -- BEGIN
 
 --  IF (dbo.EntRestOnStuff(@EntStuffID,@StuffID) - @Qnty) <0 
 
 --   BEGIN
 
 --     RAISERROR ('Удаление невозможно. Это приведет к отрицательному остатку',16,10) 
 
 --   RETURN
 
 --   END
 
 --END
 
 --=====================================================================================
 
 --=====================================================================================
 
IF @TypeAction =  2 
 BEGIN
 --  IF (dbo.EntRestOnStuff(@EntStuffID,@StuffID) - @Qnty) <0 
 
 --   BEGIN
 
 --     RAISERROR ('Удаление невозможно. Это приведет к отрицательному остатку',16,10) 
 
 --   RETURN
 
 --   END
 
 IF (Select Blocked from EntWorkSpaceAction where  [EntWorkSpaceActionID] = -@EntWorkSpaceActionID) =  1 
    BEGIN
    RAISERROR ('Эта запись заблокирована. ', 16 , 10 ) 
    RETURN
    END
END
 --=====================================================================================
 
 --=====================================================================================
 
IF @TypeAction =  1 
 BEGIN
  IF (Select dbo.EntRestOnStuff(@EntStuffID,@StuffID) - @Qnty) < 0  
   BEGIN
     RAISERROR ('Удаление невозможно. Это приведет к отрицательному остатку ', 16 , 10 ) 
   RETURN
   END
END

IF (Select hInvoice from EntWorkSpaceAction where EntWorkSpaceActionID = -@EntWorkSpaceActionID)> 0  
   BEGIN
     RAISERROR ('Удаление невозможно.На эту позицию выписна накладная. (расходная либо приходная) ', 16 , 10 ) 
   RETURN
   END

IF (Select Blocked from EntWorkSpaceAction where EntWorkSpaceActionID = -@EntWorkSpaceActionID)> 0  
   BEGIN
     RAISERROR ('Удаление невозможно.Либо из резерва, либо требуется контроль в лаборатории. ', 16 , 10 ) 
   RETURN
   END

Delete from EntWorkSpaceAction where  [EntWorkSpaceActionID] = -@EntWorkSpaceActionID
Select @LastIdentity =  0 
END


Select 'ID' = @LastIdentity
GO


...
Рейтинг: 0 / 0
29.05.2004, 11:28
    #32539761
Pipensa
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как отучить C# вставлять 30.12.1899?
Ок. Взял для примера малюсенькую табличку где 2 поля - ROW_ID и ROW_TIME.
В этом ROW_TIME пусть лежат значения вида 12:30:00, типа DateTime.
Задача - показать юзеру табличку и дать изменить поле ROW_TIME.
Естесственно в датасете они превратятся в 30.12.1899 12:30:00.
Ладно, с выводом без года месяца и дна разберемся. Но надо не дать сохранить в базе эту бяку. Только 12:30:00.

Если создать датаадаптер визардом, и указать чтоб он сам сгенерировал процедуры на основе данной таблички получим вот что:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
CREATE PROCEDURE dbo.NewSelectCommand
AS
	SET NOCOUNT ON;
SELECT ROW_ID, ROW_TIME FROM Table1
GO


CREATE PROCEDURE dbo.NewDeleteCommand
(
	@Original_ROW_ID int,
	@Original_ROW_TIME datetime
)
AS
	SET NOCOUNT OFF;
DELETE FROM Table1 WHERE (ROW_ID = @Original_ROW_ID)
AND (ROW_TIME = @Original_ROW_TIME OR @Original_ROW_TIME IS NULL AND ROW_TIME IS NULL)
GO


CREATE PROCEDURE dbo.NewInsertCommand
(
	@ROW_ID int,
	@ROW_TIME datetime
)
AS
	SET NOCOUNT OFF;
INSERT INTO Table1(ROW_ID, ROW_TIME) VALUES (@ROW_ID, @ROW_TIME);
	SELECT ROW_ID, ROW_TIME FROM Table1 WHERE (ROW_ID = @ROW_ID)
GO


CREATE PROCEDURE dbo.NewUpdateCommand
(
	@ROW_ID int,
	@ROW_TIME datetime,
	@Original_ROW_ID int,
	@Original_ROW_TIME datetime
)
AS
	SET NOCOUNT OFF;
UPDATE Table1 SET ROW_ID = @ROW_ID, ROW_TIME = @ROW_TIME 
WHERE(ROW_ID = @Original_ROW_ID) AND (ROW_TIME = @Original_ROW_TIME OR @Original_ROW_TIME IS NULL AND ROW_TIME IS NULL);
	SELECT ROW_ID, ROW_TIME FROM Table1 WHERE (ROW_ID = @ROW_ID)
GO
То есть 4 процедуры - select, delete, insert, update. Я так понимаю для select и delete не надо ничего менять, они не записывают в базу. А вот для insert и update - нужно как то преобразовать входной параметр @ROW_TIME datetime из вида: 30.12.1899 12:30:00, в вид: 12:30:00, но тоже типа DаteTime. И уже его записать в базу. И тогда все будет тип топ. Я правильно понимаю?
Если правильно - можно примерчик на SQL, иначе я опять проковыряюсь весь день :)
...
Рейтинг: 0 / 0
29.05.2004, 22:00
    #32539904
Pipensa
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как отучить C# вставлять 30.12.1899?
Как же жестоко я ошибался!
Особенно когда говорил что вот типа С# такой нехороший, вставляет в поле со временем еще и левую дату. А MSSQL то ничем не лучше!!
Разница лишь в том что C# вставляет 30.12.1899 а MSSQL - может 30.12.1899 или 1900-01-01.
Бред какой-то. Они че все сговорились?
А ошибался я потому как забивал базу ручками в SQL Server Manager, и если там ввести в поле с датой 0:00 - то он сделает вид что все схавал, и покажет только 0:00, а сам в базу засунет: 1899-12-30 00:00:00.000!
То есть это у него "побочный эффект" типа такой, если дата равна 1899-12-30, то можно ее и не показывать. :(
И какие бы селекты не делали он будет в упор врать что в строчках чистые 0:00, без дат.
Если же сделать select в Query Analyzer, тут то все и всплывает - он все по честному показывает - 1899-12-30 00:00:00.000.
Кстати если забивать табличку прямо в Query Analyzer, то он вставляет уже 1900-01-01, а не 30.12.1899 как SQL Server Manager. И при выводе этих строк сразу же высвечиваются даты.

Взял я тут с местного фака способ Отрезать время от даты и дату от даты-времени. Округлить дату и вставил его для пробы в свою InsertProcedure, вот так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
CREATE  PROCEDURE dbo.NewInsertCommand
(
	@ROW_ID int,
	@ROW_TIME datetime
)
AS

declare @time datetime
set @time=CONVERT(varchar( 8 ), @ROW_TIME,  108 )

	SET NOCOUNT OFF;
INSERT INTO Table1(ROW_ID, ROW_TIME) VALUES (@ROW_ID, @time);
SELECT ROW_ID, ROW_TIME FROM Table1 WHERE (ROW_ID = @ROW_ID)
GO

Запускаю свое приложение, вставляю в гриде новую строчку:
ROW_ID = 20, ROW_TIME = 0:00
Далее происходит следущее:
- грид передает 0:00 датасету
- у датасета это поле типа DateTime => он его конвертит в свои любимые 30.12.1899 0:00:00
- датаадаптер передает параметр @ROW_TIME хранимой процедуре
- хп получает параметр и конвертит его в внутреннюю переменную @time тоже типа DateTime, но, по обещаниям автора, с отрезанной датой, то есть 0:00
- и тут строчка:
Код: plaintext
INSERT INTO Table1(ROW_ID, ROW_TIME) VALUES (@ROW_ID, @time);
нам все обламывает!
Она берет эти 0:00 и вновь "наращивает" их уже до 1900-01-01 0:00:00 :(

Таким образозом получается что не существует способа хранить в поле типа DateTime "чисто" время, без дат :(
И если вы видите где-либо 0:00 - знайте, вас жестоко обманывают.
Причем это касается как дотнета так и sql server.
Если я ошибаюсь - срочно докажите мне обратное, или я облажаюсь на защте проекта :)

Я во всем этом бы не ковырялся, если бы у меня в ТЗ не было строчки
Код: plaintext
Приложение должно обеспечивать локальное и удаленное взаимодействие с базой данных, хранящейся под управлением MSSQL Server  2000 ...
и
Код: plaintext
Время начала этапа в таблице CARD_ROWS должно быть указано в формате ЧЧ:ММ:СС (т.е. без года, месяца, числа)...
Если я предложу хранить дату в виде char, меня не поймут :)
Где ваши комментарии, знатоки?
...
Рейтинг: 0 / 0
29.05.2004, 22:24
    #32539911
Sa
Sa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как отучить C# вставлять 30.12.1899?
>Если я предложу хранить дату в виде char, меня не поймут :)

>Таким образозом получается что не существует способа хранить в поле типа DateTime "чисто" время, без дат :(

Имено, в таких случаях хранить время, в char. Ведь в MS SQL нет типа time, а DateTime вам не подходит.

Причем в MS SQL два типа datetime:
BOL
datetime

Date and time data from January 1, 1753 through December 31, 9999, to an accuracy of one three-hundredth of a second (equivalent to 3.33 milliseconds or 0.00333 seconds). Values are rounded to increments of .000, .003, or .007 seconds, as shown in the table.

smalldatetime

Date and time data from January 1, 1900, through June 6, 2079, with accuracy to the minute. smalldatetime values with 29.998 seconds or lower are rounded down to the nearest minute; values with 29.999 seconds or higher are rounded up to the nearest minute.


Хотя может стоит пересмотреть свою инфо-логическую модель, пока не понятно для чего вам чистое время без даты?
...
Рейтинг: 0 / 0
29.05.2004, 22:55
    #32539919
Pipensa
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как отучить C# вставлять 30.12.1899?
Проблема в том что мое приложение лишь для редактирования данных, формат базы определяется не им, а главным приложением, которе эти данные использует для своей работы.
И я не могу менять формат бд, хотя начинаю подозревать что без этого никак. То главное приложение возможно тоже еще на стадии разработки, иначе там всплыла бы такая же проблема как и у меня.

Остается 2 варианта:

1. Оставить тип поля datetime, но на всех стадиях обеспечить одинаковый "прирост даты" - либо везде 30.12.1899, либо 01.01.1900. Для приложения важно лишь абсолютное (не имеющее отношение к текущему)время в часах в интервале от 0:00 до примерно 12:00. И в принципе если сравнивать 30.12.1899 12:00 и например 30.12.1899 6:00, то это будет так же как если бы сравнивали просто 12:00 и 6:00. Но если же сравнивать 01.01.1900 12:00 и 30.12.1899 6:00 то результат совершенно другой.

2. Настаивать на хранении в виде char.
...
Рейтинг: 0 / 0
30.05.2004, 07:49
    #32539963
Sa
Sa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как отучить C# вставлять 30.12.1899?
>Оставить тип поля datetime, но на всех стадиях обеспечить одинаковый "прирост даты" - либо везде 30.12.1899, либо 01.01.1900. Для приложения важно лишь абсолютное (не имеющее отношение к текущему)время в часах в интервале от 0:00 до примерно 12:00. И в принципе если сравнивать 30.12.1899 12:00 и например 30.12.1899 6:00, то это будет так же как если бы сравнивали просто 12:00 и 6:00. Но если же сравнивать 01.01.1900 12:00 и 30.12.1899 6:00 то результат совершенно другой

ИМХО Если интересует только время, то использование типа поля DateTime избыточно.
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Как отучить C# вставлять 30.12.1899? / 10 сообщений из 10, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]