1

我在 Azure 表中有一个字段,它以字符串格式保存日期时间。我想用 DateTime 字段替换它并转换字符串列中的值。解决这个问题的最佳方法是什么?

在 SQL 中,我会通过创建一个新列并运行更新语句来做到这一点......

4

3 回答 3

1

我自己没有尝试过,但这里是/应该/工作的步骤。这需要是 C#/VB/etc 脚本。

  1. 更改类的定义以包含日期时间类型的 /new/ 成员。
  2. 运行 linq 查询以加载表中的所有行,并运行一个 for 循环,它将根据旧字符串变量填充新的 datetime 变量。
  3. 将对象保存到表中。//现在您的表存储包含具有该变量的新旧定义的对象
  4. 从类定义中删除旧字段
  5. 再次从表中加载对象并保存它们而不做任何事情,但将它们标记为脏。这/应该/从表内的序列化结构中删除旧成员。现在,如果您希望新的日期时间字段采用原始字符串变量的名称,请再次执行步骤 1 到 5,这次将数据从一个字段移动到另一个字段。唯一的区别是您不必再次进行转换。

一般来说,这是一个完整的 PITA,也是对象数据库和存储服务的祸根之一。

于 2011-01-08T20:23:06.780 回答
0

Azure 表存储客户端本机了解 DateTime(但不了解 DateTimeOffset),因此您可能需要考虑让 SDK 为您处理此事。

否则,将 DateTimes 表示为字符串的最佳方法是将它们显式存储和检索为使用“u”格式编写和解析的 UTC 值,例如

var dateAsString = myDateTime.ToString("u");
于 2011-01-08T15:48:09.250 回答
0

我不知道它是否会起作用,但你可以尝试“幸福的无知”:

Real Table 存储实际上并不关心实体的形状(开发结构可能不同)。将您的实体属性更改为 DateTime,但在 Setter 测试中,该值是 Datetime,如果不将值解析为 DT。就像是

private DateTime myDT
public DateTime MyDT
{
    get
    {
        return myDT;
    }
    set
    {
       DateTime = null;
       if(value is DateTime)
       {
           myDT = value;
       }
       else
       {
           myDT = DateTime.Parse(value);
       }
    }

}

希望随着时间的推移,或者明确地分批,如果您只是加载实体并再次保存它们,它会将它们全部设置为 DateTime。

于 2011-01-08T23:39:43.403 回答