Получение значения DateTime из DataRow (С#)
Как я могу получить значение DateTime
в С# из строки, текущий код дает мне ошибку
любая помощь приветствуется, данные поступают из базы данных выполнения:
foreach (DataRow r in ds.Tables[0].Rows)
{
string prodCode = r["PRD-CDE"].ToString();
statCode = r["STAT"].ToString();
DateTime firstIssueDate = (DateTime)(r["FISS"]);
DateTime endIssueDate = (DateTime)(r["EISS"]);
if(endIssueDate > DateTime.Now)
{ /*do some thing...*/}
else {/*user invalid...*/}
}
существует два способа использования конвертации даты и пар, спасибо вам за помощь
Окончательный рабочий фрагмент кода:
foreach (DataRow r in ds.Tables[0].Rows)
{
string prodCode = r["PRD-CDE"].ToString(),statCode = r["STAT"].ToString();
// r.<DateTime?>("FISS");
if (r["FISS"] != DBNull.Value)
{
DateTime firstIssueDate = Convert.ToDateTime(r["FISS"]);
if (r["EISS"] != DBNull.Value)
{
DateTime endIssueDate = DateTime.Parse(r["EISS"].ToString());
if (endIssueDate > DateTime.Now)
{
Ответы
Ответ 1
Это просто предположение, но если соответствующий тип в базе данных - DateTime, можете ли вы проверить, является ли столбец допустимым?
Если это так, вы можете сделать чек r["column"] == DBNull.Value
, а затем передать его в NULL DateTime? Поле.
Или еще проще:
row.Field<DateTime?>("column")
Если это не так, да, Convert.ToDateTime() или что-то еще должно это сделать.
EDIT:
Я вижу ваш окончательный код там, но есть ли шанс, что вы хотите это сделать:
DateTime? firstIssueDate = r.Field<DateTime?>("fiss");
DateTime? endIssueDate = r.Field<DateTime?>("eiss");
if (firstIssueDate.HasValue && endIssueDate.HasValue)
{
firstIssueDate.Value // blah blah
endIssueDate.Value // blah blah
}
Ответ 2
Я бы рекомендовал использовать DateTime.Parse(), если строка возвращает строку для этого индекса.
string prodCode = r["PRD-CDE"].ToString(),statCode = r["STAT"].ToString();
DateTime firstIssueDate = DateTime.Parse(r["FISS"].ToString());
DateTime endIssueDate = DateTime.Parse(r["EISS"].ToString());
Вы также можете использовать TryParse
в зависимости от ваших потребностей.
Ответ 3
Если вы хотите использовать значение по умолчанию (например, DateTime.MinValue), а не null (DateTime?) или DBNull, вы можете сделать это:
var firstIssueDate = r["FISS"] as DateTime? ?? DateTime.MinValue;
var endIssueDate = r["EISS"] as DateTime? ?? DateTime.MinValue;
Ответ 4
foreach (DataRow r in ds.Tables[0].Rows)
{
string prodCode = r["PRD-CDE"].ToString();
string statCode = r["STAT"].ToString();
DateTime firstIssueDate = DateTime.Parse((r["FISS"]).ToString());
DateTime endIssueDate = DateTime.Parse((r["EISS"]).ToString());
if(endIssueDate > DateTime.Now)
{ /*do some thing...*/}
else {/*user invalid...*/}
}
Это должно компилироваться и работать для вас. Хотя он, конечно, не выполняет никаких проверок ошибок, которые вы должны делать для производственного кода. Также посмотрите в DateTime.TryParse, и вы можете посмотреть на добавление IFormatProvider, чтобы убедиться, что формат анализируется, как ожидалось.
Ответ 5
Прежде всего, сделайте r [ "FISS" ]. GetType() и распечатайте его на консоли (или остановитесь и посмотрите на него в отладчике). Если он говорит, что это String, то большинство из приведенных выше советов помогут. Если он говорит что-то еще, вернитесь и уточните свой вопрос.
Ответ 6
В качестве побочного ответа вы можете также использовать статическую функцию Convert.ToDateTime
Ответ 7
DateTime.Parse(r [ "FISS" ]. ToString()) - это путь, но он выдает ошибку "String не был признан допустимой DateTime". Не могли бы вы показать фактическую строку в столбце r [ "FISS" ], это может быть проблемой интернационализации....
Ответ 8
Если у вас есть строка DateTime со специальным форматом (не стандартный формат .NET DateTime), который необходимо преобразовать в тип .NET DateTime, вы можете использовать метод DateTime.ParseExact()
.
Подробнее см. документ MSDN, включая примеры.
Если у вас есть несколько форматов для синтаксического анализа, попробуйте DateTime.ParseExact Method (String, String [], IFormatProvider, DateTimeStyles)