为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。
【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类型");
}
}
反编译,驱动代码,定位到的相关代码位置
你好,您这边是明源公司的吧?
我司这边已经跟贵公司在进行适配对接了,这些问题已经反馈给研发了。预计最迟下周会提供解决这个问题的驱动版本。
没有人回复吗?