【问题标题】:Different format for timestamp when using c# datareader使用 c# datareader 时时间戳的不同格式
【发布时间】:2013-09-17 03:39:49
【问题描述】:

我正在使用OdbcDataReader 从 mysql 表中读取时间戳。当我查看表格中的数据时,其格式为2013-09-12 11:11:09。但读者似乎以12/09/2013 11:11:09 的格式阅读它。

然后我尝试将其插入另一个 mysql 表,但收到错误:

日期时间值不正确:“时间戳”列的“12/09/2013 11:11:09” 在第 1 行

如何解决这种格式差异?我应该以某种方式引用一些 Unix 时间戳值吗?

【问题讨论】:

  • 您可以参考stackoverflow.com/questions/8551940/… 为您解答
  • @VijayPote:关于这个问题的两个答案都是石膏解决方案。修复不必要地包含字符串转换的潜在问题是 IMO 更好的方法。

标签: c# mysql timestamp


【解决方案1】:

数据不应以任何文本格式出现在表格中。这只是一个日期和时间。

当您将数据转换为字符串时,您会看到格式 - 您应该尽可能少地这样做。特别是,当您将数据插入到不同的表中时,您根本不应该使用格式化值 - 您应该在参数化 SQL 中使用DateTime

基本上,除非您真的需要数据的字符串表示,否则您应该将其保留为“本机”表示(在这种情况下为DateTime)。每次转换到文本或从文本转换时,这都是失败的机会。日期和时间对于时区等来说已经足够困难了,不会涉及到无关的转换。

【讨论】:

  • 是的,我想这是因为我正在转换为导致问题的字符串。我正在执行以下操作,其中reader 包含从 mysql 表中读取的数据。 cmd.CommandText = "insert into mytable set timestamp='" + reader["timestamp"] + "' where id=1";这一定是错的——我该怎么做?
  • @Jon:正如我所说,您应该使用参数化 SQL,例如INSERT INTO MyTable SET timestamp = @timestamp 然后设置@timestamp 参数。有关示例,请查看 MySqlCommand.Parameters 的文档。
  • @Jon:太好了。 在任何地方使用它。请参阅bobby-tables.com 了解不仅仅是日期转换(和幽默)的重要原因。
【解决方案2】:

您如何看待“表中”的数据?我不熟悉 MySQL 的实现,但 Oracle 和 Sql Server 的日期时间值以不可读的二进制格式存储,并由查询工具转换为可读的时间戳。 MySQL 可能正在做类似的事情。

尝试将其插入到另一个 mysql 表中

如果您在插入数据时关心格式,那么您正在做的事情非常糟糕。这强烈表明您正在使用一种容易受到 sql 注入攻击的技术,而不是参数化查询。如果使用参数化查询,则直接将 C# datetime 类型分配给查询参数值,并且 ADO.Net 对象会处理您需要的任何格式。届时,您可以成功使用DateTime.Parse()DateTime.TryParse() 的任何内容都将成为您查询的有效输入。

【讨论】:

  • 我正在使用 GUI 程序查看数据,特别是 sqlyog。我将研究参数化查询。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-10
  • 2020-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-04
相关资源
最近更新 更多