У меня возникли проблемы с 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 с использованием параметров. Спасибо за тех, кто пытался помочь.
Я даже не собираюсь заниматься тем, что вы делаете, но, 1) Пожалуйста, используйте свойства. 2) Изучите стандарт именования C#. 3) Посмотрите на Micro ORM, как Dapper, чтобы сделать сопоставление объектов намного проще. – willaien
Я могу предложить только начать отладчик и следовать вашему коду. Как представлено выше, есть что-то, что могло бы объяснить это поведение. – Steve
Мне бы пришлось поиграть с этим, так как я не уверен, действительно ли это способ заполнения полей в классе DelayedShipmentDTO, но, похоже, вы должны что-то использовать например: 'dto.setPromiseddate = (DateTime) reader [" PromisedDate "];' и т.д ... –