2017-06-16 6 views
0

J'essaie d'appeler une procédure stockée avec une chaîne comme paramètre (VARCHAR (MAX)) mais encore et encore il dit à mon @args paramètre n'est pas quand il est certainement. Ceci est ma procédure de test:@args n'est pas un paramètre pour la procédure

IF OBJECT_ID ('TEST', 'P') IS NOT NULL 
    DROP PROCEDURE TEST; 
GO 

CREATE PROCEDURE TEST (@args varchar (max)) AS 
BEGIN 
    EXEC sp_execute_external_script 
    @language = N'R' 
    , @script = N'OutputDataSet <- as.data.frame(...);' 
    , @params = N'@args varchar(max)' 
    , @args = @args 
WITH RESULT SETS ((...)); 
RETURN 0; 
END 

Si je l'appelle du studio de gestion, il fonctionne:

SET LANGUAGE ENGLISH 
EXEC dbo.TEST @args = 'long string' 
GO 

mais pas C#

public static void Main() 
{ 
    Console.WriteLine("Connection test!"); 
    Console.WriteLine("Press ESC to stop"); 

    string ConnectionString = "..."; 
    SqlConnection conn = new SqlConnection(ConnectionString); 
    SqlCommand cmd = new SqlCommand("TEST"); 
    SqlDataReader rdr = null; 

    string args = "very long string"; 

    cmd.CommandType = CommandType.StoredProcedure; 
    cmd.Connection = conn; 
    cmd.Parameters.Add("@args", SqlDbType.VarChar, -1).Value = args; 
    conn.Open(); 

    var returnParameter = cmd.Parameters.Add("@ReturnVal", SqlDbType.Int); 
    returnParameter.Direction = ParameterDirection.ReturnValue; 
    try { cmd.ExecuteNonQuery(); } // @args is not a parameter for TEST Procedure 
    catch (SqlException ex) 

Je ne suis pas réutilisent un paramètre qui est juste un varchar (max). Des idées?

+0

Vous pouvez essayer de modifier cette ligne 'cmd.Parameters.Add (" @ args ", SqlDbType.VarChar, -1) .Value = args;' à 'cmd.Parameters.Add (" @ args ", SqlDbType. VarChar) .Value = args; ' –

+0

Malheureusement, le même résultat. Je comprends -1 dit à C# de définir args comme un varchar (max). Quelle est la différence si je l'enlève? – Leo

+0

Théoriquement votre code semble OK. Même avec cela, cela aurait dû marcher et vous avez raison. Peut-être que vous n'êtes pas connecté à la bonne base de données alors, sur votre solution? –

Répondre

0

Enfin, j'ai trouvé l'erreur qui était extrêmement bête. Réponse courte: ajout de l'instruction SQL USE avant de déposer et de créer le proc.

USE myDB; 
GO 

Réponse longue: Il se trouve que j'ai 2 et je BDs la création de la SP en maître mais j'avais une autre procédure dans mon test DB. Donc, bien que j'ai supprimé le SP, il y en avait un autre dans l'autre DB avec le même nom mais des paramètres différents, d'où l'erreur. Comme je ne pouvais pas comprendre pourquoi @args était incorrect, j'ai énuméré les paramètres SP (https://stackoverflow.com/a/3038470/2846161, https://stackoverflow.com/a/3038530/2846161) et il s'est avéré que la procédure a été listée même en cours de suppression, donc il a été répliqué.