C# 将基本类型(日期、数字)转换为字符串并返回以保存到C中的数据库#

C# 将基本类型(日期、数字)转换为字符串并返回以保存到C中的数据库#,c#,sql-server,string,datetime,typeconverter,C#,Sql Server,String,Datetime,Typeconverter,我有一个循环的可配置任务,它接收一个表名和一个列名,然后从该表中提取按指定列排序的行,并对它们进行一些处理。最后,它保存order列的最后一个值,这样当它再次启动时,它只处理从该点开始的行 为了保存这些信息,我有一个不同的表,其中包含一些标识信息(表名等)和order列的最后一个值作为字符串。为了使用这个表,我做了如下操作: public T GetValue<T>(ProgressRecord<T> record) { string value = GetVal

我有一个循环的可配置任务,它接收一个表名和一个列名,然后从该表中提取按指定列排序的行,并对它们进行一些处理。最后,它保存order列的最后一个值,这样当它再次启动时,它只处理从该点开始的行

为了保存这些信息,我有一个不同的表,其中包含一些标识信息(表名等)和order列的最后一个值作为字符串。为了使用这个表,我做了如下操作:

public T GetValue<T>(ProgressRecord<T> record) {
    string value = GetValueAsString(record); // this calls a sproc that fetches the value; the record fields are used as a filter
    return value != null ? (T)Convert.ChangeType(value, typeof(T)) : default(T);
}

public void SetValue<T>(ProgressRecord<T> record) {
    string value = Convert.ToString(record.value);
    InnerSetValue(record, value); // this calls a sproc that saves the value; the record fields are used as a filter
}

由于IFs,我发现这段代码有点脏。有没有一种更简单的方法来进行这些转换,而不必进行类型检查?是否有我错过的系统类知道如何做到这一点:将日期转换为毫秒或更高的字符串,并为空值提供自定义默认值(SQLDateTime.MinValue)?

标准的
convert.ToString(DateTime值)
只是调用
value.ToString()

DateTime.ToString()
实际上正在调用

DateTimeFormat.Format(this, null, DateTimeFormatInfo.CurrentInfo)
因此,基本上,如果您使用特定的dtfi更改区域性设置,您可以在最后设置默认格式(毫秒),我认为您可以绕过第一个问题

至于第二个问题,我不知道是否有可能以任何优雅的方式重写。如果值等于
DateTime.MinValue
,您可以在将值更新到数据库之前进行检查,或者,不那么优雅,执行以下代码,希望没有人发现是您做的:

typeof(DateTime).GetField ("MinValue").SetValue (typeof(DateTime), new DateTime(1753, 1, 1));

我看到了两种完成任务的方法:

  • 在数据库查询中,使用四舍五入到秒的日期时间。我是说 如果为处理设置的行的最后一条记录为01:23:42.578, 您将忽略它并处理01:23:42.000之前的所有记录。这 意味着您将其留给下一个处理。然后你去商店 01:23:42.000作为配置中最后处理的日期时间值 信息表。下次运行处理时,您将获取所有 从01:23:42.000开始的记录,其中包括 01:23:42.578,上一次跑步时应该会用到它
  • 第二种解决方案将涉及使用属性,如果
    DateTime
    type

  • 您可以在sql server中使用float或int将较早的日期设置为负数,例如Select(Convert(DateTime,-1)。请注意,我允许使用null,而不必考虑整个问题。当您设置
    静态
    字段的值时,只需使用
    null
    作为
    SetValue
    的第一个参数即可(对象(
    System.RuntimeType
    )没有
    MinValue
    字段)。但是,不要通过反射更改
    只读
    字段的值!它很可能会破坏很多代码,包括基类库中的代码。更改当前区域性不会影响整个应用程序吗?@AndreifierBenenau会。这就是为什么Mihail的答案似乎是最好的。不过,通过上述方法,al正如Jeppe所说,虽然不推荐使用。但另一方面,对于区域性设置,可以只执行这两种方法,然后将其更改回原来的状态。第一个选项需要比我已经执行的方式更多的更改,并且仍然需要DateTime的特定代码,这就是我正在尝试的我希望有一种类似于Convert.ToString(dateTime)的方法,可以提供一个字符串自定义格式,但我可能错过了。
    typeof(DateTime).GetField ("MinValue").SetValue (typeof(DateTime), new DateTime(1753, 1, 1));