Obtenir la valeur de retour de procédure stockée avec iBatis.NET
-
20-09-2019 - |
Question
Comment puis-je récupérer la valeur de retour d'une procédure stockée à l'aide iBatis.NET? Le code ci-dessous appelle avec succès la procédure stockée, mais l'appel QueryForObject
SqlMap
<procedure id="MyProc" parameterMap="MyProcParameters" resultClass="int">
MyProc
</procedure>
<parameterMap id="MyProcParameters">
<parameter property="num"/>
</parameterMap>
code C #
public int RunMyProc( string num )
{
return QueryForObject < int > ( "MyProc", new Hashtable { { "num", num } } );
}
procédure stockée
create procedure MyProc
@num nvarchar(512)
as
begin
return convert(int, @num)
end
Pour votre information, j'utilise iBatis 1.6.1.0, .NET 3.5 et SQL Server 2008.
La solution
Il est pas joli, mais cela fonctionne:
SqlMap
<statement id="MyProc" parameterClass="string" resultClass="int">
declare @num int
exec @num = MyProc #value#
select @num
</statement>
code C #
public int RunMyProc( string num )
{
return QueryForObject < int > ( "MyProc", num );
}
Autres conseils
Vous pouvez consulter l'article suivant http://www.barebonescoder.com/2010/ 04 / ibatis-net-emmagasinées procédures de retour des valeurs / sur la façon de récupérer les valeurs de retour.
Je l'ai utilisé dans QueryForObject et insérez des scénarios où la dernière déclaration est une déclaration de retour dans la procédure stockée.
Portez une attention particulière à l'attribut class sur l'élément « parameterMap ». Il est beaucoup plus jolie que la réponse ci-dessus et je crois qu'il est plus en ligne avec la façon dont IBatis.Net était destiné à être utilisé.
Les procédures stockées ne sont pas une valeur de retour comme des fonctions.
Donc, je ne pense pas que cela fonctionnera. Essayez d'utiliser des paramètres de sortie à la place.
Je ne suis pas sûr de votre logique d'application, mais votre procédure serait mieux comme ceci:
create procedure MyProc
@num nvarchar(512)
as
begin
DECLARE @ReturnValue int
BEGIN TRY
SET @ReturnValue=convert(int, @num)
END TRY
BEGIN CATCH
SET @ReturnValue=0 --procedures can not return null, so set some default here
END CATCH
return @ReturnValue
end