【问题标题】:Failed conversion of string to smalldatetime but only on 1 out of 4 accounts将字符串转换为 smalldatetime 失败,但仅适用于 4 个帐户中的 1 个
【发布时间】:2019-10-21 07:29:51
【问题描述】:

一个用于管理我们库存的小型应用程序,其中有一个选项可以编辑取出的数量以及它去了哪个部门。为了获得正确的值,使用了一个包含取出日期的 SELECT:

CAST(date AS smalldatetime) = '" + Convert.ToDateTime(date_value).ToString("dd-MMM-yy HH:mm:ss") + "'

应用程序运行在 4 台不同用户的电脑上。其中 3 个工作正常,但第 4 个抛出以下错误。看到它只影响 25% 的用户会导致这种错误的原因是什么。

(所有测试都使用相同的记录)

【问题讨论】:

  • Windows 文化/语言设置。
  • 停止将数据作为 字符串 传递给 SQL Server。这真是个坏习惯。将其 as 传递给 DateTime(通过参数),您可以避免在数据类型之间不断转换。
  • @UweKeim 你是对的。出于某种原因,这台电脑是部门中唯一一台具有本地设置而不是美国的电脑
  • @A.bakker 这就是为什么你不应该使用字符串连接来传递值。使用参数化查询。您也不必解析/格式化任何内容

标签: c# sql sql-server winforms


【解决方案1】:

dd-MMM-yy 格式中的 MMM 部分是特定于语言的。您可以在英语中找到JAN 或在西班牙语 (Enero) 中找到 ENE,这是在操作系统级别配置的。此外,某些地区的日期格式与月份互换,因此您不可能毫无疑问地知道01-03-1900 是三月一日还是一月三日。

如果你需要处理日期,你不应该使用字符串,你应该使用正确的日期格式作为参数,正如 Damien 建议的那样。所以去掉ToString()方法,直接使用DateTime类。

如果您需要以某种方式解析日期字符串,请尝试以 ISO 8601 日期格式生成它,日期格式为 yyyy-mm-dd,日期时间为 yyyy-MM-ddTHH:mm:ssZ(注意 Z 表示 UTC)。

【讨论】:

  • 。 .虽然我更喜欢 YYYY-MM-DD 的日期格式,但我更喜欢人工生成的输入。如果正在为 SQL Server 生成代码,则常量应删除连字符 (YYYYMMDD),因为无论国际化设置如何,这都是明确的。
猜你喜欢
  • 2020-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多