我有一个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
});
}
答案 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);
}