Reader.GetValue日期值

问题描述 投票:2回答:2

我正在从SQL Server数据库中循环出reader.GetValue,一切正常,但是我在表中有一列数据类型为Date。当我查看表格中的数据时,它会正确显示日期'18 -Dec-17',没有时间。

reader的输出格式为:'18 -Dec-17 12:00:00 AM'且所有记录显示相同的12:00:00 AM,无论日期更改如何。

有人可以让我知道这里发生了什么,有没有选择删除或我需要正则表达或替换它?

while (reader.Read())
{
    while (cnt_field <= reader.FieldCount - 1)
    {
        db_output = db_output + "" + reader.GetValue(cnt_field) + " -\t ";
        cnt_field++;
    }//WEND
    cnt_field = 0;
    db_output = db_output + "\n\r";
}//WEND
c# date time sqldatareader
2个回答
4
投票

随着"" + reader.GetValue(...)你正在做一个隐含的reader.GetValue(...).ToString()

你看到的是DateTime的默认表示。 dotNET没有单独的Date类型。

因此,您必须检测循环内的DateTime值并应用所需的格式。

就像是

while (cnt_field <= reader.FieldCount - 1)
{
   object value = reader.GetValue(cnt_field);
   if (value is DateTime)
     db_output += ((DateTime)value).ToShortDateString();  // apply a std/custom Date format
   else   
      db_output += value.ToString(); 

   db_output += " -\t ";
   ....
}

2
投票

reader.GetValue(cnt_field)的召唤正在返回代表日期的DateTime(“盒装”为object)。现在;在数据库和DateTime中,日期时间值都没有格式 - 它们只是日期/时间的原始数值。当您将其与字符串连接时,将使用默认的.ToString(),它将应用您当前的区域性和默认格式说明符。所以:如果那不是你想要的:你需要告诉它你的意图:

var when = (DateTime)reader.GetValue(cnt_field);
db_output = db_output + "" + when.ToString(chosenFormat) + " -\t ";

您可能还想明确指定文化 - CultureInfo.InvariantCulture通常是日志等的好选择。

您可以选择standard format specifierscustom format specifiers来构建您想要的格式。你可能想要"dd-MMM-yy",所以:

db_output = db_output + "" + when.ToString("dd-MMM-yy") + " -\t ";
© www.soinside.com 2019 - 2024. All rights reserved.