从数据库阅读SQLite DateTime值并将其赋给C#字符串变量

vzgqcmou  于 2023-02-05  发布在  SQLite
关注(0)|答案(4)|浏览(176)

我有一个数据库,其中包含一个日期时间列。当使用SQL Server时,我可以使用以下代码从数据库中读取日期时间值:

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值的正确配置是什么?

li9yvcax

li9yvcax1#

SQLite没有内置DateTime对象,而是将其存储为Text、真实的或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

z9smfwbn

z9smfwbn2#

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

我真的很感谢你的帮助。

c0vxltue

c0vxltue3#

你为什么转换2倍?
如果你在SQLite中有一个日期列,提供者可以为你管理它。你可以直接插入为DateTime,读取为DateTime。

4zcjmb1e

4zcjmb1e4#

这感觉有点笨拙,但这是我能想到的唯一解决方案。它只创建一个新列,将所有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]));

相关问题