2012-02-02 37 views
0

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

我的我的消息的格式如下:

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

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

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 
     }); 
} 

回答

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); 
} 
+0

这个效果很好。谢谢! – buzzzzjay 2012-02-03 15:29:32

1

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

例如,要找到你的第一个字段的类型,它是这样的:

Type t = dr.GetFieldType(0) 

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

double d = dr.GetDouble(0);