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

1

Вы можете использовать метод GetFieldType() в IDataReader, чтобы найти тип месторождения.

Например, чтобы найти тип своего первого поля он будет выглядеть следующим образом:

Type t = dr.GetFieldType(0) 

Если вы знаете тип вашей области, вы можете использовать один из «Get()» метод IDataReader в для автоматического конвертирования для вас. Например, если бы вы знали ваше первое поле было двойным, вы могли бы сделать это:

double d = dr.GetDouble(0); 
Смежные вопросы