当前位置: 首页 > 编程语言 > C#

使用存储过程从Dapper.net查询和返回值分享

时间:2023-04-11 03:28:25 C#

使用存储过程从Dapper.net查询和返回值我正在尝试使用Dapper.Net调用存储过程并得到返回值。p.Add("@INCIDENT_ID",dbType:DbType.Int32,direction:ParameterDirection.ReturnValue);varretResults=con.Execute("usp_GetIncidentID",p,commandType:CommandType.StoredProcedure);intIncidentID=p.Get("INCIDENT_ID");我尝试了几种不同的参数说明并使用“@INCIDENT_ID”。如果我逐步查看retResults结果,我可以看到retResults值中丢弃了正确的返回值,但我无法按照下面文档中描述的方式访问这些值。存储过程Dapper支持完全存储过程:varuser=cnn.Query("spGetUser",new{Id=1},commandType:CommandType.StoredProcedure).First();}}}如果你想要更花哨的东西,你可以这样做:varp=newDynamicParameters();p.Add("@a",11);p.Add("@b",dbType:DbType.Int32,direction:ParameterDirection.Output);p.Add("@c",dbType:DbType.Int32,direction:ParameterDirection.ReturnValue);cnn.Execute("spMagicProc",p,commandType:commandType.StoredProcedure);intb=p.Get("@b");intc=p.Get("@c");可以读取如下值varincidentId=retResults.ToList()[0].INCIDENT_ID;我怀疑(未经测试)这与您命名参数的方式完全不匹配;尝试(注意删除的@):p.Add("INCIDENT_ID",dbType:DbType.Int32,direction:ParameterDirection.ReturnValue);varretResults=con.Execute("usp_GetIncidentID",p,commandType:CommandType.StoredProcedure);intIncidentID=p.Get("INCIDENT_ID");我在读取QueryMultiple的结果时遇到了类似的问题。第一次调用Read()返回正确的类型,第二次调用返回DapperRow。我发现使用类型化的Read():varlineExists=query.Read().FirstOrDefault()==1;解决了我的问题。为了简单起见,我减少了这个。我正在使用输出参数,因为这使我可以完全控制传回的数据类型。我可以将此方法用于任何其他场景,而不仅仅是插入。存储过程:ALTERPROCEDUREUser_Insert(@EmailAddressnvarchar(255),@IdbigintOUT)ASINSERTINTOUser([EmailAddress])VALUES(@EmailAddress)set@Id=SCOPE_IDENTITY()存储库代码:varsql="ExecuteUser_Insert@电子邮件地址,@Id=@Id输出";var_params=newDynamicParameters();_params.Add("EmailAddress",user.EmailAddress);_params.Add("Id",dbType:DbType.Int64,direction:ParameterDirection.Output);使用(varconnection=newSqlConnection(ConnectionString)){connection.Open();使用(vartransaction=connection.BeginTransaction()){varresult=SqlMapper.Execute(connection,sql,param,transaction);交易.Commit();}}varid=_params.Get("Id");使用Dapper的测试版本,我发现它非常有效:result=dbConnection.ExecuteScalar(typeof(UCCCCException).Name+"_c",obj,commandType:CommandType.StoredProcedure);我正在编写一个泛型,用于将任何类型的对象插入到数据库中。存储过程如下所示:ALTERPROCEDURE[dbo].[UCCCCException_c](@Idint=null,@ExceptionDatedatetime=null,@HResultint=0,@Messagevarchar(8000)=null,@Sourcevarchar(8000)=null,@StackTracevarchar(8000)=null,@Modulevarchar(8000)=null,@Namevarchar(8000)=null,@created_atdatetime=null,@updated_atdatetime=null,@created_byint=null,@updated_byint=null,@Creatorvarchar(255)=null,@Updatorvarchar(255)=null)AS--添加SETNOCOUNTON以防止额外的结果集--干扰SELECT语句。设置无计数;插入dbo.ucccexceptions(ExceptionDate,HResult,[Message],[Source],StackTrace,Module,Name)值(coalesce(@ExceptionDate,getdate()),@HResult,@Message,@Source,@StackTrace,@Module,@Name);选择@@Identity;go注意你必须为你正在使用的类中的每个属性指定一个条目,即使这些属性不存在于目标表中,它们也必须是存储过程的参数。如果您有许多字段是MVC情况下的视图字段,这可能会很烦人。要获得返回值,您只需使用Execute,并确保您的最后一条语句是存储过程中的Select@@Identity。它工作得很好,允许我在我的存储库中编写一个通用的插入命令,如下所示:publicvirtualintInsert(Tobj){intresult=-2;如果(!databaseOnline){抛出新的异常(HttpStatusCode.ServiceUnavailable.ToString());}if(obj!=null){try{using(IDbConnectiondbConnection=ConnectionProvider.OpenConnection()){dbConnection.Open();结果=dbConnection.ExecuteScalar(typeof(T).Name+"_c",obj,commandType:CommandType.StoredProcedure);}}catch(SqlExceptionsqlex){Logger.LogError(sqlex,false);扔;}catch(Exceptionex){Logger.LogError(ex);扔;}}返回结果;我在我的数据库中使用约定,存储过程的名称是类型名称,后跟“_s”代表选择,“_c”代表插入,“_d”代表删除,“_u”代表更新。PS:我讨厌使用Dapper的DynamicParameters或任何其他需要您对公共存储库中的每个类使用不同的插入或更新方法的设备。DynamicParameters解决方案在我看来并不干净。最好让存储过程代码返回一个整数(选择1;)并使用dapperExecuteScalar("[sp_name]",params);以上就是C#学习教程的全部内容:使用存储过程从Dapper.net查询返回值,如果对大家有用,还需要详细了解C#学习教程。希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: