• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

Преобразование типов

  • Автор темы nick_crazy__
  • Дата начала
Статус
Закрыто для дальнейших ответов.
N

nick_crazy__

Всем привет! В базе данных определяю формат данных для одного из полей типа DateTime (MS SQL Server 2000), затем пытаюсь записать туда данные того же формата, код

............
newRow["DateCreate"] = DateTime.Today;
...........
fDataTable.Rows.Add(newRow);
fDataAdapter.Update(fDataSet, "Tasks");
fDataSet.AcceptChanges();

данные не записываются. Вылетает исключение типа Out-of-range. В чем дело? Ведь форматы данных одни и те же!
 
N

nick_crazy__

В общем, сам задал, сам отвечаю - оказывается SQL Server по умолчания воспринимает данные даты слегка наоборот, то есть меняет местами месяц с днём. В результате, если день например равен 26, как сегодня, при добавлении данных в таблицу в кач-ве месяца пойдёт значение 26, что и вызовет соответствующее исключение!

Вот как с этим бороться:

private void InitializeCommandConvertDateType()
{
SqlConnection connection = fDataAdapter.SelectCommand.Connection;
SqlCommand cmd = connection.CreateCommand();
connection.Open();
cmd.CommandText = " SET DATEFORMAT dmy";
cmd.ExecuteNonQuery();
}

Надеюсь, кому нибудь пригодится!
 
P

Pasha

Для: nick_crazy__
Выложи исходники, пожалуйста. Тот кусок, в котором у тебя определен Insert/Update Command для DataAdapter.
А решение с InitializeCommandConvertDateType - это хак, так как тебе придется вызывать его перед каждым Update. А еще после каждого Update тебе надо будет проверять fDataAdapter.SelectCommand.Connection и закрывать его, если не было вставки записи.
 
N

nick_crazy__

У меня всё работает даже после закрытия соединения. Похоже команда определяет формат данных для самого sql сервера, в период работы с ним
 
P

Pasha

SET DATEFORMAT определяет формат преобразования даты в строчку и обратно. А у тебя (теоретически) этого преобразования быть не должно. Последствия могут быть примерно такие: после смены локали системы с русской на американскую или наоборот твое приложение тупо перестанет работать.
А после закрытия соединения все продолжает работать только потому, что соединение на самом деле не закрывается, а остается в пуле. Но нельзя надеяться, что ты получишь то же самое соединение при выполнении следующей команды.
Какой тип у колонки "DateCreate" в датасете? строчка или дата?
 
N

nick_crazy__

System.DateTime конечно )

А про пул ты прав!

А про пул ты прав
 
P

Pasha

Поле в базе сразу как datetime создавалось? или было когда-то nvarchar?
 
N

nick_crazy__

Да, сразу создавалось как Datetime
 
Статус
Закрыто для дальнейших ответов.
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!