DateTime.TryParseExact не возвращает значение в выходной параметр? - PullRequest
2 голосов
/ 11 августа 2011

Проблема, упомянутая ниже, была решена, и код был изменен, чтобы отразить изменения.

Я хочу сравнить текущую дату с датой, хранящейся в моей базе данных MySQL. для получения текущей даты я использую сервер времени nist, который возвращает дату в формате ММ-ДД-ГГГГ, и в моей базе данных хранятся значения в формате «ГГГГ-ММ-ДД». Я хочу проверить, совпадает ли дата, которую я передаю, с датой в базе данных, а затем сделать что-то.

Я использую следующий код:

// The code originally posted has been changed to reflect changes made and it is now working fine (problem solved) a big thank you to all those who replied.
DateTime currentDate = InternetTime();
//DD/MM/YYYY is returned here convert to YYYY/MM/DD
string currentDate = x.ToString("yyyy-MM-dd");
con = new MySqlConnection(conString);
MySqlDataAdapter da = new MySqlDataAdapter();
MySqlCommand cmd = new MySqlCommand("SELECT id AS oDates FROM open_dates WHERE dates=?currentDate",con);
cmd.Parameters.AddWithValue("?currentDate",currentDate);
da.SelectCommand = cmd;
DataTable dt = new DataTable("openDates");
da.Fill(dt);

таблица "dt" остается пустой, потому что TryParseExact ничего не записывает в dateValue и поэтому остается "01-01-0001" или что-то в этом роде. Куда я иду не так? Было бы здорово, если бы кто-нибудь мог мне помочь. На самом деле есть обходной путь, о котором я подумал; Я мог бы сразу сохранить строки в базе данных, а затем проверить их, но это было бы обманом; Я хочу, чтобы свидание сработало. Я пытался найти команды MySQL, которые могли бы мне помочь, но я не смог их найти.

Ответы [ 3 ]

6 голосов
/ 11 августа 2011

Вы игнорируете результат DateTime.TryParseExact. Он почти наверняка вернет false, указывая на то, что ему не удалось разобрать строку - и в этом случае задокументировано записать DateTime.MinValue в параметр out. Вы должны определенно проверять возвращаемое значение и действовать соответствующим образом, если синтаксический анализ не удался.

Я подозреваю Кстати, вам нужна строка формата "yyyy-MM-dd".

Обратите внимание, что вы не должны включать дату в строку SQL непосредственно в следующую строку - вместо этого вы должны использовать параметризованный запрос.

Действительно, вам также не следует преобразовывать x в строку - это уже DateTime, так почему вы конвертируете его в строку, а затем анализируете ее? Ваш комментарий указывает, что вы думаете, что значение DateTime имеет определенный формат - это не так, как и числа, - форматы относятся к тому, как значение преобразуется в текст , и не присущи само значение.

1 голос
/ 11 августа 2011

Пропустить все преобразования DateTime в строку и обратно и использовать параметров . Вы должны всегда использовать параметры, так как преобразование параметра в строку - тяжелая работа, и вы склонны к SQL-инъекциям атак.

DateTime currentDate = InternetTime().Date;

MySqlDataAdapter da = new MySqlDataAdapter();

MySqlCommand cmd = new MySqlCommand(
    "SELECT id, dates AS oDates FROM open_dates WHERE dates=?currentDate", connection);
cmd.Parameters.Add("?currentDate", MySqlDbTypes.DateTime, currentDate);

da.SelectCommand = cmd;

DataTable dt = new DataTable("openDates");
da.Fill(dt);

Вы также можете один раз подготовить SqlCommand / DataAdapter и каждый раз менять значение параметра:

da.SelectCommand.Parameters["?currentDate"] = currentDate;
0 голосов
/ 11 августа 2011

Прежде всего, почему вы делаете все эти перестановки.Было бы проще сказать:

string currentDate = x.ToString("yyyy-MM-dd"); // This gives you the format that you need

Во-вторых, ваш формат YYYY-MM-DD недействителен.Это должен быть гггг-ММ-дд, как указано в ToString ().

В-третьих, если вы действительно хотите сохранить дату в виде строки, отформатируйте ее в выражении SQL, которое вы генерируете, используя

MySqlDataAdapter da = new MySqlDataAdapter("SELECT id,dates AS oDates FROM open_dates     WHERE dates=DATE("+x.ToString("yyyy-MM-dd")+");", con);

Таким образом, вы можете игнорировать всю вашу логику обработки, определенную ранее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...