chellapandi160 Ответов: 1

Строка не была распознана как допустимая дата-время. Только клиентская машина


Hi,

I'm getting Exception on this only Client Machine, While build and Execute in local machine didn't get any Exception. Please go through let me know...


<pre>DateTime LastRunAt = new DateTime(2000,08,15);
            //
            string query = "SELECT golden_id FROM `golden_details` WHERE `golden_name` = '" + goldenName + "'";
            MySQLDataBaseHelper.Result gId = db.ExecuteNonQuery(query);
            if (gId.ResultSet.Rows.Count > 0)
            {
                query = "SELECT `datetime` FROM `" + gId.ResultSet.Rows[0]["golden_id"] + "_golden_audit_trail_details` WHERE `id` = (SELECT Max(id) FROM `" + gId.ResultSet.Rows[0]["golden_id"] + "_golden_audit_trail_details`)";
                MySQLDataBaseHelper.Result gUDt = db.ExecuteNonQuery(query);
                IFormatProvider provider = new CultureInfo("en-US", true);
                if (gUDt.ResultSet.Rows.Count > 0)
                    //LastRunAt =Convert.ToDateTime(gUDt.ResultSet.Rows[0]["datetime"].ToString());
                    LastRunAt = DateTime.Parse(gUDt.ResultSet.Rows[0]["datetime"].ToString(),provider,DateTimeStyles.AdjustToUniversal);
            }

            //

            if (r.Success && r.NumberOfRecords > 0)
            {
                string lastRunDatePath = Path.Combine(Application.StartupPath, "LastRunAt");
                List<string> jobIDs = r.ResultSet.AsEnumerable().Select(p => "" + p.Field<int>("job_id")).ToList();
                foreach (string jID in jobIDs)
                {
                    MySQLDataBaseHelper.Result rID = db.ExecuteNonQuery("SELECT `last_run_at` FROM `job_details` WHERE `job_id` = "+jID);
                    IFormatProvider provider1 = new CultureInfo("en-US", true);
                    //DateTime time = Convert.ToDateTime(rID.ResultSet.Rows[0]["last_run_at"].ToString());
                    DateTime time = DateTime.Parse(rID.ResultSet.Rows[0]["last_run_at"].ToString(), provider1, DateTimeStyles.NoCurrentDateDefault);
                    if (LastRunAt.CompareTo(time) < 0)
                        LastRunAt = time;
                }
                Directory.CreateDirectory(lastRunDatePath);
            }
            return LastRunAt;


Что я уже пробовал:

I'm getting Exception on this only Client Machine, While build and Execute in local machine didn't get any Exception. Please go through let me know...

F-ES Sitecore

Вы не думаете, что линия, на которой происходит ошибка, имеет какое-либо отношение к решению проблемы?

Вы будете делать предположения о форматах дат, основанных на ваших настройках, но разные люди имеют разные настройки. Если вы попросите код преобразовать "1/1/2000" в дату, он будет работать на вашем компьютере, где это ваша настройка формата даты, но если я нахожусь в Японии и моя настройка 2000-1-1, то он не будет работать, так как компьютер не знает, что означает "1/1/2000".

chellapandi160

Строка не была распознана как допустимая дата-время. в системе.значение datetime.Parse(String s, DateTimeFormatInfo dtfi,стили DateTimeStyles)

Этот Exeception я получаю все остальные ПК. Кроме моего компьютера..

F-ES Sitecore

Если "datetime" и "last_run_at" являются полями даты в базе данных, то не используйте ToString, а используйте универсальный метод

https://stackoverflow.com/questions/1106204/retrieving-a-datetime-value-from-a-datarow-c

Если эти значения хранятся в виде строк, то вам нужно знать формат, в котором они хранятся, и использовать DateTime.TryParseExact, а не Parse.

Richard MacCutchan

Почему вы преобразуете значение DateTime в строку, просто чтобы вы могли разобрать его обратно в DateTime?

1 Ответов

Рейтинг:
1

OriginalGriff

Единственное реальное решение этой проблемы - хранить ваши значения datetime в виде DATETIME, DATE или DATETIME2 в вашей базе данных-таким образом, Вы анализируете их, используя настройки для пользователя, который ввел дату, когда она была введена, и она никогда не должна быть преобразована снова. Сохранение его в виде строки и разбор его позже всегда приводит к проблемам - и к тому времени у вас больше нет никакого пользовательского контекста, чтобы помочь вам решить, в каком формате находится дата.

Итак, прямо сейчас у вас есть база данных, где информация хранится плохо, и вы понятия не имеете, должен ли 01/02/03 быть 1 февраля 2003 года, 2 января 2003 года или 3 февраля 2001 года.
Измените свою базу данных и повторно введите всю информацию о дате.

И сделайте себе одолжение: никогда не объединяйте строки для построения SQL-команды. Это оставляет вас широко открытыми для случайной или преднамеренной атаки SQL-инъекции, которая может уничтожить всю вашу базу данных. Вместо этого используйте параметризованные запросы.

Когда вы объединяете строки, вы вызываете проблемы, потому что SQL получает такие команды, как:

SELECT * FROM MyTable WHERE StreetAddress = 'Baker's Wood'
Цитата, добавленная пользователем, завершает строку в том, что касается SQL, и вы получаете проблемы. Но могло быть и хуже. Если я приду и наберу вместо этого: "x';DROP TABLE MyTable;--", то SQL получит совсем другую команду:
SELECT * FROM MyTable WHERE StreetAddress = 'x';DROP TABLE MyTable;--'
Которые SQL видит как три отдельные команды:
SELECT * FROM MyTable WHERE StreetAddress = 'x';
Совершенно правильный выбор
DROP TABLE MyTable;
Вполне допустимая команда "удалить таблицу"
--'
А все остальное-это комментарии.
Так оно и происходит: выбирает любые совпадающие строки, удаляет таблицу из базы данных и игнорирует все остальное.

Поэтому всегда используйте параметризованные запросы! Или будьте готовы часто восстанавливать свою БД из резервной копии. Вы ведь регулярно делаете резервные копии, не так ли?