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

Тема в разделе ".NET", создана пользователем nick_crazy__, 24 фев 2007.

Статус темы:
Закрыта.
  1. nick_crazy__

    nick_crazy__ Гость

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

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

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

    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();
    }

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

    Pasha Гость

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

    nick_crazy__ Гость

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

    Pasha Гость

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

    nick_crazy__ Гость

    System.DateTime конечно )

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

    А про пул ты прав
     
  7. Pasha

    Pasha Гость

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

    nick_crazy__ Гость

    Да, сразу создавалось как Datetime
     
Загрузка...
Статус темы:
Закрыта.

Поделиться этой страницей