人大金仓,用ExpandoObject更新时,无法识别值为Null的DataTime?数据类型 返回

SqlSugar 沟通中
6 506

人大金仓:

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 显示:

image.png

CreatTime同样是timestamp类型,长度为0.

  • 使用SQL语句 1 进行查询:


    image.png


  • 使用SQL语句 2 进行查询:

image.png


显然,二者内容不一样!!!!

怀疑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版本:

已更新至最新版:

image.png


劳烦诸位,尽快查明原因,进行相关措施修复!

热忱回答6

  • fate sta fate sta VIP0
    2026/4/10

    这个应该驱动问题,我这边在问他们官方了

    0 回复
  • fate sta fate sta VIP0
    2026/4/10

    Mizhu198810 这个他们官方微信号

    0 回复
  • @fate sta:感谢🙏 麻烦有结果能尽快公布下

    0 回复
  • 清风 清风 VIP0
    2026/4/13

    这个地方要用第二个SQL查询类型,第一个类型查询有出入

    0 回复
  • 清风 清风 VIP0
    2026/4/13

    您这里是调用的GetDbTypes方法吗


    0 回复
  • @清风:只是一次Update操作,没有调用GetDbTypes方法

    0 回复