注册

.NET驱动中,DataReader和DataTable未能正确识别char(36)列为System.Guid类型

老树出芽 2023/03/22 1100 2

为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。
【DM版本】:DM8(–03134283938-20221019-172201-20018)
【操作系统】:windows 10 64位
【CPU】:i5-10500
【问题描述】*:
【DmProvider】数据库存储char(36)字段,使用.net驱动,执行sql,得到的DataReader和DataTable中,获取此列类型为String,应该参照mysql,识别成System.Guid。
版本:DmProvider.1.1.0.15887
上一次与Guid相关的提问:https://eco.dameng.com/community/question/54509f40bd8f27f171ba98b912517623

现象:
表、视图获取字段信息时,执行sql获取DataReader,通过DataReader获取列的类型,无法识别GUID列,且无法将列改为GUID类型。
DmProvider对达梦数据库的GUID类型的默认CLR映射错误
调用:
- DbDataReader.GetFieldType()
- DataColumn.DataType

参考代码
初始化sql

CREATE TABLE IF NOT EXISTS "p_GlobalParam" ( "PARAMCODE" VARCHAR(128), "PARAMVALUE" VARCHAR(128), "SYSCODE" VARCHAR(128), "CREATEDGUID" CHAR(36), "CREATEDNAME" VARCHAR(128), "CREATEDTIME" TIMESTAMP(0), "GLOBALPARAMGUID" CHAR(36) NOT NULL, "MODIFIEDGUID" CHAR(36), "MODIFIEDNAME" VARCHAR(128), "MODIFIEDTIME" TIMESTAMP(0), "VERSIONNUMBER" TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP() NOT NULL) STORAGE(ON "MAIN", CLUSTERBTR); INSERT INTO "p_globalparam" ("ParamCode", "ParamValue", "SysCode", "CreatedGUID", "CreatedName", "CreatedTime", "GlobalParamGUID", "ModifiedGUID", "ModifiedName", "ModifiedTime", "VersionNumber") VALUES('core', '', 'SSO', NULL, NULL, '2022-01-19 17:33:01', '08d9db2e-af6a-48d4-8c18-0b0fd4e4b4d3', NULL, NULL, NULL, '2022-01-20 01:33:00');

.net 代码

internal static void GetColumnTypeFromDataReader() { var sql = "SELECT \"CREATEDGUID\" FROM p_GlobalParam LIMIT 1;"; using (var connection = new DmConnection(s_connectionString)) { connection.Open(); DmCommand cmd = new DmCommand(); cmd.Connection = connection; cmd.CommandText = sql; var reader = cmd.ExecuteReader(); var fieldName = reader.GetName(0); var fieldType = reader.GetFieldType(0); if (!string.Equals(fieldType.Name, "Guid", StringComparison.OrdinalIgnoreCase)) throw new Exception("CHAR(36)不能转换成System.Guid类型"); } } internal static void GetColumnTypeFromDataTable() { var sql = "SELECT \"CREATEDGUID\" FROM p_GlobalParam LIMIT 1;"; using (var connection = new DmConnection(s_connectionString)) { connection.Open(); DmCommand cmd = new DmCommand(); cmd.Connection = connection; cmd.CommandText = sql; var dt = new DataTable(); var adapter = new DmDataAdapter(sql, s_connectionString); adapter.Fill(dt); var columns = dt.Columns; var col = columns[0]; var fieldName = col.ColumnName; var fieldType = col.DataType; if (!string.Equals(fieldType.Name, "Guid", StringComparison.OrdinalIgnoreCase)) throw new Exception("CHAR(36)不能转换成System.Guid类型"); } }

反编译,驱动代码,定位到的相关代码位置
image.png

image.png

回答 0
暂无回答
扫一扫
联系客服