Procédure stockée ou une fonction s'attend à ce paramètre qui n'est pas fourni
Je suis en train d'essayer d'insérer des données dans une base de données SQL Server par l'appel d'une procédure stockée, mais j'obtiens l'erreur
Procédure ou la fonction 'SHOWuser' attend le paramètre '@userID", qui n'a pas été fourni.
Ma procédure stockée est appelée SHOWuser
. J'ai vérifié à fond et pas de paramètres est manquant.
Mon code est:
public void SHOWuser(string userName, string password, string emailAddress, List<int> preferences)
{
SqlConnection dbcon = new SqlConnection(conn);
try
{
SqlCommand cmd = new SqlCommand();
cmd.Connection = dbcon;
cmd.CommandType = System.Data.CommandType.StoredProcedure;
cmd.CommandText = "SHOWuser";
cmd.Parameters.AddWithValue("@userName", userName);
cmd.Parameters.AddWithValue("@password", password);
cmd.Parameters.AddWithValue("@emailAddress", emailAddress);
dbcon.Open();
int i = Convert.ToInt32(cmd.ExecuteScalar());
cmd.Parameters.Clear();
cmd.CommandText = "tbl_pref";
foreach (int preference in preferences)
{
cmd.Parameters.Clear();
cmd.Parameters.AddWithValue("@userID", Convert.ToInt32(i));
cmd.Parameters.AddWithValue("@preferenceID", Convert.ToInt32(preference));
cmd.ExecuteNonQuery();
}
}
catch (Exception)
{
throw;
}
finally
{
dbcon.Close();
}
et de la procédure stockée est:
ALTER PROCEDURE [dbo].[SHOWuser]
(
@userName varchar(50),
@password nvarchar(50),
@emailAddress nvarchar(50)
)
AS
BEGIN
INSERT INTO tbl_user(userName, password, emailAddress)
VALUES (@userName, @password, @emailAddress)
SELECT
tbl_user.userID, tbl_user.userName,
tbl_user.password, tbl_user.emailAddress,
STUFF((SELECT ',' + preferenceName
FROM tbl_pref_master
INNER JOIN tbl_preferences ON tbl_pref_master.preferenceID = tbl_preferences.preferenceID
WHERE tbl_preferences.userID = tbl_user.userID
FOR XML PATH ('')), 1, 1, ' ' ) AS Preferences
FROM
tbl_user
SELECT SCOPE_IDENTITY();
END
C'est la deuxième procédure stockée tbl_pref
qui est utilisé dans la même fonction:
ALTER PROCEDURE [dbo].[tbl_pref]
@userID int,
@preferenceID int
AS
BEGIN
INSERT INTO tbl_preferences(userID, preferenceID)
VALUES (@userID, @preferenceID)
END
- L'erreur est assez évident. La procédure stockée attend un paramètre appelé UserID. Votre code appelant ne fournit pas de paramètre, appelé nom d'utilisateur.
- Le preferenceName voici une liste de case à cocher dans lequel j'ai déjà entre les valeurs de la base de données. Svp aider.
- Mais le nom d'utilisateur est générée automatiquement la colonne.
- Vous ne semblez pas passer le paramètre de nom d'utilisateur dans votre code. C'est une colonne d'identité?
- Il est toujours prévu dans la procédure de définition, et qui manque dans le code. C'est pourquoi vous voyez le message d'erreur.
- > la Procédure ou la fonction 'SHOWuser' attend le paramètre '@preferenceName", qui n'a pas été fourni.
- il y a 5 paramètres dans votre SP, mais votre code n'a que 4. C'est pourquoi l'erreur.
- u pourrait pls me dire le bon codage en flétrir la procédure stockée ou C# pour les deux userID et preferenceName
- Dans ce cas, passer de 0 à la UserID si c'est une colonne d'identité.
- ya c'est vrai, mais le nom d'utilisateur est générée automatiquement la colonne et preferenceName est une liste de valeurs déjà saisies dans la base de données. J'utilise ici les trucs de requête pour la combinaison de deux tables tbl_user(nom d'utilisateur,mot de passe,votre adresse de courrier électronique)==[Ces valeurs saisies par l'utilisateur] et tbl_pref_master(prefID,preferenceName)==[j'ai déjà saisi ces valeurs dans la base de données].
- Votre tête a dit que vous avez essayé d'insérer des données dans une base de données SQL Server, mais la procédure stockée que vous avez donné n'est ici qu'une instruction select. Est-ce ton code complet?
- Thanku pour réaliser mon erreur. Pls voir le code que j'ai modifié la procédure stockée. mais toujours l'erreur reste la même
- pls m'aider avec le code pour passer de 0 à l'identifiant utilisateur. Comme est-il en passant la valeur null dans cette voie. "ENSEMBLE userid=null;" La procédure stockée est en fait de ne pas accepter ceci. Aider Pls
- J'ai modifie le code de la procédure stockée. Maintenant l'erreur est généré d'ERREUR: objet de référence non définie à une instance d'un objet.
- double possible de Procédure s'attend à ce paramètre qui n'a pas été fourni
Vous devez vous connecter pour publier un commentaire.
Votre procédure stockée attend 5 paramètres en entrée
De sorte que vous devez ajouter tous les 5 paramètres de cette SP appel:
PS: Il n'est pas clair ce que ces paramètre sont pour. Vous n'utilisez pas ces paramètres dans votre SP la peau, afin que votre SP devrait ressembler à:
cmd.Parameters.AddWithValue
à partir de votre code.int i = Convert.ToInt32(cmd.ExecuteScalar());
àcmd.ExecuteNonQuery();
Dans mon cas, j'ai reçu cette exception, même lorsque toutes les valeurs de paramètres ont été correctement fourni, mais le type de commande n'a pas été précisé :
Ce n'est évidemment pas le cas dans la question ci-dessus, mais la description de l'exception n'est pas très clair, dans ce cas, j'ai donc décidé de préciser que.
CommandType
n'est pas mis àStoredProcedure
, il n'envoie pas tous les paramètres qui ont été ajoutés à laSqlCommand
?Je suis tombé sur cette question hier, mais aucune des solutions ici travaillé exactement, cependant, ils ne me pointer dans la bonne direction.
Notre application est un outil de workflow écrit en C# et, trop simplifié, dispose de plusieurs procédures stockées de la base de données, ainsi qu'une table de métadonnées sur chaque paramètre utilisé par chaque procédure stockée (nom, l'ordre, le type de données, la taille, etc), ce qui nous permet de créer autant de nouvelles procédures stockées que nous avons besoin sans avoir à modifier le C#.
Analyse du problème a montré que notre code a été de définir tous les paramètres corrects sur le
SqlCommand
objet, mais une fois qu'il a été exécuté, il l'a jeté la même erreur que les OP eu.Une analyse approfondie a révélé que certains paramètres ont une valeur de
null
. Je doit donc tirer la conclusion queSqlCommand
objets ignorer toutSqlParameter
objet dans leur.Parameters
collection avec une valeur denull
.Il y a deux solutions à ce problème que j'ai trouvé.
Dans nos procédures stockées, donner une valeur par défaut pour chaque paramètre, donc à partir de
@Parameter int
à@Parameter int = NULL
(ou une autre valeur par défaut si nécessaire).Dans notre code qui génère l'individu
SqlParameter
objets, l'attributionDBNull.Value
au lieu denull
où la valeur est un SQLNULL
fait le tour.L'original codeur a déménagé et le code a été écrit à l'origine avec la Solution 1 à l'esprit, et après avoir pesé les avantages des deux, je pense que je vais rester avec la Solution 1. Il est beaucoup plus facile de spécifier une valeur par défaut pour une procédure stockée spécifique lors de la rédaction de elle, plutôt que de toujours être
NULL
tel que défini dans le code.Espère que ça aide quelqu'un.
Dans mon cas, j'ai obtenu l'erreur sur le paramètre de sortie, même si j'ai été la mise correctement sur C#, côté j'ai compris j'ai oublié de donner une valeur par défaut pour le paramètre de sortie sur la procédure stockée
Dans mon cas, C'était le retour d'un paramètre de sortie et n'a pas été tout Retour de valeur.
Tellement changé qu'il
et puis il jetait erreur de taille. j'ai donc dû définir la taille ainsi