【问题标题】:MySQL command - bug with datesMySQL 命令 - 日期错误
【发布时间】:2013-10-28 15:45:55
【问题描述】:

我正在尝试将以下 MySqlCommand 放在一起。

string cols = "(DateTime, Ticker, Open, High, Low, Close, Volume, ReqCode, UpdateTime)"; 
string parametrs = "(?DateTime, ?Ticker, ?Open, ?High, ?Low, ?Close, ?Volume, ?ReqCode, ?UpdateTime)"; //, ?UpdateTime)";

try {
    using (MySqlCommand cmd = new MySqlCommand()) {
        cmd.Connection = myConn;
        cmd.CommandText = "INSERT INTO " + schema + cols + " VALUES" + parametrs + "\n ON DUPLICATE KEY UPDATE ReqCode = ?ReqCode AND UpdateTime = ?UpdateTime";
        cmd.Parameters.Add("?DateTime", MySqlDbType.DateTime).Value = aPriceBar.BarTimestamp;
        cmd.Parameters.Add("?Ticker", MySqlDbType.VarChar).Value = aPriceBar.Ticker;
        cmd.Parameters.Add("?Open", MySqlDbType.Decimal).Value = aPriceBar.Open;
        cmd.Parameters.Add("?High", MySqlDbType.Decimal).Value = aPriceBar.High;
        cmd.Parameters.Add("?Low", MySqlDbType.Decimal).Value = aPriceBar.Low;
        cmd.Parameters.Add("?Close", MySqlDbType.Decimal).Value = aPriceBar.Close;
        cmd.Parameters.Add("?Volume", MySqlDbType.UInt32).Value = aPriceBar.Volume;
        cmd.Parameters.Add("?ReqCode", MySqlDbType.VarChar).Value = aPriceBar.ReqCode;
        cmd.Parameters.Add("?UpdateTime", MySqlDbType.DateTime).Value = aPriceBar.ReqTimestamp;
        cmd.ExecuteNonQuery();
    }
} catch (MySqlException ex) {
    Console.WriteLine(ex.Message);
}

当我运行程序时,我捕获了以下异常:

“您的 SQL 语法有错误;...请使用正确的语法 靠近''2013-10-28 16:23:26.379'

我确定 2013-10-28 是 ReqTimestamp 中的日期。

我很惊讶,因为当我没有向查询中添加对 UpdateTime 列的引用时,INSERT 查询通过:该查询成功地将 DateTime 类型与另一列 (Datetime) 一起使用。但是,a) aPriceBar.ReqTimestamp 是一个 DateTime,其中 reqTimestamp = DateTime.UtcNow 而 b) aPriceBar.BarTimestamp 是由

生成的
DateTime datetime = DateTime.ParseExact(sFields[0], "yyyy-MM-dd HH:mm:ss", CultureInfo.InvariantCulture);

''2013-10-28 16:23:26.379': 一天后的“.379”让我怀疑当我使用 UctNow 时,而不是 ParseExactsome 和 CultureInfo.InvariantCulture,一些时区信息被添加到 DateTime实例。

我用 MySQL 工作台检查了表定义,看起来没问题。

不知道如何解决这个问题。 谢谢!

【问题讨论】:

  • 您有一个名为?UpdateTime 的列(最后一个)?你的意思是`UpdateTime`还是只是一个错字?
  • 你在用什么'?'表示您的参数而不是预期的“@”?还是列nullable
  • 设置断点,实际的命令文本是什么样的?我敢打赌,这就是史蒂夫所说的,你在第 1 行的 cols 字符串中有 ?UpdateTime
  • @Steve:只是 stackoverflow 复制粘贴上的一个错字,但感谢您指出。
  • @sab669:在断点处,我看到了看起来不错的 CommandText。当参数替换为实际值时,有没有办法查看实际的 SQL 查询?

标签: c# mysql datetime


【解决方案1】:

如果您的 db 字段是“datetime”而不是 datetime2 /offset,则可能是 xxx:xxx.379 部分的问题。

【讨论】:

    【解决方案2】:

    我想通了。

    问题实际上出在 SQL 查询语法上。

    cmd.CommandText = "INSERT INTO " + schema + cols + " VALUES" + parametrs + "\n ON DUPLICATE KEY UPDATE ReqCode = ?ReqCode AND UpdateTime = ?UpdateTime";
    

    ON DUPLICATE KEY UPDATE 不支持 AND 但需要逗号代替 (http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html)

    cmd.CommandText = "INSERT INTO " + schema + cols + " VALUES" + parametrs + "\n ON DUPLICATE KEY UPDATE ReqCode = ?ReqCode , UpdateTime = ?UpdateTime";
    

    我之前没有弄清楚,因为我还没有找到查看最终查询字符串并检查占位符如何被查询中的参数替换的方法。

    感谢大家的帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-22
      • 2020-06-14
      • 1970-01-01
      • 2011-01-30
      • 1970-01-01
      • 2018-07-16
      • 2012-08-21
      • 1970-01-01
      相关资源
      最近更新 更多