为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。
【DM版本】:达梦8
【操作系统】:docker
【CPU】:
【问题描述】*:
程序使用的是abpVNext、EF6、dotnet6
数据库使用的是达梦8
均部署在docker容器下
使用EF的方法新增记录时出现的报错
数据库是从SqlServer迁移过来的,查询除了慢一些没有大的问题,但写入出现了这些报错。
表结构如下:
CREATE TABLE "SYSDBA"."tb_AlarmFlowItem"
(
"Id" CHAR(36) NOT NULL,
"FlowId" CHAR(36) NOT NULL,
"FlowType" INT NOT NULL,
"DictNumber" NVARCHAR2(128 CHAR) NOT NULL,
"Value" NVARCHAR2(8188 CHAR),
"ConcurrencyStamp" NVARCHAR2(40 CHAR),
"ExtraProperties" NVARCHAR2(8188 CHAR),
"CreationTime" TIMESTAMP(6) NOT NULL,
"CreatorId" CHAR(36),
"DeletionTime" TIMESTAMP(6),
"DeleterId" CHAR(36),
"IsDeleted" BIT DEFAULT 0 NOT NULL,
"LastModificationTime" TIMESTAMP(6),
"LastModifierId" CHAR(36),
CONSTRAINT "PK_tb_AlarmFlowItem" NOT CLUSTER PRIMARY KEY("Id")) STORAGE(ON "MAIN", CLUSTERBTR) ;
CREATE OR REPLACE INDEX "NonClusteredIndex-AlarmFlowItem" ON "SYSDBA"."tb_AlarmFlowItem"("IsDeleted" ASC,"DictNumber" ASC,"FlowId" ASC,"FlowType" ASC) STORAGE(ON "MAIN", CLUSTERBTR) ;
1.使用InsertManyAsync()方法时,无法写入数据
使用的代码:
await Repository.InsertManyAsync(items, true);
日志输出如下:
2024-07-26 11:38:43.690 +08:00 [DBG] fail: 2024/7/26 11:38:43.690 RelationalEventId.CommandError[20102] (Microsoft.EntityFrameworkCore.Database.Command)
Failed executing DbCommand (153ms) [Parameters=[:p0='?' (DbType = Guid), :p1='?' (Size = 32), :p2='?' (DbType = DateTime2), :p3='?' (DbType = Guid), :p4='?' (DbType = Guid), :p5='?' (DbType = DateTime2), :p6='?' (Size = 9), :p7='?' (Size = 2), :p8='?' (DbType = Guid), :p9='?' (DbType = Int32), :p10='?' (DbType = DateTime2), :p11='?' (DbType = Guid), :p12='?', :p13='?' (DbType = Guid), :p14='?' (Size = 32), :p15='?' (DbType = DateTime2), :p16='?' (DbType = Guid), :p17='?' (DbType = Guid), :p18='?' (DbType = DateTime2), :p19='?' (Size = 9), :p20='?' (Size = 2), :p21='?' (DbType = Guid), :p22='?' (DbType = Int32), :p23='?' (DbType = DateTime2), :p24='?' (DbType = Guid), :p25='?', :p26='?' (DbType = Guid), :p27='?' (Size = 32), :p28='?' (DbType = DateTime2), :p29='?' (DbType = Guid), :p30='?' (DbType = Guid), :p31='?' (DbType = DateTime2), :p32='?' (Size = 9), :p33='?' (Size = 2), :p34='?' (DbType = Guid), :p35='?' (DbType = Int32), :p36='?' (DbType = DateTime2), :p37='?' (DbType = Guid), :p38='?' (Size = 1), :p39='?' (DbType = Guid), :p40='?' (Size = 32), :p41='?' (DbType = DateTime2), :p42='?' (DbType = Guid), :p43='?' (DbType = Guid), :p44='?' (DbType = DateTime2), :p45='?' (Size = 9), :p46='?' (Size = 2), :p47='?' (DbType = Guid), :p48='?' (DbType = Int32), :p49='?' (DbType = DateTime2), :p50='?' (DbType = Guid), :p51='?' (Size = 16), :p52='?' (DbType = Guid), :p53='?' (Size = 32), :p54='?' (DbType = DateTime2), :p55='?' (DbType = Guid), :p56='?' (DbType = Guid), :p57='?' (DbType = DateTime2), :p58='?' (Size = 9), :p59='?' (Size = 2), :p60='?' (DbType = Guid), :p61='?' (DbType = Int32), :p62='?' (DbType = DateTime2), :p63='?' (DbType = Guid), :p64='?' (Size = 10), :p65='?' (DbType = Guid), :p66='?' (Size = 32), :p67='?' (DbType = DateTime2), :p68='?' (DbType = Guid), :p69='?' (DbType = Guid), :p70='?' (DbType = DateTime2), :p71='?' (Size = 9), :p72='?' (Size = 2), :p73='?' (DbType = Guid), :p74='?' (DbType = Int32), :p75='?' (DbType = DateTime2), :p76='?' (DbType = Guid), :p77='?' (Size = 10), :p78='?' (DbType = Guid), :p79='?' (Size = 32), :p80='?' (DbType = DateTime2), :p81='?' (DbType = Guid), :p82='?' (DbType = Guid), :p83='?' (DbType = DateTime2), :p84='?' (Size = 9), :p85='?' (Size = 2), :p86='?' (DbType = Guid), :p87='?' (DbType = Int32), :p88='?' (DbType = DateTime2), :p89='?' (DbType = Guid), :p90='?' (Size = 6)], CommandType='Text', CommandTimeout='30']
BEGIN
DECLARE TYPE rrr0 IS RECORD ("IsDeleted" BIT);
TYPE ccc0 IS ARRAY rrr0[];
c0 ccc0;
BEGIN
c0 = NEW rrr0[7];
INSERT INTO "HNSC.CL.II"."tb_AlarmFlowItem" ("Id", "ConcurrencyStamp", "CreationTime", "CreatorId", "DeleterId", "DeletionTime", "DictNumber", "ExtraProperties", "FlowId", "FlowType", "LastModificationTime", "LastModifierId", "Value")
VALUES (:p0, :p1, :p2, :p3, :p4, :p5, :p6, :p7, :p8, :p9, :p10, :p11, :p12),
(:p13, :p14, :p15, :p16, :p17, :p18, :p19, :p20, :p21, :p22, :p23, :p24, :p25),
(:p26, :p27, :p28, :p29, :p30, :p31, :p32, :p33, :p34, :p35, :p36, :p37, :p38),
(:p39, :p40, :p41, :p42, :p43, :p44, :p45, :p46, :p47, :p48, :p49, :p50, :p51),
(:p52, :p53, :p54, :p55, :p56, :p57, :p58, :p59, :p60, :p61, :p62, :p63, :p64),
(:p65, :p66, :p67, :p68, :p69, :p70, :p71, :p72, :p73, :p74, :p75, :p76, :p77),
(:p78, :p79, :p80, :p81, :p82, :p83, :p84, :p85, :p86, :p87, :p88, :p89, :p90) RETURN "IsDeleted" INTO c0;
SELECT * FROM ARRAY c0;
END;
END;
2024-07-26 11:38:44.014 +08:00 [ERR] An error occurred using a transaction.
2024-07-26 11:38:44.015 +08:00 [DBG] fail: 2024/7/26 11:38:44.015 RelationalEventId.TransactionError[20205] (Microsoft.EntityFrameworkCore.Database.Transaction)
An error occurred using a transaction.
2024-07-26 11:38:44.375 +08:00 [ERR] An exception occurred in the database while saving changes for context type 'HNSC.CL.II.WebApi.EntityFrameworkCoreForDM.WebApiDbContext'.
Microsoft.EntityFrameworkCore.DbUpdateException: An error occurred while saving the entity changes. See the inner exception for details.
---> Dm.DmException (0x80004005): 第 3 行, 第 44 列[]]附近出现错误:
标示符长度非法
at Dm.DmCommand.do_ExecuteDbDataReader(CommandBehavior behavior)
at System.Data.Common.DbCommand.ExecuteDbDataReaderAsync(CommandBehavior behavior, CancellationToken cancellationToken)
--- End of stack trace from previous location ---
at Microsoft.EntityFrameworkCore.Storage.RelationalCommand.ExecuteReaderAsync(RelationalCommandParameterObject parameterObject, CancellationToken cancellationToken)
at Microsoft.EntityFrameworkCore.Storage.RelationalCommand.ExecuteReaderAsync(RelationalCommandParameterObject parameterObject, CancellationToken cancellationToken)
at Microsoft.EntityFrameworkCore.Update.ReaderModificationCommandBatch.ExecuteAsync(IRelationalConnection connection, CancellationToken cancellationToken)
--- End of inner exception stack trace ---
at Microsoft.EntityFrameworkCore.Update.ReaderModificationCommandBatch.ExecuteAsync(IRelationalConnection connection, CancellationToken cancellationToken)
at Microsoft.EntityFrameworkCore.Update.Internal.BatchExecutor.ExecuteAsync(IEnumerable`1 commandBatches, IRelationalConnection connection, CancellationToken cancellationToken)
at Microsoft.EntityFrameworkCore.Update.Internal.BatchExecutor.ExecuteAsync(IEnumerable`1 commandBatches, IRelationalConnection connection, CancellationToken cancellationToken)
at Microsoft.EntityFrameworkCore.Update.Internal.BatchExecutor.ExecuteAsync(IEnumerable`1 commandBatches, IRelationalConnection connection, CancellationToken cancellationToken)
at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.StateManager.SaveChangesAsync(IList`1 entriesToSave, CancellationToken cancellationToken)
at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.StateManager.SaveChangesAsync(StateManager stateManager, Boolean acceptAllChangesOnSuccess, CancellationToken cancellationToken)
at Microsoft.EntityFrameworkCore.Dm.Storage.Internal.DmExecutionStrategy.ExecuteAsync[TState,TResult](TState state, Func`4 operation, Func`4 verifySucceeded, CancellationToken cancellationToken)
at Microsoft.EntityFrameworkCore.DbContext.SaveChangesAsync(Boolean acceptAllChangesOnSuccess, CancellationToken cancellationToken)
Microsoft.EntityFrameworkCore.DbUpdateException: An error occurred while saving the entity changes. See the inner exception for details.
2.使用 循环+InsertAsync()时,可以写入数据,但日志中会出现事务异常的错误提示。
使用的新增方法
await Repository.InsertAsync(item, true);
错误日志:
2024-07-26 11:38:43.227 +08:00 [DBG] info: 2024/7/26 11:38:43.227 RelationalEventId.CommandExecuted[20101] (Microsoft.EntityFrameworkCore.Database.Command)
Executed DbCommand (14ms) [Parameters=[:p0='?' (DbType = Guid), :p1='?' (Size = 32), :p2='?' (DbType = DateTime2), :p3='?' (DbType = Guid), :p4='?' (DbType = Guid), :p5='?' (DbType = DateTime2), :p6='?' (Size = 2), :p7='?' (DbType = Int32), :p8='?' (DbType = Int32), :p9='?' (DbType = DateTime2), :p10='?' (Size = 2), :p11='?' (DbType = DateTime2), :p12='?' (DbType = Guid), :p13='?' (DbType = Guid)], CommandType='Text', CommandTimeout='30']
INSERT INTO "SYSDBA"."tb_AlarmFlow" ("Id", "ConcurrencyStamp", "CreationTime", "CreatorId", "DeleterId", "DeletionTime", "ExtraProperties", "FlowOperation", "FlowType", "HandleDate", "Handler", "LastModificationTime", "LastModifierId", "ManagedId")
VALUES (:p0, :p1, :p2, :p3, :p4, :p5, :p6, :p7, :p8, :p9, :p10, :p11, :p12, :p13);
SELECT "IsDeleted"
FROM "HNSC.CL.II"."tb_AlarmFlow"
WHERE sql%ROWCOUNT = 1 AND "Id" = :p0;
2024-07-26 11:38:43.373 +08:00 [ERR] An error occurred using a transaction.
2024-07-26 11:38:43.375 +08:00 [DBG] fail: 2024/7/26 11:38:43.375 RelationalEventId.TransactionError[20205] (Microsoft.EntityFrameworkCore.Database.Transaction)
An error occurred using a transaction.
希望得到的解决方案是可以使用InsertManyAsync,因为大部分是用的这个方法。
建议采用普通方式部署数据库哦,
此外查一下数据库的版本,驱动是否采用驱动路径dmdbms/driver/下对应版本的驱动。
最后检查COMPATIBLE_MODE和MS_PARSE_PERMIT参数,把MS_PARSE_PERMIT默认为0试试
参考问题:
https://eco.dameng.com/community/question/c8a8e30517a9782724f6b35bf880a39e