SqlDataReader和动态格式化读取数据

时间:2012-02-02 16:07:15

标签: c# sql visual-studio-2010 string-formatting sqldatareader

我有一个C#应用程序正在从存储过程中读取数据,然后创建一条消息。我正在使用SqlDataReader从数据库中读取信息。以前,每次我有不同类型的消息并且它失控时,我不得不创建一个新类。不同的是,每个列包含不同数量的列和/或不同类型的数据。我试图更容易添加不同的消息类型,并不确定如何在读取时动态格式化数据。我已经尝试在将数据读入我的Data#变量后格式化数据,但它只是垃圾,因为它被格式化为错误的类型。因此,当我读入变量时,我目前看到它处理数据的唯一方法是我无法弄清楚如何。

我的信息格式如下:

Message
   Subject
   (Text)
     MessageHeader1
     MessageHeader2
     Title
     Header1
     Header2
     Header3
     (Data)
        Data1
        Data2
        Data3

问题是Data#变量可能包含不同类型的信息。它当前可以包含字符串,整数,日期,百分比等。有没有办法根据另一个值或其他方法格式化数据,以便可以正确格式化不同类型的数据?

if (dr.Read())
{
    message.Subject = dr["Subject"].ToString();
    message.MessageText = new AlertMessageText()
    {
        MessageHeader1 = dr["MessageHeader1"].ToString(),
        MessageHeader2 = dr["MessageHeader2"].ToString(),
        Title = dr["Title"].ToString(),
        Header1 = dr["Header1"].ToString(),
        Header2 = dr["Header2"].ToString(),
        Header3 = dr["Header3"].ToString(),
        MessageData = new List<AlertMessageData>(),
    };
}

...

while (dr.Read())
{
    message.MessageText.MessageData.Add(new AlertMessageData()
        {
            Data1 = string.Format("{0:n0}", dr["Data1"]),
            Data2 = string.Format("{0:n0}", dr["Data2"]),
            Data3 = string.Format("{0:MM/dd/yyyy}", dr["Data3"]),    // Formats Data as a Date 
        });
}

2 个答案:

答案 0 :(得分:1)

您可以使用IDataReader的GetFieldType()方法查找字段的类型。

例如,要查找第一个字段的类型,它将如下所示:

Type t = dr.GetFieldType(0)

如果您知道字段的类型,可以使用IDataReader的“Get()”方法之一为您自动转换。例如,如果你知道你的第一个字段是双字符,你可以这样做:

double d = dr.GetDouble(0);

答案 1 :(得分:1)

要确定值的数据类型,然后应用特定格式,您可以这样做:

while (dr.Read())
{
    var msg = new AlertMessageData();
    for (int i = 1; i < 4; i++)
    {
         var value = dr["Data" + i];
         string format = "{0:n0}";
         if (value is DateTime)
         {
            format = "{0:MM/dd/yyyy}";
         } 
         else if (value is string)
         {
            format = "{0}";
         }      

         var stringValue = string.Format(format, value);
         if (i == 1) msg.Data1 = stringValue;
         if (i == 2) msg.Data2 = stringValue;
         if (i == 3) msg.Data3 = stringValue;
    }
    message.MessageText.MessageData.Add(msg);
}