为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。
【DM版本】:8
【操作系统】:win 10
【CPU】:
【问题描述】*:我安装的DM是dm8_20240710_x86_win_64.iso
存储过程很简单,就是往测试表里面插一条数据,然后返回自增的主键ID。
用的SqlSugarCore,
抛出的异常:System.NullReferenceException: Object reference not set to an instance of an object.
存储过程如下:CREATE OR REPLACE PROCEDURE "dbo"."asp_aa" (
DM_id out int,
DM_b char(5),
DM_c char(5)
)
AS
BEGIN
insert into taba(b) values(DM_b||DM_c);
DM_id = @@identity;
END;
C#代码如下:
SqlSugarClient db = new SqlSugarClient(new ConnectionConfig()
{
ConnectionString = PubConnectionString,//连接符字串
DbType = SqlSugar.DbType.Dm,
IsAutoCloseConnection = true,
InitKeyType = InitKeyType.Attribute//从特性读取主键自增信息
});
var para = new SugarParameter[] {
new SugarParameter("@DM_id",-1,true),
new SugarParameter("@DM_b","17"),
new SugarParameter("@DM_c","17")
};
var result1 = db.Ado.UseStoredProcedure().GetDataTable(sprocName, para); //运行到这里报对象为空的异常,GetDataTable换成ExecuteCommand,问题依旧
但是:如果把存储过程的出参去掉,C#代码里面也把出参去掉,那么就运行正常,不会报错。
可见是出参的原因,个么有什么方法能使得sqlSugar能够正常调用带出参的存储过程,并且获取到执行之后出参的值吗?
var para = new SugarParameter[] {
new SugarParameter("@DM_id",-1,true),
new SugarParameter("@DM_Return",-1,true),
new SugarParameter("@DM_b","17"),
new SugarParameter("@DM_c","17")
};
//db.Ado.IsClearParameters = false;
//db.Ado.UseStoredProcedure().IsClearParameters = false;
try {
db.Ado.ExecuteCommand("call asp_aa(@DM_id,@DM_Return,@DM_b,@DM_c)", para); //1
}
catch (Exception E1) { }
try{
var result1 = db.Ado.UseStoredProcedure().ExecuteCommand(sprocName, para); //2 //or GetDataTable
}
catch (Exception E2) { }
不管语句1执行异常与否(当然带@的参数得按照顺序写对),语句2就能正常执行不报错了(之前一直报对象为空)。
盲猜,难道是,因为要把值赋值给出参,但是要是光执行2的话,就没有初始化所以报错?而语句1不管执行结果怎么样,它毕竟初始化了出参?所以2才没有报错?