web-dev-qa-db-fra.com

Ado.net - la propriété Size a une taille non valide de 0

J'essaie d'obtenir la valeur de sortie de DB via ADO.net. Il y a un code client:

    using (var connection = new SqlConnection(ConnectionString))
    {
        connection.Open();
        SqlCommand command = new SqlCommand("pDoSomethingParamsRes", connection);
        command.CommandType = CommandType.StoredProcedure;
        command.Parameters.Add("@i", 1);
        var outParam = new SqlParameter("@out", SqlDbType.VarChar);
        outParam.Direction = ParameterDirection.Output;
        command.Parameters.Add(outParam);
        command.ExecuteNonQuery();
        Console.WriteLine(command.Parameters["@out"].Value.ToString());
    }

Lorsque je lance ceci, j'obtiens l'exception suivante:

the Size property has an invalid size of 0

Selon le manuel SqlParameter.Size Property Je pourrais omettre la taille. Pourquoi ai-je cette exception? Comment le faire fonctionner sans dépasser la taille?
Merci de votre aide!

55
StuffHappens

VarChar et NVarChar sont des champs de caractères de largeur variable (donc var + char). Vous devez définir la longueur, sinon la valeur par défaut est zéro.

58
Sachin Shanbhag

La taille des paramètres est requise pour les paramètres de sortie de taille variable. Généralement, ADO.NET décide de la taille du paramètre en fonction de la valeur affectée au paramètre (il est donc facultatif), mais dans le paramètre de sortie car aucune valeur n'est définie, vous devez fournir la taille requise pour le paramètre

Réglez la taille du paramètre sur la taille de la variable de sortie de la base de données ... Dites 50

outParam.Size = 50;
46
The King

Par ailleurs, la définition de la propriété size d'un paramètre de sortie est nécessaire même s'il ne s'agit pas d'un paramètre de type chaîne. Par exemple, si vous utilisez un System.Data.SqlDbType.Int, vous devez définir la taille sur 4.

14
Andrew Jens

Vérifiez MSDN: propriété SqlParameter.Size

Pour les paramètres bidirectionnels et de sortie et les valeurs de retour, vous devez définir la valeur de Taille. Cela n'est pas requis pour les paramètres d'entrée et, s'il n'est pas défini explicitement, la valeur est déduite de la taille réelle du paramètre spécifié lorsqu'une instruction paramétrée est exécutée.

9
Pranay Rana

La réponse de chacun était à peu près aussi claire que de la boue pour moi. Peut-être que cela aidera quelqu'un maintenant que j'ai trouvé ce qui a fonctionné.

Besoin d'ajouter de la taille au paramètre

        DynamicParameters Params = new DynamicParameters();
        Params.Add("@ProfileID", ProfileID);
        Params.Add("@CategoryName", CategoryName);
        Params.Add("@Added", dbType: DbType.String, direction: ParameterDirection.Output,size:10);

        db.Execute(sql, Params, commandType: CommandType.StoredProcedure, commandTimeout: 60);

        var Added = Params.Get<string>("@Added");
3
Deathstalker

Je ne sais pas si c'est le même problème que j'ai eu auparavant, mais l'utilisation d'un octet pour un paramètre peut parfois conduire à cette erreur.

Essaye ça. Déclarez explicitement le paramètre i en tant que variable. ALORS attribuez sa valeur à la propriété Value.

1
Andrew Harry

vous devez définir la taille pour la sortie des paramètres

using (var connection = new SqlConnection(ConnectionString))
{
    connection.Open();
    SqlCommand command = new SqlCommand("pDoSomethingParamsRes", connection);
    command.CommandType = CommandType.StoredProcedure;
    command.Parameters.Add("@i", 1);
    var outParam = new SqlParameter("@out", SqlDbType.VarChar);
    outParam.Direction = ParameterDirection.Output;
    outParam.Size = 50; // this is example
    command.Parameters.Add(outParam);
    command.ExecuteNonQuery();
    Console.WriteLine(command.Parameters["@out"].Value.ToString());
}
0
Lê Xuân Tây

En outre, vous pouvez obtenir la taille réelle des paramètres en inspectant le sproc avec cette petite commande:

SqlCommandBuilder.DeriveParameters(yourCommand)

et puis juste aller à travers la collection de paramètres.

0
Mr W

J'ai eu cette erreur, fournissant une valeur qui avait un type non chaîne, mais nullable. Dans mon cas, un int?. Je l'ai corrigé en passant à la place un int non nul.

0
Jonathan