Не удалось преобразовать значение параметра из строки в DateTime.

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

У меня есть средство выбора даты, используемое для хранения даты рождения.

Выбор даты

<script>
    $(document).ready(function () {
        $(".datepicker").datepicker({
            dateFormat: "yy-mm-dd",
            changeMonth: true,
            changeYear: true,
            yearRange: "-100:-1",
            defaultDate: "-25y"
        });
    });
</script>

Я передаю его как параметр для хранения в базе данных, как показано ниже:

cmd.Parameters.Add("@DOB", SqlDbType.Date).Value = txtdob.Value;

работает просто отлично. Теперь на странице редактирования я вставляю DOB из базы данных в средство выбора даты, как показано ниже:

txtdob.Value = ((DateTime)rdr["DOB"]).ToString("dd-MM-yyyy");

все еще работает нормально. Я вижу DOB, как и ожидалось. Теперь я просто меняю что-то еще (например, имя или город пользователя) и нажимаю кнопку «Обновить» с DOB, переданным как:

cmd.Parameters.Add("@DOB", SqlDbType.DateTime).Value = txtdob.Value;

и я получаю ошибку

Не удалось преобразовать значение параметра из строки в DateTime.


person RelatedRhymes    schedule 07.10.2015    source источник
comment
При сохранении в базу данных преобразуйте txtdob.Value либо с помощью Convert.ToDateTime(), либо с помощью DateTime.ParseExact() и вместо использования cmd.Parameters.Add() (устаревшее) используйте cmd.Parameters.AddwithValue() (рекомендуется).   -  person Suprabhat Biswal    schedule 07.10.2015
comment
@Suprabhat cmd.Parameter.AddwithValue не рекомендуется, см. это blogs.msmvps.com/jcoehoorn/blog/2014/05/12/   -  person japzdivino    schedule 07.10.2015
comment
@JapzDivino: я хорошо знаю эту статью, я читал ее раньше, но я всегда следую тому, что есть для меня в MSDN. Взгляните на этот MSDN. .   -  person Suprabhat Biswal    schedule 07.10.2015
comment
Да, я плохо с этим. Я всегда использую AddWithValue   -  person RelatedRhymes    schedule 07.10.2015


Ответы (2)


формат даты средства выбора даты: dateFormat: "yy-mm-dd",, но вы сохраняете при редактировании ((DateTime)rdr["DOB"]).ToString("dd-MM-yyyy");

так что при обновлении не работает.

yyyy-MM-dd формат работает, но dd-MM-yyyy не работает, это из-за какой-то проблемы с форматом культуры.

поэтому вы можете попробовать использовать :DateTime.Parse() или

cmd.Parameters.Add("@DOB", SqlDbType.DateTime).Value =
DateTime.ParseExact(txtdob.Value,
"Your_Date_Format(e.g dd-mm-yyyy)",
CultureInfo.InvariantCulture);
person A_Sk    schedule 07.10.2015
comment
Я читал, что вы не можете манипулировать форматом даты и времени, хранящимся в базе данных. Это просто то, как он отображается в таблице или в любом из ваших элементов управления. Имея в виду, что приведенное выше решение противоречит теории. - person RelatedRhymes; 07.10.2015
comment
@RelatedRhymes Его решение остается в силе, и ваша теория также остается в силе, но здесь мы не манипулируем форматом даты и времени, когда мы storing в базе данных. мы манипулируем им, когда мы retrieving из базы данных. - person The Blue Shirt Developer; 07.10.2015
comment
Да, я имел в виду первые несколько строк в разделе «Почему мой код не работает», но это решение выглядит достаточно справедливым. Спасибо. - person RelatedRhymes; 07.10.2015

Вы получаете сообщение об ошибке, потому что если это SqlDbType.DateTime:

    cmd.Parameters.Add("@DOB", SqlDbType.DateTime).Value = txtdob.Value;

Вы передаете строку типу данных DateTime, поэтому получили ошибку преобразования.

Избегайте передачи строки в тип данных datetime, даже если вы ее преобразуете, она недействительна, например: Name: Juan , вы не можете преобразовать ее в тип данных datetime, вы получите проблемы с форматированием даты, если попытаетесь преобразовать строку в дату и время.

Если вы хотите исправить это, вы можете добавить новый строковый параметр, чтобы он не конфликтовал с параметром datetime.

что-то типа:

    cmd.Parameters.Add("@SomeStringHere", SqlDbType.Varchar).Value = txtdob.Value;

Затем вы можете манипулировать потоком программы, используя условие IF ELSE, что-то вроде

    IF IsDate(txtdob.Value) = True Then
        cmd.Parameters.Add("@DOB", SqlDbType.DateTime).Value = txtdob.Value;
    ELSE
        cmd.Parameters.Add("@SomeStringHere", SqlDbType.Varchar).Value = txtdob.Value;
person japzdivino    schedule 07.10.2015
comment
Я действительно не хочу участвовать в использовании varchar, потому что тогда я бы изменил много кода в своем проекте. Я хочу сохранить его только как переменную даты. - person RelatedRhymes; 07.10.2015
comment
@RelatedRhymes Если вы хотите сохранить только дату, вы не можете передать строку этому параметру даты, если вы попытаетесь использовать преобразование, вы также получите сообщение об ошибке, например, недопустимое форматирование даты, потому что любая строка неприемлема для форматирования даты помимо этого '20151007', если это строка, она действительна, НО если строка похожа на имя (Майкл) или город (Чикаго), это недопустимое преобразование. - person japzdivino; 07.10.2015
comment
Пожалуйста, отправьте ответ @ajmot. Выглядит примерно так, как я искал. В любом случае спасибо - person RelatedRhymes; 07.10.2015