.NET 8调用AS400 CL程序失败,请求排查原因
.NET 8 EF迁移后调用AS400 CL程序失败排查
原.NET 4.7.2代码
var item = new Form { TokenId = System.Guid.NewGuid().ToString(), BillForm = "B", CompanyNumber = 5, PolicyNumber = "11111111111" }; _formRepository.Add(item); _formRepository.Execute("Call ProgramLibrary.CLProgram");
迁移后的.NET 8代码
var item = new Form { TokenId = System.Guid.NewGuid().ToString(), BillForm = "B", CompanyNumber = 5, PolicyNumber = "11111111111" }; context._formRepository.Add(item); var result = context.Database.ExecuteSqlRaw("Call ProgramLibrary.CLProgram");
连接字符串
"AS400Entities": "server=servername;uid=userid;pwd=pasword;database=databasename;Isolation Level=Chaos;"
问题现状
目前能正常访问AS400数据表并更新数据,但调用CLProgram时,ExecuteSqlRaw返回-1,程序未实际执行。
可能的遗漏点
- 事务提交不及时
原代码的_formRepository.Execute可能自动处理了事务提交,而.NET 8中Add操作仅在内存标记实体状态,未将数据持久化到数据库。如果CL程序依赖已落地的Form数据,会因数据未提交而执行失败。需在调用CL程序前手动提交更改:
context._formRepository.Add(item); context.SaveChanges(); // 异步场景用SaveChangesAsync() var result = context.Database.ExecuteSqlRaw("Call ProgramLibrary.CLProgram");
- 调用语法兼容性问题
不同EF版本的AS400驱动对CL程序调用的语法要求可能不同,尝试调整调用格式:
// 全大写CALL+空参数列表 var result = context.Database.ExecuteSqlRaw("CALL ProgramLibrary.CLProgram()");
- 隔离级别冲突
连接字符串设置的Isolation Level=Chaos允许读取脏数据,但CL程序可能对事务隔离有严格要求。尝试改为AS400默认的Read Committed测试:
"AS400Entities": "server=servername;uid=userid;pwd=pasword;database=databasename;Isolation Level=Read Committed;"
权限与程序依赖缺失
确认执行账号有调用ProgramLibrary.CLProgram的权限,同时检查CL程序是否依赖特定环境变量、作业属性——这些在.NET 8驱动的连接上下文里可能未正确继承。EF Core调用CL程序的特殊方式
针对AS400的CL程序,EF Core的ExecuteSqlRaw可能需要通过RUNSQLSTM封装执行:
var result = context.Database.ExecuteSqlRaw("RUNSQLSTM SQL('CALL ProgramLibrary.CLProgram')");
内容的提问来源于stack exchange,提问作者Nakres
相关产品推荐
相关产品推荐

