将参数值从字符串转换为日期时间失败
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 的答案。看起来有点我在找什么。无论如何谢谢以上是关于将参数值从字符串转换为日期时间失败的主要内容,如果未能解决你的问题,请参考以下文章
TimeStamp , "将参数值从 DateTime 转换为 Byte[] 失败。"
在 C# 中将十六进制值从 SQL Server 转换为日期时间