2016-01-21 2 views
0

У меня возникли проблемы с SqlDataReader. У меня есть функция, как этот столSqlDataReader возвращает неправильное значение поля

public static ObservableCollection<DelayedShipmentDTO> getAllDelayShipmentsInfo() 
{ 
    ObservableCollection<DelayedShipmentDTO> retlist = new ObservableCollection<DelayedShipmentDTO>(); 

    SqlConnection conn = null; 
    SqlCommand command = null; 

    try 
    { 
     conn = new SqlConnection(connectionString); 
     conn.Open(); 

     command = new SqlCommand("Select * from Delay", conn); 

     SqlDataReader reader = command.ExecuteReader(); 

     while (reader.Read()) 
     { 
      DelayedShipmentDTO dto = new DelayedShipmentDTO(); 
      dto.setPromiseddate((DateTime)reader["PromisedDate"]); 
      dto.setNewShipmentdate((DateTime)reader["NewShipmentDate"]); 
      dto.setOrdernumber(reader["OrderNumber"].ToString()); 
      dto.setDelaytype(reader["DelayType"].ToString()); 
      dto.setDelayreason(reader["DelayReason"].ToString()); 
      dto.setIsnotified((bool)reader["isnotified"]); 
      dto.setNotificationtype(reader["NotificationType"].ToString()); 

      //DelayedShipmentDTO dto = new DelayedShipmentDTO((DateTime)reader["PromisedDate"], (DateTime)reader["NewShipmentDate"], reader["OrderNumber"].ToString(), reader["NotificationType"].ToString(), 
      // reader["DelayType"].ToString(), reader["DelayReason"].ToString(), (bool)reader["isnotified"]); 

      retlist.Add(dto); 
     } 

     return retlist; 
    } 
    catch (Exception ex) 
    { 
     throw new Exception(ex.Message); 
    } 
    finally 
    { 
     if (conn != null) 
     { 
      ((IDisposable)conn).Dispose(); 
     } 
    } 
} 

public class DelayedShipmentDTO 
{ 
    DateTime promisedDate; 
    DateTime newShipmentDate; 
    string orderNumber; 
    string notificationType; 
    string delayType; 
    string delayReason; 
    bool isNotified; 
public DelayedShipmentDTO() { } 
    public DelayedShipmentDTO(DateTime p, DateTime n, string o, string sn, string dt, string dr, bool i) 
    { 
     promisedDate = p; 
     newShipmentDate = n; 
     orderNumber = o; 
     notificationType = sn; 
     delayType = dt; 
     delayReason = dr; 
     isNotified = i; 
    } 

    public void setPromiseddate(DateTime value) { promisedDate = value; } 
    public void setNewShipmentdate(DateTime value) { newShipmentDate = value; } 
    public void setOrdernumber(string value) { orderNumber = value; } 
    public void setNotificationtype(string value) { notificationType = value; } 
    public void setDelaytype(string value){delayType = value;} 
    public void setDelayreason(string value) { delayReason = value; } 
    public void setIsnotified(bool value) { isNotified = value; } 
} 

Мой SQL Server настроен как этот

CREATE TABLE [dbo].[Delay] 
(
    [DelayID] [int] IDENTITY(1,1) NOT NULL, 
    [PromisedDate] [date] NOT NULL, 
    [NewShipmentDate] [date] NOT NULL, 
    [Ordernumber] [nvarchar](50) NOT NULL, 
    [DelayType] [nvarchar](50) NOT NULL, 
    [DelayReason] [nvarchar](50) NOT NULL, 
    [isNotified] [bit] NOT NULL, 
    [NotificationType] [nvarchar](50) NOT NULL 
) ON [PRIMARY] 

Проблема в том, когда я читаю каждую строку, все строки по умолчанию на значение ordernumber поля. Нет проблем с булевым, а также с датой.

EDIT 1: Для уточнения по результатам метода

PromisedDate = 1/21/2016 - correct 
NewShipmentDate = 1/22/2016 - correct 
isNotified = true; - correct 
OrderNumber = "123456" -correct 
DelayType = "123456" - wrong 
DelayReason = "123456" - wrong 
NotificationType = "123456" - wrong 

EDIT 2: нашел ошибку! Это была ошибка с моей стороны в addRecord с использованием параметров. Спасибо за тех, кто пытался помочь.

+6

Я даже не собираюсь заниматься тем, что вы делаете, но, 1) Пожалуйста, используйте свойства. 2) Изучите стандарт именования C#. 3) Посмотрите на Micro ORM, как Dapper, чтобы сделать сопоставление объектов намного проще. – willaien

+2

Я могу предложить только начать отладчик и следовать вашему коду. Как представлено выше, есть что-то, что могло бы объяснить это поведение. – Steve

+0

Мне бы пришлось поиграть с этим, так как я не уверен, действительно ли это способ заполнения полей в классе DelayedShipmentDTO, но, похоже, вы должны что-то использовать например: 'dto.setPromiseddate = (DateTime) reader [" PromisedDate "];' и т.д ... –

ответ

0

Вот что я думаю, что вы пытаетесь сделать с кодом вы отображаемыми:

while (reader.Read()) 
      { 
       DelayedShipmentDTO dto = new DelayedShipmentDTO((DateTime)reader["PromisedDate"], 
       (DateTime)reader["NewShipmentDate"], 
       reader["OrderNumber"].ToString(), 
       reader["DelayType"].ToString(), 
       reader["DelayReason"].ToString(), 
       reader["NotificationType"].ToString(), 
       (bool)reader["isnotified"]); 

       //DelayedShipmentDTO dto = new DelayedShipmentDTO((DateTime)reader["PromisedDate"], (DateTime)reader["NewShipmentDate"], reader["OrderNumber"].ToString(), reader["NotificationType"].ToString(), 
       // reader["DelayType"].ToString(), reader["DelayReason"].ToString(), (bool)reader["isnotified"]); 

       retlist.Add(dto); 
      } 

Обратите вниманием, как я передаю значение в метод DelayedShipmentDTO во время создания экземпляра класса? Пожалуйста, проконсультируйтесь с другими, когда речь заходит о соглашениях об именах и о том, как отлаживать, поскольку этот код быстро выйдет из-под контроля.

+0

его в основном то, что у меня есть, заметьте прокомментированную часть? Я следовал за кодом, используя debugs, а также с помощью предлагаемой вами модификации. Я заметил, что даже строка tmp = reader [«DelayReason»]. ToString() сделает tmp равным значению читателя [«OrderNumber»]. ToString() –

+0

ОК, я только что построил вашу таблицу и запустил ваш код и проверил список рецентов на 2 строки я добавил, и все, кажется, на месте. _Используйте предыдущий пост, я почему-то не видел нижний сегмент кода. –

Смежные вопросы