如何使用Devart dotConnect Express MySQL获取MySQL时间小数部分
解决Devart dotConnect MySQL读取DateTime丢失小数部分的问题
问题重现
现有MySQL表结构:
CREATE TABLE `table1` ( `id` int unsigned NOT NULL AUTO_INCREMENT, `date` date, `timestamp2` timestamp(2), `datetime3` datetime(3), `time6` time(6), PRIMARY KEY (`id`) );
插入测试数据:
insert into table1(`date`,`timestamp2`,datetime3,time6) values('2000-01-01','2001-01-01 01:01:01.23', '2002-01-01 01:01:01.243','01:01.234893'); insert into table1(`date`,`timestamp2`,datetime3,time6) values(null,null,null,null);
使用Devart dotConnect的C#代码读取后,输出的timestamp2和datetime3的DateTime值丢失了小数部分,仅显示到秒。
解决方案
1. 修改连接字符串,启用小数秒支持
Devart dotConnect默认未开启DateTime类型的小数精度读取,需要在连接字符串中添加UseFractionalSeconds=true参数,确保驱动读取并保留时间的小数部分。
示例连接字符串:
string ConnString = "server=localhost;database=testdb;user id=root;password=xxx;UseFractionalSeconds=true;";
2. 自定义格式化输出DateTime值
默认的DateTime.ToString()不会显示毫秒/微秒部分,需要使用自定义格式字符串来输出完整的时间(包括小数部分)。修改代码中的输出逻辑:
foreach (DataColumn dc in dt.Columns) { object ob = dr[dc.ColumnName]; string typeName = ob.GetType().ToString(); string valueStr = ""; if (ob is DateTime dateVal) { // 自定义格式,显示到微秒(可根据实际存储精度调整) valueStr = dateVal.ToString("yyyy-MM-dd HH:mm:ss.ffffff"); } else if (ob is DBNull) { valueStr = "(null)"; } else { valueStr = ob.ToString(); } sb.AppendLine($"{dc.ColumnName} = {typeName} | value = {valueStr}"); }
3. 代码中使用小数部分数值
如果需要在业务逻辑中使用时间的小数部分,可以通过DateTime.Millisecond获取毫秒值,或者通过DateTime.Ticks计算更精确的单位(1 Tick = 100纳秒):
if (ob is DateTime dateVal) { // 获取毫秒部分 int milliseconds = dateVal.Millisecond; // 获取微秒部分(通过Ticks计算) int microseconds = (int)(dateVal.Ticks % 10000000 / 10); }
修改后的输出示例
调整后,输出会显示完整的时间小数部分:
Row 1 id = System.Int64 | value = 1 date = System.DateTime | value = 2000-01-01 00:00:00.000000 timestamp2 = System.DateTime | value = 2001-01-01 01:01:01.230000 datetime3 = System.DateTime | value = 2002-01-01 01:01:01.243000 time6 = System.TimeSpan | value = 01:01:00.2348930 Row 2 id = System.Int64 | value = 2 date = System.DBNull | value = (null) timestamp2 = System.DBNull | value = (null) datetime3 = System.DBNull | value = (null) time6 = System.DBNull | value = (null)
内容的提问来源于stack exchange,提问作者mjb
相关产品推荐
相关产品推荐

