Модераторы: gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вставка даты в SQL Server 2005, Запрос к базе 
:(
    Опции темы
Artemis474
Дата 14.6.2008, 22:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 13.6.2008
Где: Череповец

Репутация: нет
Всего: нет



Привет, всем. Может кто-нибудь помочь? нужно очень срочно

Объявлена переменная data

DateTime data;

Ей писваивается значение введенное в текстовое поле

Код

data = Convert.ToDateTime(TextBox6.Text);


При выполнении запроса

Код

StringCommand1 = "INSERT HeadTest (NumMesto, Data) VALUES (" + num_mesto +", '" + data + "')";


если дата введена текущая дата или которая больше, вылезает ошибка при выполнении запроса

The conversion of a char data type to a datetime data type resulted in an out-of-range datetime value.
The statement has been terminated.

Это какоето ограничение в SQL Server'е или тип данных не тот?
PM MAIL ICQ   Вверх
4ybaka
Дата 15.6.2008, 11:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 370
Регистрация: 28.4.2007

Репутация: нет
Всего: нет



может проблема в формате даты выдаваемом по умолчанию...попробуй так:
Код

date.Value.ToString("dd-MM-yyyy",DateTimeFormatInfo.InvariantInfo)

ну если нужно будет время - добавь в шаблон.


--------------------
"То,что вы понимаете - это все,что вы понимаете."
 Брайн Керниган
PM MAIL WWW   Вверх
Idsa
Дата 15.6.2008, 13:57 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2086
Регистрация: 5.12.2006
Где: Томск

Репутация: 15
Всего: 62



По-моему работать с датами вручную - последнее дело. Гораздо удобнее использовать параметры:
Код

...
SqlCommand command = new SqlCommand();
command.Connection = connection;
command.Text = "INSERT HeadTest (NumMesto, Data) VALUES (@num_mesto, @data)";
command.Parameters.AddWithValue("num_mesto", num_mesto);
command.Parameters.AddWithValue("data", data);
...


Это сообщение отредактировал(а) Idsa - 15.6.2008, 14:04


--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
Artemis474
Дата 15.6.2008, 19:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 13.6.2008
Где: Череповец

Репутация: нет
Всего: нет



 4ybaka проблема действительно в дате. При выполненнии запроса SQL Server  по своему воспринимает дату, как я понял в американском формате ММ.дд.гггг. 

Решение нашел здесь, если кому-нибудь нужно будет

Код

StringCommand1 = "INSERT HeadTest (NumMesto, Data) VALUES (" + num_mesto +", convert(datetime,'" + data + "',104)"; 


Idsa Про параметры не знал, спасибо.
PM MAIL ICQ   Вверх
PashaPash
Дата 16.6.2008, 10:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1233
Регистрация: 3.1.2008

Репутация: 7
Всего: 49



Artemis474, это кривое решение. Оно подразумевает, что приложение будет запущено с локалью с немецким форматом даты. Да еще и делает два бесполезных преобразования, сначала даты в строчку, потом этой строчки опять в дату. Передавай даты параметрами, как посоветовал Idsa.


--------------------
PM MAIL WWW   Вверх
Artemis474
Дата 16.6.2008, 17:00 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 13.6.2008
Где: Череповец

Репутация: нет
Всего: нет



Цитата(PashaPash @ 16.6.2008,  10:27)
Artemis474, это кривое решение. Оно подразумевает, что приложение будет запущено с локалью с немецким форматом даты. Да еще и делает два бесполезных преобразования, сначала даты в строчку, потом этой строчки опять в дату. Передавай даты параметрами, как посоветовал Idsa.

PashaPash, через параметры конечно удобнее, но конвертировать TextBox в формат даты, все равно нужно. И convert(datetime,'@data',104) все равно придется делать в запросе, так как SQL Server востпринимает дату как мм.дд.гггг ... получается что только при вставке.

Второе преобразование заключается только в том что меняется местами день и месяц, мм.дд
PM MAIL ICQ   Вверх
Idsa
Дата 17.6.2008, 00:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2086
Регистрация: 5.12.2006
Где: Томск

Репутация: 15
Всего: 62



Цитата(Artemis474 @  16.6.2008,  17:00 Найти цитируемый пост)
PashaPash, через параметры конечно удобнее, но конвертировать TextBox в формат даты, все равно нужно

PashaPash говорил не о преобразовании строки в дату, а о преобразовании даты в строку при конкатенации вот здесь:
Цитата(Artemis474 @  15.6.2008,  19:36 Найти цитируемый пост)
convert(datetime,'" + data + "',104)"; 


Цитата(Artemis474 @  16.6.2008,  17:00 Найти цитируемый пост)
И convert(datetime,'@data',104) все равно придется делать в запросе, так как SQL Server востпринимает дату как мм.дд.гггг ... получается что только при вставке.

Sql Server воспринимает дату далеко не только как мм.дд.гггг. Лучше всех о том, как именно SqlServer воспринимает дату, знает SqlClient и реализует это при приведении .NET типа DateTime к параметру базы данных типа DateTime. Так что лучше довериться алгоритму, который реализует провайдер, и использовать параметры.
Кроме того, параметры обладают еще рядом замечательных свойств. В частности (раз уж мы в разделе ASP.NET, а не ADO.NET), параметры позволяют обезопасить приложение от атаки Sql Injection.

Это сообщение отредактировал(а) Idsa - 17.6.2008, 00:34


--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
Artemis474
Дата 17.6.2008, 14:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 13.6.2008
Где: Череповец

Репутация: нет
Всего: нет



Здесь convert(datetime,'" + data + "',104)"; происходит не конкатенация, а просто конверт, меняются местами месяц и число

На счет параметров согласен, SqlClient должен правильно воспринимать

Цитата

Кроме того, параметры обладают еще рядом замечательных свойств. В частности (раз уж мы в разделе ASP.NET, а не ADO.NET), параметры позволяют обезопасить приложение от атаки Sql Injection.


Можешь привести пример, как SQL-инекция может нарушить мое приложение?
PM MAIL ICQ   Вверх
PashaPash
Дата 17.6.2008, 15:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1233
Регистрация: 3.1.2008

Репутация: 7
Всего: 49



Цитата(Artemis474 @  17.6.2008,  14:39 Найти цитируемый пост)
Здесь convert(datetime,'" + data + "',104)"; происходит не конкатенация, а просто конверт, меняются местами месяц и число

вот этот код:
Код
StringCommand1 = "INSERT HeadTest (NumMesto, Data) VALUES (" + num_mesto +", '" + data + "')";

на самом деле выглядит вот так:
Код
StringCommand1 = "INSERT HeadTest (NumMesto, Data) VALUES (" + num_mesto.ToString() +", '" + data.ToString() + "')";

Два преобразования и конкатенация. И результат зависит от локали, под которой запущен клиент. Проверь  - зайди в Control Panel/Regional and language options и выставь там English/United States. Потом запусти свой код, и посмотри с каким хрустом он упадет. Причем падать будет не только на датах, а вообще на всех преобразованиях, зависящих от локали.
Цитата(Artemis474 @  17.6.2008,  14:39 Найти цитируемый пост)
Можешь привести пример, как SQL-инекция может нарушить мое приложение? 
Да очень просто. Ты принципиально не используешь параметры. Будешь делать логин пользователя, напишешь что-то вроде
Код
command = "select * from users where username='" + username +"' and password = '" + password + "'";

придет злой хакер и введет имя пользователя "administrator' OR 1=1 --".


--------------------
PM MAIL WWW   Вверх
Artemis474
  Дата 19.6.2008, 19:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 13.6.2008
Где: Череповец

Репутация: нет
Всего: нет



Если использовать параметры, ни каких конвертов делать не надо, провайдер действительно сам делает все необходимые преобразования

PashaPash, с локалью English/United States приложение не упадет

Спасибо всем за ответы
PM MAIL ICQ   Вверх
PashaPash
Дата 19.6.2008, 19:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1233
Регистрация: 3.1.2008

Репутация: 7
Всего: 49



Цитата(Artemis474 @  19.6.2008,  19:12 Найти цитируемый пост)
PashaPash, с локалью English/United States приложение не упадет
Ты проверил, или просто так это утверждаешь? IMHO, Sql server очень удивится, увидев сегодняшнюю дату в виде "convert(datetime, '6/19/2008 12:00:00 AM', 104)" и ответит что-то вроде "The conversion of a char data type to a datetime data type resulted in an out-of-range datetime value."


--------------------
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
Любитель
Mymik
mr.DUDA

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Любитель, Mymik, mr.DUDA.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Разработка под ASP.NET | Следующая тема »


 




[ Время генерации скрипта: 0.0739 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.