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!
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.
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;
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.
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.
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");
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.
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());
}
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.
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.