Sqlite查询返回NULL填充DataTable列类型不匹配,如何指定返回列类型?
问题原因
你遇到的类型转换异常根本原因是:Sqlite中未绑定实际值的NULL默认是无类型的,即使你用CAST(NULL AS TEXT)做转换,当查询结果中该列全为NULL时,Sqlite的ADO.NET驱动无法推断出该列的类型,会默认映射为Byte[](BLOB类型),和你预先定义的DataTable中string类型的A、B列类型不匹配,因此抛出异常:
System.InvalidOperationException: 'Inconvertible type mismatch between SourceColumn 'A' of Byte[] and the DataColumn 'A' of String.'
解决方案
直接修改查询语句即可,不需要额外循环处理,也能完整保留NULL值:
// 把原SELECT语句替换为用NULLIF生成带TEXT类型标识的NULL string selectCommand = "SELECT NULLIF('', '') AS A, NULLIF('', '') AS B, C, D FROM Table";
原理说明
NULLIF('', '')的两个输入参数都是明确的TEXT类型空字符串,该表达式的返回类型会被Sqlite标记为TEXT,即使最终返回值是NULL,ADO.NET驱动也能正确识别为字符串类型,和你DataTable中预先定义的列类型完全匹配,Load的时候不会抛出类型转换异常,同时A、B列的值依然是符合要求的NULL,不会变成空字符串。
内容的提问来源于stack exchange,提问作者Vite
相关产品推荐
相关产品推荐

