C#Dapper - 这个MySql出了什么问题?

时间:2016-01-25 00:33:02

标签: c# mysql dapper

我使用这一行创建了一个数据库表:

CREATE TABLE mytable(id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, 
uniquename VARCHAR(256) NOT NULL UNIQUE KEY, creationtime TIMESTAMP, 
updatedtime TIMESTAMP);

这是我的dapper-dot-net INSERT OR UPDATE命令:

const string uniquename = "25975B8F882E7B1DD99116B71C5A8D04";

// Has format "yyyy-MM-dd HH:mm:ss"
string mysqlTimeStampString = DateTime.UtcNow.ToMysqlTimeStampString();

dbConn.Execute(@"INSERT INTO mytable (uniquename, creationtime, 
updatedtime) VALUES (@uniquename, @creationtime, @updatedtime) ON DUPLICATE 
KEY UPDATE updatedtime=@updatedtime;", new { uniquename=uniquename, 
creationtime = mysqlTimeStampString, updatedtime = mysqlTimeStampString });

第一次运行它之后,我select * from mytable \G我得到了这个结果:

id: 1
uniquename: 25975B8F882E7B1DD99116B71C5A8D04
creationtime: 2016-01-25 00:06:55
updatedtime: 2016-01-25 00:06:55

到目前为止一切看起来都不错,但是当我几分钟后运行相同的INSERT或UPDATE时,我得到了这个结果:

id: 1
uniquename: 25975B8F882E7B1DD99116B71C5A8D04
creationtime: 2016-01-24 19:10:00
updatedtime: 2016-01-25 00:10:00

这令人费解,原因如下:

  1. 重复时,只应更新updatedtime字段,但creationtimeduplicatetime字段都在更新。为什么两个字段都在更新?
  2. mysqlTimeStampString字符串将两次传递给INSERT OR UPDATE命令。字面意思是一个字符串传入两次,因此creationtime绝对不可能updatedtime是本地时间而creationtime是UTC。在重复更新期间,如果updatedtime设置为UTC,(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *cellIdentifier = @"CustomCell"; CustomCell *cell = (CustomCell *) [tableView dequeueReusableCellWithIdentifier:cellIdentifier]; if (cell == nil) { [tableView registerNib:[UINib nibWithNibName:@"CustomCell" bundle:nil] forCellReuseIdentifier:cellIdentifier]; cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier]; } //... return cell; } 正在转换为当地时间(UTC -5:00),该怎么可能?
  3. 我能想到的最好的,这必须是一个精巧的bug,mysql bug,或两者兼而有之,或者我的语法错误。

1 个答案:

答案 0 :(得分:2)

  1. 在create table语句creationtime中,首先定义时间戳firld。根据mysql关于自动初始化timestamp fields的文档:
  2.   

    默认情况下,第一个TIMESTAMP列同时具有DEFAULT   如果两者都不是CURRENT_TIMESTAMP和ON UPDATE CURRENT_TIMESTAMP   明确指定。

    1. 由于它是mysql而不是更新creationtime字段的c#代码,因此根据mysql服务器的时钟和时区设置设置其值。
    2. 我在第1点中链接的文档还描述了如何覆盖这些设置,以便mysql不会更新creationtime字段。解决方案在引用的段落下面描述。