TIMESTAMP列存空字符串导致SQLiteDataAdapter.Fill抛出FormatException
解决SQLiteDataAdapter.Fill时因TIMESTAMP列空字符串引发的FormatException问题
我刚碰到过完全一样的坑!问题的核心在于System.Data.SQLite对TIMESTAMP类型的解析逻辑:它会自动尝试把列值转换为.NET的DateTime类型,但空字符串""并不是有效的DateTime格式,而Null值会被解析为可空的DateTime?类型,所以不会触发异常。
既然你没办法修改第三方数据库的Schema,这里有几个实用的解决思路:
方案一:修改查询语句,将空字符串替换为Null
直接在查询时把空字符串转换成Null,让Fill方法能正常解析。示例SQL:SELECT CASE WHEN TIMESTAMP_COL = '' THEN NULL ELSE TIMESTAMP_COL END AS TIMESTAMP_COL, -- 其他需要查询的列... FROM YOUR_TARGET_TABLE这样返回的结果里就不会有空字符串,而是合法的Null值,完美适配SQLiteDataAdapter的自动解析逻辑。
方案二:改用SQLiteDataReader手动读取处理
如果不想修改查询语句,可以放弃直接用Fill填充DataTable,改用SQLiteDataReader逐行读取,手动控制TIMESTAMP列的解析:using (var connection = new SQLiteConnection("你的连接字符串")) { connection.Open(); var command = new SQLiteCommand("SELECT * FROM YOUR_TARGET_TABLE", connection); using (var reader = command.ExecuteReader()) { var dataTable = new DataTable(); dataTable.Load(reader); // 先加载表结构和原始数据 foreach (DataRow row in dataTable.Rows) { var timestampValue = row["TIMESTAMP_COL"].ToString(); if (string.IsNullOrWhiteSpace(timestampValue)) { row["TIMESTAMP_COL"] = DBNull.Value; } else { // 按需手动转换为DateTime,或者保留字符串形式 row["TIMESTAMP_COL"] = DateTime.Parse(timestampValue); } } } }这种方式灵活性拉满,能完全掌控每一列的处理逻辑,避免自动转换带来的异常。
方案三:配置SQLite日期格式为字符串映射
你还可以通过全局配置,让System.Data.SQLite把TIMESTAMP列当作字符串读取,之后再在业务代码里处理转换:// 在初始化连接前设置 SQLiteConnection.SetDateTimeFormat(SQLiteDateFormats.String);这样所有TIMESTAMP列都会以字符串形式加载,你可以后续判断是否为空,再转换为DateTime或设置为Null。
总的来说,方案一是最快捷的解决方式,直接在查询层搞定问题;如果需要更灵活的控制,方案二或三会更适合你的场景。
内容的提问来源于stack exchange,提问作者Mr. Squirrel.Downy
相关产品推荐
相关产品推荐

