【问题标题】:Reading an SQLite DateTime value from database and assigning it to a C# string variable从数据库中读取 SQLite DateTime 值并将其分配给 C# 字符串变量
【发布时间】:2017-07-26 14:33:06
【问题描述】:

我有一个带有数据表的数据库,其中包括 DateTime 列等。使用 SQL Server 时,我可以使用以下代码从数据库中读取 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");

                }

我不断收到以下错误:“字符串未被识别为有效的日期时间。”

我尝试了不同的变量组合和声明,但没有成功。从 SQLite 数据库中读取 DateTime 值的正确配置是什么?

【问题讨论】:

  • 你试过用Convert.ToDateTime(readList["dob"])代替简单的演员表吗?
  • @erikscandola 您发布的“简单转换”,即默认转换为DateTime

标签: c# sqlite datetime


【解决方案1】:

SQLite 没有内置的 DateTime 对象,而是将它们存储为 Text、Real 或 Int 值。

根据您的错误,您可以推断它是作为文本输出的;根据 SQLite 文档,其格式应为“YYYY-MM-DD HH:MM:SS.SSS”

有多种方法可以将其解析为 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

【讨论】:

  • 感谢您的建议,但这似乎将字符串格式的日期转换为 DateTime 格式,这不是我想要完成的。我想从数据库中读取一个日期,它以 DateTime 格式完美地保存到数据库中,并使用字符串格式的标签显示它。
  • @pallMallchemist 您的数据库返回的对象显然是一个字符串。尝试添加此函数并将代码行更改为 lblEmpDob.Text = ConvertToDateTime(readList["dob"]).ToString("d");
  • SQLite 与 Xamarin (Android/iOS) 以 binary 格式存储 DateTime。对我来说,当我按如下方式读出数据时它起作用了:DateTime.FromBinary(dataReader.GetInt64(ordinal)) 然后您可以像往常一样将此日期转换为字符串。
【解决方案2】:

感谢您的回答,我终于按照建议通过将 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");

非常感谢您的帮助。

【讨论】:

  • 它实际上是 dateDOB.ToString("yyyy-MM-dd HH:mm:ss") DateTime 你写的 OP 提到 DateTime 不是 Date
【解决方案3】:

为什么要转换 2 次?

如果您在 SQLite 中有 Date 列,则提供程序可以为您管理。 您可以直接插入为 DateTime 并读取为 DateTime。

【讨论】:

  • 由于某种原因,读取日期并将其直接分配给标签不允许我使用“.ToString("d")”功能格式化日期(因为没有更好的词。它仅在首先以 DataeTime 格式读取时才有效。
  • 在您的解决方案中,您有dateDOB(这可能是一个可空日期)。您不需要在插入之前转换为字符串。而readList["dob"] 是一个日期(如果该列是可空的,则为空日期)。为什么你不使用DateTime? dateOfBirthEmp = readList["dob"] as DateTime?;
猜你喜欢
  • 1970-01-01
  • 2018-09-03
  • 1970-01-01
  • 2021-12-24
  • 2018-11-24
  • 1970-01-01
  • 2013-10-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多