为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。
【DM版本】:DM8(–03134283938-20221019-172201-20018)
【操作系统】:windows 10 64位
【CPU】:i5-10500
【问题描述】*:
版本:DmProvider.1.1.0.15887
现象:
在使用DmBulkCopy批量插入时,提示有语法分析错语。通过单步调试,分析DmProvider代码,发现是生成的sql的参数中,若存在关键字,会提示错误。
错误如下图所示:
通过分析发现,在linux安装的达梦数据库,使用DM管理工具执行insert时,发现有语法分析错误,但是在docker安装的数据库,却无此问题。
与达梦相关技术人员沟通后,给出两种解决方案:
第一种::Type 改成:"Type",即在关键字外围添加双引号。
第二种
修改关键字,在/etc下创建dm_svc.conf配置下关键字KEYWORDS=()
但是,只有发现一个,修改一个。
反编译定位到驱动中相关代码位置
示例代码:
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
您好,请问您现在的需求是什么?我看您写的两种解决方法都可以解决您的问题。