![]() |
Модераторы: gambit, Partizan |
![]() ![]() ![]() |
|
IApple |
|
||||||
Новичок Профиль Группа: Участник Сообщений: 36 Регистрация: 17.1.2008 Репутация: нет Всего: нет |
Помогите реализовать идею (не хватает знаний осилить самостоятельно).
Идея: хранить дату (без времени!) в БД на MS SQL (версии до 2008) в поле типа Int (поддержка значений NULL тоже необходима). Преимущества: - размер и быстродействие (индекс/поиск по Int явно быстрее, чем по дате-времени, которое "внутре" клон действительного числа), возможность использовать = в селектах (для выборки всех дататайм конкретного дня нужно либо "обрезать" время, либо использовать BETWEEN). В MS SQL преобразования:
В C# преобразования:
Недостатки окажутся минимальными, если добиться (вот в этом и заключаются задачи): 1) визуализации такого Int в DataGridView в виде даты (вернее строки по заданому формату, как для дат), помогите создать соответствующего наследника от DataGridViewTextBoxColumn; 2) переделка DateTimePicker (вернее NullableDateTimePicker), чтоб можно было такой компонент напрямую биндить на Int-колонку таблицы, для редактирования. Код пикера для передоделки:
|
||||||
|
|||||||
PashaPash |
|
||||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1233 Регистрация: 3.1.2008 Репутация: нет Всего: 49 |
Values with the datetime data type are stored internally by the SQL Server 2005 Database Engine as two 4-byte integers. The first 4 bytes store the number of days before or after the base date: January 1, 1900....The Database Engine stores smalldatetime values as two 2-byte integers. The first 2 bytes store the number of days after January 1, 1900. Поэтому поиск по дате будет явно не медленее, чем поиск по int.
|
||||
|
|||||
IApple |
|
||||
Новичок Профиль Группа: Участник Сообщений: 36 Регистрация: 17.1.2008 Репутация: нет Всего: нет |
т.е индекс по ДВУМ интежерам и по ОДНОМУ - это одно и то же ?
Вот именно, что ЕСЛИ уже урезаны до "date only", а если не урезаны, то надобно урезать "средствами одного orm/data layer"... Покажите пример реализации этого "средства", плиз. Глобальной переписки базы я не просил, а как раз только presentation int-а в датагриде, чтоб "выглядел", как дата. Именно в этом я просил помощи. Это сообщение отредактировал(а) IApple - 22.7.2008, 16:41 |
||||
|
|||||
1stain |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 486 Регистрация: 30.7.2007 Где: Киев - Харьков Репутация: 4 Всего: 40 |
По-моему, единственный смысл хранить DateTime в базе в виде числа - избавиться от потери точности (MS SQL datetime менее точный чем .NET DateTime). При этом хранить сабж надо в виде bigint. Писать в базу и читать обратно можно примерно так:
Сделать nullable DateTimePicker на мой взгляд, проще всего создав юзерконтрол с таким кодом:
-------------------- Все знают, что это невозможно. Но вот приходит невежда, которому это неизвестно - он-то и делает открытие. (Albert Einstein) ![]() |
||||
|
|||||
PashaPash |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1233 Регистрация: 3.1.2008 Репутация: нет Всего: 49 |
Индекс по одному полю длиной 4 байта (smalldatetime) и integer полю длиной 4 байта - да, одно и то же. То же поле, те же операции сравнения, только называется по-другому.
Триггеры на insert/update. Или явное преобразование в Data Layer (как 1stain предложил, только с другой целью). Или OnPropertyChanged обьектов домена. Или просто календарь с переопределенным Value. Все проще, чем вместо дат целые числа по всему приложению передавать, и только показывать их как даты. Очень, наверное, удобно отлаживать код, в котором сегодня - это 733244. |
|||
|
||||
IApple |
|
||||||
Новичок Профиль Группа: Участник Сообщений: 36 Регистрация: 17.1.2008 Репутация: нет Всего: нет |
какие Ticks? для хранения ДНЯ не нужен тик, нужен ДЕНЬ. Но вопрос совсем не в том был, как читать или писать в ВБ int, подменяя на ходу на DateTime - это я как раз умею. Помощь нужна в другом совсем !!! Я хочу, чтоб читалось/писалось и в таблице как на сервере, так и в датасете только Int. Упрощенно наново сформулирую чего я хочу добиться и в чем именно нужна подмога: 1) мне нужно добиться, чтоб грид, забинденый на таблицу в датасете, в которой есть колонка с данными типа INT, эту колонку ПОКАЗЫВАЛ в виде даты. Нужны, наверное, наследники от DataGridViewTextBoxColumn и/или от DataGridViewTextBoxCell, которые будут показывать хранимое в них (или прибинденое) значение типа Int в виде даты. Для редактирования на отдельной форме будет нужен дататаймпикер из п.2, а для редактирования в гриде, компонент, от него наследованиый. 2) к дататаймпикеру (я полный его код представил сам) и который работает и можно на его свойство Value (c типом DateTime) прибиндить колонку типа дататайм, "прикрутить" еще (или вместо) свойство с типом Int, к которому можно было б напрямую прибиндить Int колонку таблицы (в которой подразумевается дата).
Вот именно триггеры на insert/update для каждой таблицы с датой (ну это около половины всех моих таблиц в БД) мне трудно.
Вот именно это мне нужно !!! помогите создать календарь с переопределенным Value (это ж и есть мой п.2) Вопрос что легче, задавать кучу тригеров или передавать по всему приложению целые числа зависит от человека. Вам легче с тригерами. Мне легче "передавать". Помогите в том, в чем прошу, а не убеждайте меня в моей глупости, плиз. Это сообщение отредактировал(а) IApple - 23.7.2008, 10:08 |
||||||
|
|||||||
jonie |
|
||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5613 Регистрация: 21.8.2005 Где: Владимир Репутация: 5 Всего: 118 |
на сугубо мой взгляд вы занимаетесь преждевременной оптимизацией
ну тут тики, но думаю суть должна быть ясна... чем там проблемы? ----------------------------- -------------------- Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет... |
||||
|
|||||
![]() ![]() ![]() |
Прежде чем создать тему, посмотрите сюда: | |
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :) Так же не забывайте отмечать свой вопрос решенным, если он таковым является :) Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Разработка Windows Forms | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |