You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 22:25:01