将参数值从字符串转换为日期时间失败

Posted

技术标签:

【中文标题】将参数值从字符串转换为日期时间失败【英文标题】:Failed to convert parameter value from a String to a DateTime 【发布时间】:2016-01-04 06:54:54 【问题描述】:

我知道这是一个常见错误,但我需要解释一下摆脱这种情况的最佳方法。

我有一个用于存储出生日期的日期选择器。

日期选择器

<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;

我得到一个错误

【问题讨论】:

在保存到数据库时转换txtdob.Value 使用Convert.ToDateTime() 或使用DateTime.ParseExact() 而不是使用cmd.Parameters.Add()(不推荐)使用cmd.Parameters.AddwithValue()(推荐)。 @Suprabhat cmd.Parameter.AddwithValue 是不可取的,见blogs.msmvps.com/jcoehoorn/blog/2014/05/12/… @JapzDivino:我很清楚这篇文章,我以前读过它,但我总是遵循 MSDN 为我提供的内容。看看这个MSDN。 是的,我对这个不好。我总是使用 AddWithValue 【参考方案1】:

datepicker 日期格式: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);

【讨论】:

我已经读到您不能操纵存储在数据库中的日期时间格式。这只是它在表格或任何控件中的显示方式。请记住,上述解决方案与理论相矛盾. @RelatedRhymes 他的解决方案很好,你的理论也很好,但是当我们 storing 到数据库时,这里我们没有操作日期时间的格式。当我们来自数据库的retrieving 时,我们正在对其进行操作。 是的,我指的是“我的代码如何不起作用”的前几行,但这个解决方案看起来很公平。谢谢【参考方案2】:

您收到错误是因为如果SqlDbType.DateTime:

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

您将字符串传递给 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;

【讨论】:

我真的不想参与使用 varchar coz 那么我会在我的项目中更改很多代码。我只想将它存储为日期变量 @RelatedRhymes 如果您只想存储为日期,则不能将字符串传递给该日期参数,如果您尝试使用转换,您还会收到类似无效日期格式的错误,因为任何除了这个 '20151007' 之外,字符串不能被格式化为日期,如果这是有效的字符串,但如果字符串是 name (Michael) 或 city (Chicago) 之类的字符串,则转换无效。 请参考@ajmot 的答案。看起来有点我在找什么。无论如何谢谢

以上是关于将参数值从字符串转换为日期时间失败的主要内容,如果未能解决你的问题,请参考以下文章

无法将参数值从 SqlParameter 转换为字符串

TimeStamp , "将参数值从 DateTime 转换为 Byte[] 失败。"

在 C# 中将十六进制值从 SQL Server 转换为日期时间

从字符串转换日期时间时转换失败

无法将参数值从 String 转换为 DateTime 的 Int32

SQL将日期时间转换为日期名称