#c# #.net #winforms #datatable #datarow
#c# #.net #winforms #datatable #datarow
Вопрос:
У меня есть две вызванные таблицы visits
members
, и я получаю данные с помощью следующего запроса..
string sql= @"SELECT member_Firstname, member_Lastname, member_Postcode,
visit_DateTime, visit_Status, visit_Logout_DateTime, visits.member_Id, visit_AlertMsg
FROM members, visits
WHERE members.member_Id = visits.member_Id
AND members.member_Active LIKE 'y%'";
здесь я получаю значения visit_DateTime с помощью некоторых сравнений со значениями со списком
datatable dt = helper.getdata(sql)
foreach (DataRow row in dt.Rows)
{
if (row["visit_Logout_DateTime"] != null)
{
DateTime dtlogout = DateTime.Parse(row["visit_Logout_DateTime"].ToString());
if (dtlogout != null)
{
if (cbPeriod.Text == "Today")
{
newItem.lblTime.Text = dtlogout.ToString("HH':'mm':'ss");
}
else
newItem.lblTime.Text = dtlogout.ToString("yyyy'-'MM'-'dd' - 'HH':'mm':'ss");
}
}
}
но я получил ошибку в этой строке DateTime dtlogout = DateTime.Parse(row["visit_Logout_DateTime"].ToString());
ошибка : string was not recognised as valid datetime (because of one value in that row is empty)
строка "visit_Logout_DateTime"
у меня есть значения "visit_Logout_DateTime"
, подобные этому….
firstname lastname postcode visit_Logout_DateTime
------------- -------- --------- ---------------------
rob peter hhd344h
peter chan hy78kjk 2011-09-08 12:09:08
rock sam yudufg3746h 2011-08-08 09:08:45
я пробовал это для проверки пустых значений этого visit_Logout_DateTime, как я упоминал выше..
но мне не удалось проверить, является ли значение пустым или отсутствует в этой строке…
как проверить, является ли каждое значение в этой строке (строка [«visit_Logout_DateTime»]) пустым или нет
кто-нибудь, пожалуйста, помогите мне в этом, ребята…
большое спасибо….
Ответ №1:
Вместо проверки, соответствует ли столбец null
, вы должны проверить, соответствует ли содержимое столбца null
. Вы можете сделать это, сравнив его с DBNull.Value
:
if (row["visit_Logout_DateTime"] != DBNull.Value)
{
...
}
Ответ №2:
Первое — используйте TryParse, а не Parse для анализа значений, когда вы не уверены, будет ли значение допустимым объектом или нет.
Для проверки всех значений попробуйте следующий пример кода для проверки каждого значения:
DataTable dt = new DataTable("MyTable");
foreach (DataRow row in dt.Rows)
{
foreach (DataColumn column in dt.Columns)
{
if (row[column] != null)
{
string value = row[column].ToString();
if (!String.IsNullOrEmpty(value))
{
// Do something
}
}
}
}
Комментарии:
1. Спасибо… но мне нужно проверить каждое значение в этой строке, является ли оно нулевым или пустым, и я попробовал String . IsNullOrEmpty но я все равно получаю ту же ошибку
2. Попробуйте это решение с приведенной ниже идеей Кристофа
Ответ №3:
Вы можете использовать DateTime.TryParse
так:
DateTime date = new DateTime();
if (DateTime.TryParse(row["visit_Logout_DateTime"], out date))
dtlogout = date;
Ответ №4:
Вы не можете проверить строку null
. Вы должны сравнить с DBNull.Value
. Итак, либо используйте:
row["visit_Logout_DateTime"] != DBNull.Value
или
!string.IsNullOrEmpty(row["visit_Logout_DateTime"].ToString())
Ответ №5:
Чтобы расширить ответ Кристофа, вы могли бы взглянуть на методы расширения, чтобы немного привести в порядок код;
public static DateTime? GetDate( this DataRow Row, string ColumnName )
{
object Value = Row[ ColumnName ];
if( Value == DBNull.Value )
return null;
else
return (DateTime)Value;
}
// Repeat for other types, or use a generic version.
...
DateTime? dtlogout = row.GetDate("visit_Logout_DateTime");
Обратите внимание на использование обнуляемого DateTime (завершающего ?) чтобы он мог принимать нули.