12
votes

Procédure stockée Valeurs de retour avec le contexte de données LINQ

J'essaie d'accéder à la valeur de retour d'une procédure stockée avec LINQ

using (DataEntities dataEntities = new DataEntities())
    {
        int query = data.ValidateToken(id);
        Response.Write(query.ToString());
    }


8 commentaires

Est-ce que cela fonctionne pour vous? / ou toute autre solution de réponse?


J'ai essayé les changements que vous avez suggérée mais la requête sera toujours toujours = -1


Je n'ai pas fait beaucoup de choses avec Linq aux bases de données, mais je suppose que les dataentiètes sont une sorte de classe générée. Est-ce que cela fait certainement la bonne chose ou pourriez-vous avoir besoin de le régénérer ou quelque chose? Désolé si c'est un commentaire stupide, mais c'est juste une pensée et la prime de prêter vous fait ressembler à des idées / une inspiration pourraient vous aider. :)


Veuillez afficher le code de la mise en œuvre de validateetoken ().


Est tests une vue ?, N'a également pas besoin de questionner être SELECT TOP 1 * à partir des tests


Database.executesqlCommand peut vous donner ce que vous recherchez, mais ce n'est pas aussi agréable que d'appeler le SP comme une méthode. msdn.microsoft.com/en-us/library/...


Je pense que je n'obtiens pas tout à fait ce que le résultat devrait ressembler à ce que cette seule valeur validToken ou plus?


Je soupçonne que la réponse est que vous ne pouvez pas obtenir de valeurs de retour de Dataentités / Linq. Je n'arrive pas à les obtenir d'un code EF d'abord, seuls les types Compelx / Stracter renvoyés via Select. Vous devrez peut-être mordre la balle et utiliser un objet de commande.


5 Réponses :


0
votes

Essayez de modifier les instructions de retour 0/1 pour sélectionner 0/1


1 commentaires

Non cela ne fonctionne pas non plus. Je sais que ce n'est pas un problème avec la procédure stockée car lorsque j'exécute le SP dans SQL Studio, il renvoie les valeurs correctes.



0
votes

Le problème avec votre code est que vous utilisez si (requête) au lieu de cela, vous devez l'informer comme si existez (requête) pour que votre code soit aussi Ci-dessous xxx

Votre code peut ressembler, xxx

si cela ne fonctionne pas que d'aller pour les autres solutions


4 commentaires

Cela ne fonctionne pas non plus. Cela ne fonctionne pas non plus de SQL. Il retourne toujours 0 même avec valable pour une raison quelconque.


@Jamesla - J'ai trouvé problème avec votre code, vous devez utiliser si vous n'existerez pas si..Check ma réponse mise à jour et stockée de PrCEUDRE Ceci résoudra sûrement votre problème ...


Je ne pense pas que le problème soit avec la procédure stockée, mais avec la structure d'entité de données, car lorsque la procédure stockée est exécutée à partir de SQL Management Studio, cela me donne la valeur de retour correcte. Cependant, dans mon programme, il retourne -1.


Je fais essentiellement le cas 2 dans votre lien, dans votre lien, mais cela ne fonctionne pas. Ce lien est de 2009 alors peut-être que quelque chose a changé depuis lors.



1
votes

C'était ce que j'ai fait et cela a fonctionné.

en SQLServer: xxx

in c #: xxx

Essayez :)


5 commentaires

Bonjour Sergio Merci, il semblerait que, même si cela fonctionne, j'essaie d'obtenir le code de retour SQL de la procédure stockée et lorsque vous exécutez cette procédure stockée renvoie deux résultats - (@ RET) ainsi que le code de retour, cependant. Le bloc de C # obtient uniquement la valeur de @ret. C'est un bon piratage d'un point de vue fonctionnel, mais je veux vraiment savoir comment accéder au code de retour de la procédure stockée sans avoir à renvoyer des ensembles de résultats supplémentaires.


@Jamesla Vous pouvez supprimer la déclaration de retour. Jetez un coup d'œil ici: social .msdn.microsoft.com / Forums / FR-US / AdodotNetentityFramew Ork / ... La solution passe à l'aide de l'instruction SELECT au lieu du retour.


Ok j'ai supprimé la ligne "Sélectionnez @ret comme jeton;" de votre exemple et c'est retour -1 à nouveau.


@Jamesla Je vais éditer ceci à la dernière solution de travail que j'ai sur mon PC.


Oui j'ai essayé le modifier mais lorsque je l'exécute dans SQL Studio Manager, il renvoie un résultat et une valeur de retour. Il renvoie @ret comme résultat puis il renvoie la valeur de retour réelle. Je commence à me demander s'il est impossible d'obtenir la valeur de retour avec l'entitéFramework.



5
votes

Pourquoi utilisez-vous tous une procédure stockée en tant que fonction?

Bien qu'une procédure stockée a retour , il ne s'agit pas d'une fonction, vous ne devez donc pas utiliser retour pour renvoyer des données,

plutôt, vous devez utiliser des paramètres de sortie et d'autres moyens de renvoyer des données, car documenté chez msdn

et l'utilisation de retour est documenté sur MSDN

Muve retour est probablement la raison pour laquelle Linq ne comprend pas vos procédures stockées.


0 commentaires

0
votes
CREATE PROCEDURE [dbo].[MyProc]         
AS
BEGIN
    DECLARE @Ret INT

    // use of IF EXISTS instead of IF
    IF EXISTS(SELECT * from Tests WHERE TestToken = @Token)
        SELECT @Ret =  0
    ELSE
        SELECT @Ret =  1

    RETURN @Ret
END

0 commentaires