人大金仓,用ExpandoObject更新时,无法识别值为Null的DataTime?数据类型 返回
人大金仓:
KingbaseES V009R001C001B0030 on x64, compiled by Visual C++ build 1800, 64-bit
C# DB操作:
public static int BulkEdit(List<ExpandoObject> datas, string tableName)
{
try
{
var dtList = new List<Dictionary<string, object>>();
for (int i = 0; i < datas.Count; i++)
{
dtList.Add(new Dictionary<string, object>(datas[i]));
}
// 默认为null时报错,不识别“USER-DEFINED”。如果DateTime?有值,则正常能被转换为datetime
dtList[0]["MonitoringDate"] = (object)DateTime.Now;
return SqlSugarHelper.Db.Updateable(dtList).AS(tableName).IgnoreColumns("ROWINDEX").WhereColumns("id").ExecuteCommand();//.IgnoreColumns("ROWINDEX")
}
catch (Exception e)
{
Console.WriteLine(e);
return 0;
}
}C# 构建DB对象(已设置mysql兼容模式):
public static SqlSugarScope Db = new SqlSugarScope(new ConnectionConfig()
{
ConnectionString = ConnectionStrings,//连接符字串
DbType = DbType.Kdbndp,//数据库类型
IsAutoCloseConnection = true,
InitKeyType = InitKeyType.Attribute,
MoreSettings = new ConnMoreSettings()
{
IsAutoToUpper = false,
DatabaseModel = DbType.MySql
}
},
db =>
{
//(A)全局生效配置点
//调试SQL事件,可以删掉
db.Aop.OnLogExecuting = (sql, pars) =>
{
//Console.WriteLine(sql);//输出sql,查看执行sql
//5.0.8.2 获取无参数化 SQL
var x = UtilMethods.GetSqlString(DbType.Kdbndp, sql, pars);
Console.WriteLine(x);
};
});描述:
使用 ExpandoObject 类型 动态存储数据库记录,然后执行Update操作。发现 当 C# 实体 的DataTime?类型的字段,它的值为null的时候,就会更新失败,报错显示在 “USER”附近。
于是查看执行的SQL语句:
UPDATE "表名称" SET "air_temperature" = T."air_temperature", "air_temperature_Qc2" = T."air_temperature_Qc2", "atmospheric_pressure" = T."atmospheric_pressure", "atmospheric_pressure_Qc2" = T."atmospheric_pressure_Qc2", "avg_wind_dir" = T."avg_wind_dir", "avg_wind_dir_Qc2" = T."avg_wind_dir_Qc2", "avg_wind_speed" = T."avg_wind_speed", "avg_wind_speed_Qc2" = T."avg_wind_speed_Qc2", "bg" = T."bg", "bg_Qc2" = T."bg_Qc2", "bx" = T."bx", "bx_Qc2" = T."bx_Qc2", "chla" = T."chla", "chla_Qc2" = T."chla_Qc2", "cond" = T."cond", "cond_Qc2" = T."cond_Qc2", "CreateTime" = T."CreateTime", "depth" = T."depth", "extreme_wind_dir" = T."extreme_wind_dir", "extreme_wind_dir_Qc2" = T."extreme_wind_dir_Qc2", "extreme_wind_speed" = T."extreme_wind_speed", "extreme_wind_speed_Qc2" = T."extreme_wind_speed_Qc2", "extreme_wind_time" = T."extreme_wind_time", "extreme_wind_time_Qc2" = T."extreme_wind_time_Qc2", "File" = T."File", "gust_wind_dir" = T."gust_wind_dir", "gust_wind_dir_Qc2" = T."gust_wind_dir_Qc2", "gust_wind_speed" = T."gust_wind_speed", "gust_wind_speed_Qc2" = T."gust_wind_speed_Qc2", "humidity" = T."humidity", "humidity_Qc2" = T."humidity_Qc2", "LineNo" = T."LineNo", "max_wind_dir" = T."max_wind_dir", "max_wind_dir_Qc2" = T."max_wind_dir_Qc2", "max_wind_speed" = T."max_wind_speed", "max_wind_speed_Qc2" = T."max_wind_speed_Qc2", "max_wind_time" = T."max_wind_time", "max_wind_time_Qc2" = T."max_wind_time_Qc2", "MonitoringDate" = T."MonitoringDate", "MonitoringDate_Qc2" = T."MonitoringDate_Qc2", "MonitoringDateStr" = T."MonitoringDateStr", "MonitoringDateStr_Qc2" = T."MonitoringDateStr_Qc2", "mydo" = T."mydo", "mydo_Qc2" = T."mydo_Qc2", "NH3N" = T."NH3N", "NH3N_Qc2" = T."NH3N_Qc2", "NO2N" = T."NO2N", "NO2N_Qc2" = T."NO2N_Qc2", "NO3N" = T."NO3N", "NO3N_Qc2" = T."NO3N_Qc2", "ph" = T."ph", "ph_Qc2" = T."ph_Qc2", "PO4P" = T."PO4P", "PO4P_Qc2" = T."PO4P_Qc2", "precipitation_08_20" = T."precipitation_08_20", "precipitation_08_20_Qc2" = T."precipitation_08_20_Qc2", "precipitation_20_08" = T."precipitation_20_08", "precipitation_20_08_Qc2" = T."precipitation_20_08_Qc2", "qcflag" = T."qcflag", "salinity" = T."salinity", "salinity_Qc2" = T."salinity_Qc2", "state" = T."state", "Station_Num" = T."Station_Num", "TenthBG" = T."TenthBG", "TenthBG_Qc2" = T."TenthBG_Qc2", "TenthZQ" = T."TenthZQ", "TenthZQ_Qc2" = T."TenthZQ_Qc2", "tidal_level" = T."tidal_level", "tidal_level_Qc2" = T."tidal_level_Qc2", "turb" = T."turb", "turb_Qc2" = T."turb_Qc2", "vb" = T."vb", "vb_Qc2" = T."vb_Qc2", "water_temperature" = T."water_temperature", "water_temperature_Qc2" = T."water_temperature_Qc2", "YBG" = T."YBG", "YBG_Qc2" = T."YBG_Qc2", "YZQ" = T."YZQ", "YZQ_Qc2" = T."YZQ_Qc2", "ZBG" = T."ZBG", "ZBG_Qc2" = T."ZBG_Qc2", "zq" = T."zq", "zq_Qc2" = T."zq_Qc2", "ZZQ" = T."ZZQ", "ZZQ_Qc2" = T."ZZQ_Qc2" FROM ( VALUES ( CAST ( NULL AS VARCHAR ), CAST ( '0' AS INTEGER ), CAST ( NULL AS VARCHAR ), CAST ( '0' AS INTEGER ), CAST ( NULL AS VARCHAR ), CAST ( '0' AS INTEGER ), CAST ( NULL AS VARCHAR ), CAST ( '0' AS INTEGER ), CAST ( NULL AS VARCHAR ), CAST ( '0' AS INTEGER ), CAST ( NULL AS VARCHAR ), CAST ( '0' AS INTEGER ), CAST ( NULL AS VARCHAR ), CAST ( '0' AS INTEGER ), CAST ( NULL AS VARCHAR ), CAST ( '0' AS INTEGER ), CAST ( '2026-04-10 11:33:16.000' AS datetime ), CAST ( NULL AS VARCHAR ), CAST ( NULL AS VARCHAR ), CAST ( '0' AS INTEGER ), CAST ( NULL AS VARCHAR ), CAST ( '0' AS INTEGER ), CAST ( NULL AS VARCHAR ), CAST ( '0' AS INTEGER ), CAST ( '2042445785131405312' AS BIGINT ), CAST ( NULL AS VARCHAR ), CAST ( '0' AS INTEGER ), CAST ( NULL AS VARCHAR ), CAST ( '0' AS INTEGER ), CAST ( NULL AS VARCHAR ), CAST ( '0' AS INTEGER ), CAST ( '2042445785521475584' AS BIGINT ), CAST ( '1' AS INTEGER ), CAST ( NULL AS VARCHAR ), CAST ( '0' AS INTEGER ), CAST ( NULL AS VARCHAR ), CAST ( '0' AS INTEGER ), CAST ( NULL AS VARCHAR ), CAST ( '0' AS INTEGER ), CAST ( NULL AS USER-DEFINED ), CAST ( '0' AS INTEGER ), CAST ( NULL AS VARCHAR ), CAST ( '0' AS INTEGER ), CAST ( NULL AS VARCHAR ), CAST ( '0' AS INTEGER ), CAST ( NULL AS VARCHAR ), CAST ( '0' AS INTEGER ), CAST ( NULL AS VARCHAR ), CAST ( '0' AS INTEGER ), CAST ( NULL AS VARCHAR ), CAST ( '0' AS INTEGER ), CAST ( NULL AS VARCHAR ), CAST ( '0' AS INTEGER ), CAST ( NULL AS VARCHAR ), CAST ( '0' AS INTEGER ), CAST ( NULL AS VARCHAR ), CAST ( '0' AS INTEGER ), CAST ( NULL AS VARCHAR ), CAST ( '0' AS INTEGER ), CAST ( '0' AS INTEGER ), CAST ( NULL AS VARCHAR ), CAST ( '0' AS INTEGER ), CAST ( '1' AS INTEGER ), CAST ( '9892' AS VARCHAR ), CAST ( NULL AS VARCHAR ), CAST ( '0' AS INTEGER ), CAST ( NULL AS VARCHAR ), CAST ( '0' AS INTEGER ), CAST ( NULL AS VARCHAR ), CAST ( '0' AS INTEGER ), CAST ( NULL AS VARCHAR ), CAST ( '0' AS INTEGER ), CAST ( NULL AS VARCHAR ), CAST ( '0' AS INTEGER ), CAST ( NULL AS VARCHAR ), CAST ( '0' AS INTEGER ), CAST ( NULL AS VARCHAR ), CAST ( '0' AS INTEGER ), CAST ( NULL AS VARCHAR ), CAST ( '0' AS INTEGER ), CAST ( NULL AS VARCHAR ), CAST ( '0' AS INTEGER ), CAST ( NULL AS VARCHAR ), CAST ( '0' AS INTEGER ), CAST ( NULL AS VARCHAR ), CAST ( '0' AS INTEGER ) ) ) AS T ( "air_temperature", "air_temperature_Qc2", "atmospheric_pressure", "atmospheric_pressure_Qc2", "avg_wind_dir", "avg_wind_dir_Qc2", "avg_wind_speed", "avg_wind_speed_Qc2", "bg", "bg_Qc2", "bx", "bx_Qc2", "chla", "chla_Qc2", "cond", "cond_Qc2", "CreateTime", "depth", "extreme_wind_dir", "extreme_wind_dir_Qc2", "extreme_wind_speed", "extreme_wind_speed_Qc2", "extreme_wind_time", "extreme_wind_time_Qc2", "File", "gust_wind_dir", "gust_wind_dir_Qc2", "gust_wind_speed", "gust_wind_speed_Qc2", "humidity", "humidity_Qc2", "id", "LineNo", "max_wind_dir", "max_wind_dir_Qc2", "max_wind_speed", "max_wind_speed_Qc2", "max_wind_time", "max_wind_time_Qc2", "MonitoringDate", "MonitoringDate_Qc2", "MonitoringDateStr", "MonitoringDateStr_Qc2", "mydo", "mydo_Qc2", "NH3N", "NH3N_Qc2", "NO2N", "NO2N_Qc2", "NO3N", "NO3N_Qc2", "ph", "ph_Qc2", "PO4P", "PO4P_Qc2", "precipitation_08_20", "precipitation_08_20_Qc2", "precipitation_20_08", "precipitation_20_08_Qc2", "qcflag", "salinity", "salinity_Qc2", "state", "Station_Num", "TenthBG", "TenthBG_Qc2", "TenthZQ", "TenthZQ_Qc2", "tidal_level", "tidal_level_Qc2", "turb", "turb_Qc2", "vb", "vb_Qc2", "water_temperature", "water_temperature_Qc2", "YBG", "YBG_Qc2", "YZQ", "YZQ_Qc2", "ZBG", "ZBG_Qc2", "zq", "zq_Qc2", "ZZQ", "ZZQ_Qc2" ) WHERE "表名称"."id" = T."id"
发现,C#数据类型为DataTime?的`MonitoringDate字段`的值 为`null`,同时类型被CAST为`USER-DEFINED` 类型!!!
然而,同样为DataTime?类型的 `CreateTime 字段`,由于它的值不为`null`,就成功拿到了相应的db类型进行CAST,即“CAST('2026-04-10 11:33:16.000' AS datetime)”。
之后,查询此表的`CreateTime 字段`和`MonitoringDate字段`的具体数据类型:
Navicat GUI 显示:

CreatTime同样是timestamp类型,长度为0.
使用SQL语句 1 进行查询:

使用SQL语句 2 进行查询:

显然,二者内容不一样!!!!
怀疑sqlsugar在调取数据类型时,有些问题!!
MySQL兼容模式, show all:
database_mode mysql Set database mode
mysql5_str_rtrim off Convert empty string to null.
mysql_convert_compatible off compatible with mysql convert usage.
mysql_interval_style off compatible some mysql interval unit styleon:mysql style,off:default style
mysql_numop_style on compatible mysql style about operators of integers and strings as operators of integers and integers
mysql_serial_type on compatible mysql serial type
mysql_substring_compatible off compatible with mysql substring and substr usage.
sql_mode ONLY_FULL_GROUP_BY,ANSI_QUOTES mysql compatible parameters. the MYSQL server can operate in different SQL modes,and can apply these modes differently for different clients.now, sql_mode of KingbaseES server only support ONLY_FULL_GROUP_BY
sqlsugar版本:
已更新至最新版:

劳烦诸位,尽快查明原因,进行相关措施修复!
热忱回答(6)
-
fate sta VIP0
2026/4/10这个应该驱动问题,我这边在问他们官方了
0 回复 -
fate sta VIP0
2026/4/10Mizhu198810 这个他们官方微信号
0 回复 -
癞蛤蟆儿缒😘 VIP0
2026/4/13@fate sta:感谢🙏 麻烦有结果能尽快公布下
0 回复 -
清风 VIP0
2026/4/13这个地方要用第二个SQL查询类型,第一个类型查询有出入
0 回复 -
清风 VIP0
2026/4/13您这里是调用的GetDbTypes方法吗
0 回复 -
癞蛤蟆儿缒😘 VIP0
2026/4/21@清风:只是一次Update操作,没有调用GetDbTypes方法
0 回复