为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。
【DM版本】:V8 458764
【操作系统】:麒麟V10服务器版Linux 4.19.90-24.4.v2101.ky10.x86_64
【CPU】:Intel(R) Core(TM)2 Duo CPU T7700 @2.40GHz
【问题描述】*:.Net采用DM.DMProvider.dll方式使用DmDataAdapter.Fill执行动态SQL语句时,XML格式数据存储时日期中间的字符"T"丢失,而SQLServer不会丢失。
XML示例:
<ValidateStyle>
<CheckMaxValue>true</CheckMaxValue>
<CheckMinValue>true</CheckMinValue>
<DateTimeMaxValue>0001-01-01T00:05:00+08:00</DateTimeMaxValue>
<DateTimeMinValue>0001-01-01T00:05:00+08:00</DateTimeMinValue>
</ValidateStyle>
保存后查询出的XML示例:
<ValidateStyle>
<CheckMaxValue>true</CheckMaxValue>
<CheckMinValue>true</CheckMinValue>
<DateTimeMaxValue>0001-01-01 00:05:00+08:00</DateTimeMaxValue>
<DateTimeMinValue>0001-01-01 00:05:00+08:00</DateTimeMinValue>
</ValidateStyle>
达梦的.NET Provider默认日期处理与SQL Server存在差异,可能需要显式指定格式
请参考以下内容,并期待您的反馈意见,谢谢!
解决方案:
检查数据序列化配置:
DmDataAdapter.Fill
方法正确配置了日期时间格式。DateTime.ToString("o")
以保留ISO标准格式中的“T”。更新或调整提供程序:
.NET
提供程序版本,可能已修复此问题。配置数据库输出格式:
NLS_DATE_FORMAT
/DATETIME_FMT_MODE
等。代码示例
通过重写数据读取逻辑,在填充DataSet后对日期字段进行格式化处理
using System; using System.Data; using Dm; class Program { static void Main() { string connStr = "Server=127.0.0.1;UserId=SYSDBA;PWD=123456789"; using (var conn = new DmConnection(connStr)) { var adapter = new DmDataAdapter("SELECT * FROM T_CITY_T", conn); DataSet ds = new DataSet(); // 填充数据集 adapter.Fill(ds); // 处理日期格式 foreach (DataTable table in ds.Tables) { foreach (DataRow row in table.Rows) { if (row["DateTimeField"] != DBNull.Value) { DateTime dt = (DateTime)row["DateTimeField"]; row["DateTimeField"] = dt.ToString("o"); // ISO8601格式保留'T' } } } // 序列化为XML string xml = ds.GetXml(); Console.WriteLine(xml); } } }