C# SqlDataReader和动态格式化读取数据
我有一个C#应用程序,它从存储过程中读取数据,然后创建一条消息。我正在使用SqlDataReader从数据库中读取信息。以前,每当我有一个不同类型的消息并且它失去控制时,我必须创建一个新类。我所说的“不同”是指每列包含不同数量的列和/或不同类型的数据。我试图使添加不同的消息类型变得更容易,并且不确定如何在读取数据时动态格式化数据。我试图在数据读入数据变量后格式化数据,但它只是垃圾,因为它被格式化为错误的类型。所以,当我读入变量时,我目前看到的唯一处理数据的方法是,我不知道如何处理 我的信息格式如下:C# SqlDataReader和动态格式化读取数据,c#,sql,visual-studio-2010,string-formatting,sqldatareader,C#,Sql,Visual Studio 2010,String Formatting,Sqldatareader,我有一个C#应用程序,它从存储过程中读取数据,然后创建一条消息。我正在使用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
});
}
if(dr.Read())
{
message.Subject=dr[“Subject”].ToString();
message.MessageText=新建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=新列表(),
};
}
...
while(dr.Read())
{
message.MessageText.MessageData.Add(新的AlertMessageData()
{
Data1=string.Format(“{0:n0}”,dr[“Data1”]),
Data2=string.Format(“{0:n0}”,dr[“Data2”]),
Data3=string.Format(“{0:MM/dd/yyyy}”,dr[“Data3”]),//将数据格式化为日期
});
}
您可以使用IDataReader的GetFieldType()
方法查找字段的类型
例如,要查找第一个字段的类型,它如下所示:
Type t = dr.GetFieldType(0)
如果知道字段的类型,可以使用IDataReader的“Get()”方法之一自动转换。例如,如果您知道第一个字段是双精度字段,则可以执行以下操作:
double d = dr.GetDouble(0);
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);
}
要确定值的数据类型,然后应用特定格式,可以执行以下操作:
double d = dr.GetDouble(0);
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);
}
while(dr.Read())
{
var msg=新的AlertMessageData();
对于(int i=1;i<4;i++)
{
var值=dr[“数据”+i];
字符串格式=“{0:n0}”;
if(值为DateTime)
{
format=“{0:MM/dd/yyyy}”;
}
else if(值为字符串)
{
format=“{0}”;
}
var stringValue=string.Format(格式,值);
如果(i==1)msg.Data1=stringValue;
如果(i==2)msg.Data2=stringValue;
如果(i==3)msg.Data3=stringValue;
}
message.MessageText.MessageData.Add(msg);
}