Чтение значения SQLite DateTime из базы данных и присвоение его строковой переменной C#

У меня есть база данных с таблицей данных, которая включает в себя столбец DateTime среди прочего. При использовании SQL-сервера я мог прочитать значение DateTime из базы данных, используя следующий код:

    SqlCommand getdate = new SqlCommand("SELECT * FROM EMPinfo WHERE id = @employeeId", connect);
                getdate.Parameters.AddWithValue("@employeeId", listViewEmployee.SelectedItems[0].SubItems[2].Text);
                getdate.Connection = connect;
                connect.Open();
                SqlDataReader readList = getdate.ExecuteReader(CommandBehavior.CloseConnection);
                while (readList.Read())
                {
                    lblEmpDob.Text = ((DateTime)readList["dob"]).ToString("d");
                }

После изменения кода для запуска с SQLite:

    SQLiteConnection connect = new SQLiteConnection(@"Data Source=quotevodata.db;");
                SQLiteCommand getlistname = new SQLiteCommand("SELECT * FROM EMPinfo WHERE id = @employeeId", connect);
                getlistname.Parameters.AddWithValue("@employeeId", listViewEmployee.SelectedItems[0].SubItems[2].Text);
                getlistname.Connection = connect;
                connect.Open();
                SQLiteDataReader readList = getlistname.ExecuteReader(CommandBehavior.CloseConnection);
                while (readList.Read())
                {
                     lblEmpDob.Text = ((DateTime)readList["dob"]).ToString("d");

                }

Я продолжаю получать следующую ошибку: "Строка не была распознана как допустимое время и дата".

Я пробовал разные комбинации и объявление переменных, но это не сработало. Какова правильная конфигурация для чтения значений DateTime из базы данных SQLite?

4 ответа

Решение

Спасибо за ответы, я, наконец, заставил его работать, изменив оператор INSERT на формат SQLite, как это было предложено:

    string empDob = dateDOB.Value.ToString("yyyy-MM-dd");
    //I then inserted this string into the database with the column configured as a "DATE" datatype.

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

    DateTime dateOfBirthEmp = DateTime.Parse(readList["dob"].ToString());

    lblEmpDob.Text = dateOfBirthEmp.ToString("d");

Я очень ценю помощь.

SQLite не имеет встроенного объекта DateTime, а хранит их как значения Text, Real или Int.

По вашей ошибке вы можете сделать вывод, что она выводится как текст; Который согласно документации SQLite должен быть в формате "ГГГГ-ММ-ДД ЧЧ: ММ: СС.ССС"

Существуют различные способы анализа этого объекта DateTime, но я буду использовать RegEx:

public static DateTime ConvertToDateTime(string str)
{
    string pattern = @"(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})\.(\d{3})";
    if (Regex.IsMatch(str, pattern))
    {
        Match match = Regex.Match(str, pattern);
        int year = Convert.ToInt32(match.Groups[1].Value);
        int month = Convert.ToInt32(match.Groups[2].Value);
        int day = Convert.ToInt32(match.Groups[3].Value);
        int hour = Convert.ToInt32(match.Groups[4].Value);
        int minute = Convert.ToInt32(match.Groups[5].Value);
        int second = Convert.ToInt32(match.Groups[6].Value);
        int millisecond = Convert.ToInt32(match.Groups[7].Value);
        return new DateTime(year, month, day, hour, minute, second, millisecond);
    }
    else
    {
        throw new Exception("Unable to parse.");
    }
}

документы: http://www.sqlite.org/datatype3.html

Почему вы конвертируете 2 раза?

Если у вас есть столбец Date в SQLite, провайдер может управлять этим для вас. Вы можете напрямую вставить как DateTime и читать как DateTime.

Это кажется немного хакерским, но это единственное решение, которое я смог придумать. Он просто создает новый столбец, копирует все значения в формате DateTime в новый столбец и удаляет старый столбец строки времени.

      DataTable dt = GetDataTable();
string tc = "TimeColumnName";

dt.Constraints.Clear();
int ordinal = dt.Columns[tc].Ordinal;
dt.Columns[tc].ColumnName = "TSOLD";
dt.Columns.Add(tc, typeof(DateTime));
foreach (DataRow row in dt.Rows) row[tc] = Convert.ToDateTime(row["TSOLD"]);
// remove "OLD" column
dt.Columns.Remove("TSOLD");
dt.Columns[tc].SetOrdinal(ordinal);
dt.Constraints.Add(new UniqueConstraint(dt.Columns[tc]));
Другие вопросы по тегам