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

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

nick_crazy__

#1
Всем привет! В базе данных определяю формат данных для одного из полей типа 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__

#2
В общем, сам задал, сам отвечаю - оказывается 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

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

nick_crazy__

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

Pasha

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

nick_crazy__

#6
System.DateTime конечно )

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

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

Pasha

#7
Поле в базе сразу как datetime создавалось? или было когда-то nvarchar?
 
Статус
Закрыто для дальнейших ответов.