注册

.NET驱动,批量插入问题

老树出芽 2023/03/22 1703 7

为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。
【DM版本】:DM8(–03134283938-20221019-172201-20018)
【操作系统】:windows 10 64位
【CPU】:i5-10500
【问题描述】*:
版本:DmProvider.1.1.0.15887

现象
在使用DmBulkCopy批量插入时,提示有语法分析错语。通过单步调试,分析DmProvider代码,发现是生成的sql的参数中,若存在关键字,会提示错误。
错误如下图所示:
image.png

通过分析发现,在linux安装的达梦数据库,使用DM管理工具执行insert时,发现有语法分析错误,但是在docker安装的数据库,却无此问题。

与达梦相关技术人员沟通后,给出两种解决方案:

  • 第一种::Type 改成:"Type",即在关键字外围添加双引号。

  • 第二种
    修改关键字,在/etc下创建dm_svc.conf配置下关键字KEYWORDS=()
    但是,只有发现一个,修改一个。

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

示例代码:

CREATE TABLE "ERP_NEW"."MYEXTENSIONPOINTIMPL" ( "METHOD" VARCHAR(128) DEFAULT '' NOT NULL, "TYPE" VARCHAR(512) DEFAULT '' NOT NULL, "EXTENSIONPOINTIMPLGUID" CHAR(36) NOT NULL, NOT CLUSTER PRIMARY KEY("EXTENSIONPOINTIMPLGUID")) STORAGE(ON "MAIN", CLUSTERBTR ) ;
// 表定义 [Serializable] internal class ExtensionPointImplEntity { /// <summary> /// 主键 /// </summary> public Guid ExtensionPointImplGUID { get; set; } /// <summary> /// 实现方法的FullName /// </summary> public string Type { get; set; } /// <summary> /// 方法名称 /// </summary> public string Method { get; set; } } // 批量插入 [Test] public void BulkInsertTest() { using (var scope = new ConnectionScope(TransactionMode.Required)) { var entities = Enumerable.Range(1, 10).Select(x => new ExtensionPointImplEntity() { ExtensionPointImplGUID = Guid.NewGuid(), Type = "Type", Method = "Method", }); Assert.DoesNotThrow(() => BulkInsert("MyExtensionPointImpl", entities?.ToList(), scope)); } } /// <summary> /// 批量添加 /// </summary> private void BulkInsert<T>(string tableName, IEnumerable<T> dtos, ConnectionScope scope) { var dt = UnitTest.Extensions.DataTableHelper.ConvertToDataTable(dtos); using (var bulk = scope.CreateSqlBulkCopy()) { bulk.SetDestinationTableName(tableName); foreach (DataColumn column in dt.Columns) { bulk.AddColumnMapping(column.ColumnName, column.ColumnName); } bulk.WriteToServer(dt); } }

现已发现的,不支持的关键字:
/// 语法分析出错参数清单:NOPARALLEL,CLOSE,CONSTRUCTOR,LEXER,DAY,EXCEPT,HOUR,INSTANTIABLE,OVERRIDING,LOCK,MAP,MINUTE,MONTH,NOCYCLE,NOSORT,OFFSET,ONLINE,OPEN,OPTIMIZE,RESIZE,SECOND,TYPE,YEAR,LIMIT,LESS,THAN,STAT,VERSIONS,PRAGMA,SUBTYPE,BULK,FORALL,LARGE,WITHOUT,PIPE,MOD,SAMPLE,XML,PIVOT,UNPIVOT,SEED,JSON_TABLE

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