Member 14914119 Ответов: 3

Я получаю строка не распознана как действительное значение datetime ошибка


Я получаю следующую ошибку:
Необработанное исключение типа 'System.FormatException' произошло в mscorlib.dll

Дополнительная информация: строка не была распознана как допустимая Дата-Время.

Я получаю ошибку в коде, упомянутом жирным шрифтом

Ниже приведен код:
    private void LoadData()
{
    con.dataGet("Select * from [User]");
    DataTable dt = new DataTable();
    con.sda.Fill(dt);
    foreach(DataRow row in dt.Rows)
    {
        int n = dataGridView1.Rows.Add();
        dataGridView1.Rows[n].Cells["dgSNo"].Value = n + 1;
        dataGridView1.Rows[n].Cells["dgName"].Value = row["Name"].ToString();
        dataGridView1.Rows[n].Cells["dgDob"].Value = Convert.ToDateTime(row["Dob"].ToString()).ToString("dd/MM/yyyy");                dataGridView1.Rows[n].Cells["dgBranch"].Value = row["Branch"].ToString();
        dataGridView1.Rows[n].Cells["dgRole"].Value = row["Role"].ToString();
        dataGridView1.Rows[n].Cells["dgESICNo"].Value = row["ESICNo"].ToString();
        dataGridView1.Rows[n].Cells["dgPFNo"].Value = row["PFNo"].ToString();
        dataGridView1.Rows[n].Cells["dgAddress"].Value = row["Address"].ToString();
    }
}


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

Я попытался изменить формат даты

Garth J Lancaster

Какой тип данных базы данных является dgDob в пользовательской таблице ?

3 Ответов

Рейтинг:
2

Sandeep Mewara

Вы получаете исключение формата. Кажется, он ожидает datetime, но переданное значение не имеет допустимого формата datetime.

Цитата:

Formatexception версия

значение не является правильно отформатированной строкой даты и времени.

Ссылаться: Класс FormatException (System) | Microsoft Docs[^]

Ибо здесь:
dataGridView1.Rows[n].Cells["dgDob"].Value = Convert.ToDateTime(row["Dob"].ToString()).ToString("dd/MM/yyyy");  

1. Есть Cells["dgDob"].Value настройка для ожидания даты и времени (просто подтверждение)
2. Это row["Dob"].ToString() действительно имея данные о дате? (надеюсь, что это не пустая или любая строка, которая не может быть использована в качестве даты). Я бы посоветовал вам использовать: значение datetime.Метод TryParse (Система) | Microsoft Docs[^]
3. для форматов datetime строки смотрите здесь: Строковый формат для DateTime [C#][^]

Кроме того, если вы хотите конвертировать любой формат даты в dd-MM-yyyy, попробуйте:
DateTime.ParseExact("YouDateString", "dd-MM-yyyy", CultureInfo.InvariantCulture)


КСТАТИ, для вашей ошибки выше, в основном вам нужно посмотреть в пункт 2 выше.


Рейтинг:
1

OriginalGriff

С какой стати ты это написал:

dataGridView1.Rows[n].Cells["dgDob"].Value = Convert.ToDateTime(row["Dob"].ToString()).ToString("dd/MM/yyyy");

Возьмите содержимое ячейки.
Преобразуйте его в строку.
Преобразуйте это в дату и время.
Преобразовать в строку
Положи в ячейку DGV.

Гораздо проще - и более удобно для кода - сохранить все как объекты DateTime и использовать средства форматирования DGV:
dataGridView1. Columns["dgDob"].DefaultCellStyle.Format = "dd/MM/yyyy";


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

Так что все будет зависеть от тебя.
К счастью, у вас есть инструмент, который поможет вам выяснить, что происходит: отладчик. Если вы не знаете, как его использовать, то быстрый Google для "Visual Studio debugger" должен дать вам необходимую информацию.

Поместите точку останова в первую строку функции и запустите код через отладчик. Затем посмотрите на свой код и на свои данные и определите, что должно произойти вручную. Затем по одному шагу в каждой строке проверяйте, что то, что вы ожидали, произойдет именно так, как и произошло. Когда это не так, тогда у вас есть проблема, и вы можете вернуться назад (или запустить ее снова и посмотреть более внимательно), чтобы выяснить, почему.

Извините, но мы не можем сделать это за вас - пришло время вам освоить новый (и очень, очень полезный) навык: отладку!

И если вы делаете то, что делаете, потому что база данных содержит строки, хранящиеся в виде дат ... измените свою БД так, чтобы она использовала вместо нее DATE, DATETIME или DATETIME2! Это будет краска (потому что я подозреваю, что у вас там уже есть испорченные даты), но в долгосрочной перспективе это намного проще.

И... Вы понимаете, что вы могли бы просто использовать SELECT, чтобы вернуть все столбцы, которые вы хотите в правильном порядке и содержимом, а затем просто использовать его в качестве источника данных вместо ручного цикла для загрузки данных? Опять же, гораздо проще и более ремонтопригодно.


Рейтинг:
1

Member 13566383

Just look which string will be returned by
row["Dob"].ToString()
The result of 
ToString("dd/MM/yyyy")
is never used (that is the return value of Convert.ToDateTime).
Use your debugger!