Чтение даты с помощью DataReader

Я прочитал строку, используя этот формат, с помощью программы чтения данных. Как я могу прочитать дату, используя аналогичный формат?

while (MyReader.Read())
{
    TextBox1.Text = (string)MyReader["Note"];
}

person TeaDrinkingGeek    schedule 11.04.2011    source источник
comment
Что такое SQL тип данных столбца даты?   -  person abatishchev    schedule 11.04.2011


Ответы (6)


Попробуйте, как указано ниже:

while (MyReader.Read())
{
    TextBox1.Text = Convert.ToDateTime(MyReader["DateField"]).ToString("dd/MM/yyyy");
}

в методе ToString() вы можете изменить формат данных в соответствии с вашими требованиями.

person Sukhjeevan    schedule 11.04.2011
comment
Ошибка в ConvertTo. Не существует в текущем контексте. - person TeaDrinkingGeek; 11.04.2011

Если столбец запроса имеет соответствующий тип, то

var dateString = MyReader.GetDateTime(MyReader.GetOrdinal("column")).ToString(myDateFormat)

Если столбец запроса на самом деле является строкой, см. другие ответы.

person Richard    schedule 11.04.2011
comment
GetDateTime принимает только целое число: msdn.microsoft.com/en-us/library/ - person sikander; 23.02.2014
comment
@sikander Я могу только утверждать, что постоянно забываю использовать GetOrdinal. - person Richard; 23.02.2014
comment
глупо MS не разрешать имя столбца. Спасибо за обновление вашего ответа. - person sikander; 24.02.2014

Это может показаться немного не по теме, но это был пост, на который я наткнулся, когда задавался вопросом, что происходит, когда вы читаете столбец как dateTime в С#. Пост отражает информацию, которую я хотел бы найти об этом механизме. Если вы беспокоитесь о UTC и часовых поясах, читайте дальше

Я провел немного больше исследований, так как я всегда очень настороженно отношусь к DateTime как к классу из-за его автоматических предположений о том, какой часовой пояс вы используете, и потому, что слишком легко спутать местное время и время по Гринвичу.

Чего я пытаюсь избежать, так это того, что DateTime переходит 'о, смотрите, компьютер, на котором я работаю, находится в часовом поясе x, поэтому это время также должно быть в часовом поясе x, когда меня спросят о моих значениях, я отвечать так, как будто я нахожусь в этом часовом поясе '

Я пытался прочитать столбец datetime2.

Время, когда вы вернетесь с сервера sql, в конечном итоге будет равно Kind.Unspecified, это, по-видимому, означает, что оно обрабатывается как UTC, чего я и хотел.

При чтении столбца date вы также должны читать его как DateTime, даже несмотря на то, что в нем нет времени и он еще более подвержен ошибкам из-за часовых поясов (как в полночь).

Я бы определенно посчитал это более безопасным способом чтения DateTime, поскольку я подозреваю, что он, вероятно, может быть изменен либо настройками на сервере sql, либо статическими настройками в вашем С#:

var time = reader.GetDateTime(1);
var utcTime = new DateTime(time.Ticks, DateTimeKind.Utc);

Оттуда вы можете получить компоненты (день, месяц, год) и т. д. и отформатировать их по своему усмотрению.

Если то, что у вас есть, на самом деле является датой + временем, то Utc может быть не тем, что вам нужно, - поскольку вы возитесь с клиентом, вам может потребоваться сначала преобразовать его в местное время (в зависимости от того, что означает время ). Однако это открывает целую банку червей. Если вам нужно это сделать, я бы рекомендовал использовать библиотеку, например noda time. В стандартной библиотеке есть TimeZoneInfo, но после краткого изучения в нем, похоже, нет правильного набора часовых поясов. . Вы можете увидеть список, предоставленный TimeZoneInfo, используя метод TimeZoneInfo.GetSystemTimeZones();

Я также обнаружил, что студия управления сервером sql не преобразует время в местное время перед их отображением. Какое облегчение!

person JonnyRaa    schedule 21.04.2015
comment
Вы можете сократить это как DateTime.SpecifyKind(reader.GetDateTime(1), DateTimeKind.Utc), чтобы вам не приходилось вручную жонглировать галочками :) - person jocull; 17.01.2017

Я знаю, что это старый вопрос, но я удивлен, что ни в одном ответе не упоминается GetDateTime:

Получает значение указанного столбца в виде объекта DateTime.

Который вы можете использовать как:

while (MyReader.Read())
{
    TextBox1.Text = MyReader.GetDateTime(columnPosition).ToString("dd/MM/yyyy");
}
person Camilo Terevinto    schedule 02.05.2018
comment
Я думаю, что принятый ответ - хороший ответ, потому что из вопроса OP ясно: I read a string using this format with a data reader. How can I read in a date using similar format? OP спрашивает, что у него / нее есть столбец в строковом формате, но он хочет преобразовать / отобразить его в формате даты. Примером этого может быть SQLite db, где мы вводим дату в строковом формате. Ссылка: Типы данных SQLite. - person nam; 29.05.2020

В моем случае я изменил поле даты и времени в базе данных SQL, чтобы не допускать null. Затем SqlDataReader позволил мне привести значение непосредственно к DateTime.

person user2328824    schedule 21.04.2017

person    schedule
comment
ВЫ ПОПРОБОВАЛИ ЭТО ONE Convert.ToDateTime(MyReader[ColumnName]); ? - person Muhammad Akhtar; 11.04.2011
comment
Оба правых выражения возвращают DateTime. тем временем левое выражение принимает String. Так что вам все равно нужно позвонить ToString(). - person abatishchev; 11.04.2011
comment
@абатищев; да, это очевидно, я только что предоставил ему решение о том, как преобразовать в DateTime. Я игнорирую эту часть, потому что я предполагаю, что он должен знать это. - person Muhammad Akhtar; 11.04.2011
comment
Правильно. Затем просто удалите левую часть, чтобы сделать код компилируемым :) - person abatishchev; 11.04.2011