La requête paramétrée ... attend le paramètre '@unités", qui n'a pas été fourni
Je suis de cette exception:
De la requête paramétrée '(@Nom de type nvarchar(8),@type nvarchar(8),@unités de type nvarchar(4000),@rang attend le paramètre '@unités", qui n'a pas été fourni.
Mon code pour l'insertion est:
public int insertType(string name, string type, string units = "N\\A", string range = "N\\A", string scale = "N\\A", string description = "N\\A", Guid guid = new Guid())
{
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
SqlCommand command = new SqlCommand();
command.CommandText = "INSERT INTO Type(name, type, units, range, scale, description, guid) OUTPUT INSERTED.ID VALUES (@Name, @type, @units, @range, @scale, @description, @guid) ";
command.Connection = connection;
command.Parameters.AddWithValue("@Name", name);
command.Parameters.AddWithValue("@type", type);
command.Parameters.AddWithValue("@units", units);
command.Parameters.AddWithValue("@range", range);
command.Parameters.AddWithValue("@scale", scale);
command.Parameters.AddWithValue("@description", description);
command.Parameters.AddWithValue("@guid", guid);
return (int)command.ExecuteScalar();
}
}
L'exception a été une surprise parce que je suis en utilisant le AddWithValue
fonction et de faire assurer, j'ai ajouté un paramètre par défaut pour la fonction.
RÉSOLU:
Le problème est que certains paramètres, où les Cordes à vide (qui remplace la valeur par défaut)
C'est le code de travail:
public int insertType(string name, string type, string units = "N\\A", string range = "N\\A", string scale = "N\\A", string description = "N\\A", Guid guid = new Guid())
{
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
SqlCommand command = new SqlCommand();
command.CommandText = "INSERT INTO Type(name, type, units, range, scale, description, guid) OUTPUT INSERTED.ID VALUES (@Name, @type, @units, @range, @scale, @description, @guid) ";
command.Connection = connection;
command.Parameters.AddWithValue("@Name", name);
command.Parameters.AddWithValue("@type", type);
if (String.IsNullOrEmpty(units))
{
command.Parameters.AddWithValue("@units", DBNull.Value);
}
else
command.Parameters.AddWithValue("@units", units);
if (String.IsNullOrEmpty(range))
{
command.Parameters.AddWithValue("@range", DBNull.Value);
}
else
command.Parameters.AddWithValue("@range", range);
if (String.IsNullOrEmpty(scale))
{
command.Parameters.AddWithValue("@scale", DBNull.Value);
}
else
command.Parameters.AddWithValue("@scale", scale);
if (String.IsNullOrEmpty(description))
{
command.Parameters.AddWithValue("@description", DBNull.Value);
}
else
command.Parameters.AddWithValue("@description", description);
command.Parameters.AddWithValue("@guid", guid);
return (int)command.ExecuteScalar();
}
}
- Vous avez oublié de mettre le
@
que le premier caractère de chaque nom de paramètre. - Pourquoi le message d'erreur se plaindre
@units
plutôt que@Name
, qui apparaît en premier? - Je suppose qu'il n'ont pas à chercher dans l'ordre où ils sont fournis.
- Je suis choqué parce qu'encore personne n'a répondu à cette question. Par la voie,
2
upvotes? - J'ai ajouté le @ et encore même exception
- Souhaitez-vous mettre à jour votre question avec votre code mis à jour, s'il vous plaît?
- Oui, mis à jour...
- Ahh,
command.Parameters.AddWithValue("Name", @name)
devrait êtrecommand.Parameters.AddWithValue("@Name", name)
etc. - lol ok je vais vérifier que l'
- Eh bien, toujours pas de travail. J'ai mis à jour mon code dans le message
- pouvez-vous montrer ici script pour la création [Type] table?
- Quelle est la valeur de
units
juste avant le "insertion"? Ne peut pas êtrenull
puisque vous spécifiez une valeur par défaut. Juste curieux de savoir si en quelque sorte l'une des valeurs de paramètre est à l'origine d'une étrange question. - Je soupçonne
AddWithValue
est de deviner quelque chose de mal. Essayez d'utiliser le SqlParameter Constructeur (String, SqlDbType, Int32). - ghost - je l'ai créé à partir de l'éditeur, ce que vous aimeriez savoir à propos de la table? @GrantWinney je pense qu'il peut être vide, alors que je suis de la vérification, nous allons supposer qu'il est, comment puis-je régler ce problème?
- oui, ils sont tous vide (toutes les le avec par défaut)
- double possible de La requête paramétrée attend le paramètre qui n'a pas été fourni
Vous devez vous connecter pour publier un commentaire.
Essayez ce code:
Et vous devez vérifier tous les autres paramètres à valeur null. Si null, vous devez passer
DBNull.Value
valeur.string units = "N\\A"
insertType(null, null, null, null, null, null);
null
. Nommé et Arguments Optionnelsnull
, alors que vous passez est ce que le destinataire de l'appel ne voit.command.Parameters.AddWithValue("@units", (object)units ?? DBNull.Value)
.Ici un moyen à l'aide de l'null-coalescence de l'opérateur:
Ou pour les plus strictes de vérification de type:
L'opérateur a également enchaîné:
Cette classe d'extension a été utile pour moi une couple de fois jusqu'à présent, pour ces questions:
Vous utilisez normalement dans les deux scénarios. Tout d'abord, lors de la création de paramètres pour votre requête:
ou lors de l'analyse du SqlReader valeurs:
C'est une méthode pour être réutilisé avec plusieurs paramètres:
Et puis vous pouvez la réutiliser pour autant de commandes et de paramètres: