2008-10-29 6 views
3

J'appelle un proc SQL qui a 3 paramètres OUTPUT. Après l'appel au proc, l'un des params ne renvoie pas de valeur lorsque les deux autres le font. Le profileur montre que les trois valeurs sont renvoyées.Le paramètre de sortie n'est pas retourné depuis le processus stocké

Les params sont déclarés comme suit dans le proc ...

@UsrVariableID INT OUTPUT, 
@OrganisationName NVARCHAR(256) OUTPUT, 
@Visible bit OUTPUT 

et le code qui appelle le proc est comme ça ...

cm.Parameters.AddWithValue("@OrganisationName", name); 
cm.Parameters["@OrganisationName"].Direction = ParameterDirection.Output; 
cm.Parameters.AddWithValue("@Visible", visible); 
cm.Parameters["@Visible"].Direction = ParameterDirection.Output; 

cm.ExecuteNonQuery(); 

name = cm.Parameters["@OrganisationName"].Value.ToString(); 
visible = bool.Parse(cm.Parameters["@Visible"].Value.ToString()); 
id = int.Parse(cm.Parameters["@UsrVariableID"].Value.ToString()); 

PARAM qui n'est @OrganisationName .

Je me demande si c'est parce que le paramètre est de type chaîne dans le code mais NVARCHAR dans le proc.

Vous avez des idées?

+0

Quand vous dites qu'il échoue, jette-t-il une erreur sur la conversion de tostring() ou ne renvoie-t-il aucune donnée? Le sproc revient-il sans erreur lorsque vous l'exécutez dans SSMS? –

+0

Peut-être que l'erreur est dans la procédure elle-même; Y a-t-il en fait un 'SELECT @OrganisationName = quelque chose 'ou' SET @OrganisationName = quelque chose' dans la procédure? – configurator

Répondre

5

Avec les paramètres de sortie qui ont longueur variable des types de données (nvarchar, varchar, etc), j'ai trouvé que d'être conduit plus explicites à de meilleurs résultats. Dans le cas où vous avez posté, un type n'est pas spécifié du côté C#. Je serais probablement changer les choses à ressembler à quelque chose comme ce qui suit:

SqlParameter theOrganizationNameParam = new SqlParameter("@OrganisationName", SqlDbType.NVarChar, 256); 
theOrganizationNameParam.Direction = ParameterDirection.Output; 
cm.Parameters.Add(theOrganizationNameParam); 
cm.ExecuteNonQuery(); 
name = theOrganizationNameParam.Value; 

Avec cela, vous pouvez garantir la paratmer de sortie a le type de données correct, et ne peut donc accéder sans et exception levée la Valeur propriété.

Espérons que cela apporte de la lumière.

+0

C'est Briliant, Merci beaucoup: D – user1010572

2

Vous pouvez essayer de déclarer les paramètres en premier (puis définir les valeurs), et voir si cela fait une différence.

cm.Parameters.Add["@OrganisationName", SqlDbType.NVarChar, 256].Direction = ParameterDirection.Output 
cm.Parameters["@OrganisationName"].Value = name 

Mais pour moi, il ne semble pas y avoir de problème avec ce que vous avez posté. Incidemment, si vous ne devriez pas avoir besoin du .Parse (.ToString()) vous devriez seulement lancer.

visible = bool.Parse(cm.Parameters["@Visible"].Value.ToString());

devient

visible = (bool)cm.Parameters["@Visible"].Value;
1

Je ne suis pas sûr à 100% MS SQL, mais dans .NET -> Oracle vous devez spécifier la taille de la mémoire tampon de chaîne.

cm.Parameters["@OrganisationName"].Size = 256; 
+0

Vous pouvez être sur quelque chose. Je ne suis pas familier avec ado.net mais quand j'ai travaillé avec ADO dans le passé, j'ai utilisé ceci: Set adoParam = .CreateParameter ("account_number", adVarChar, adParamInput, 20). Où 20 est la taille. –

0

Merci à tous, Comme suggéré par Ady et Scott déclarant explicitement le type dans la déclaration des paramètres l'a résolu.J'ai choisi la réponse de Scotts car il était plus concis.

0

En fait, ce n'est pas sur la déclaration du type.

Pour les paramètres de sortie de taille variable, il est nécessaire de spécifier la taille du paramètre.J'ai lu quelque part qu'il y avait un bug dans l'implémentation qui provoque une exception quand la taille n'est pas spécifiée pour certains types de données. Le tout le rend mal adapté pour retourner des paramètres de taille inconnue, comme nvarchar (max). Je recommande les valeurs de retour via SELECT plutôt que via les paramètres de sortie.

0

Oui, j'ai essayé ici beaucoup de choses et la seule chose qui fonctionne est: vous devez spécifier la taille de la chaîne.

J'ai un StoredProcedure qui retourne une chaîne nvarchar (7) et du côté C# .NET i spécifié la taille = 255 et que cela fonctionne pour moi de recevoir une série de 7 caractères ....

Je n'ai pas aimé cela parce que le code devrait être plus expert ... de toute façon ...