J’ai une procédure stockée qui a un paramètre appelé UserName et dans mon code derrière j’ai un object SqlCommand auquel j’ajoute les parameters avec la méthode Add. Mais pour une raison quelconque, lorsque l’object de commande tente d’exécuter la méthode ExecuteReader, il lève une exception. Je suis totalement désemparé et je ne sais pas pourquoi il ne reconnaît pas le paramètre. Avant que la méthode ExecuteReader ne soit exécutée, un point d’arrêt est défini afin de pouvoir confirmer que l’object de commande contient les parameters définis, ce qui est true. Je sais que la procédure stockée renvoie les données correctes lorsque les parameters ne sont pas ajoutés à l’object de commande, mais sont codés en dur dans la procédure stockée réelle. Vous trouverez ci-dessous le message d’exception indiqué dans le bloc catch. Je vais également coller mon code et la première partie de la procédure stockée. J’apprécierais grandement toute aide dans ce domaine, étant donné que j’ai essayé de nombreuses approches différentes sans succès. Merci d’avance.
La procédure ou la fonction ‘someStoredProcedure’ attend le paramètre ‘@UserName’, qui n’a pas été fourni.
private DataTable GetLossMitData(ssortingng code, DateTime? start, DateTime? end) { DataTable results = new DataTable(); ssortingng connectionSsortingng = ConfigurationManager.ConnectionSsortingngs["asdf"].ConnectionSsortingng; ssortingng userName = Ssortingng.Empty; try { using (SPSite site = new SPSite(ConfigurationManager.AppSettings["someName"])) { using (SPWeb web = site.OpenWeb()) { userName = web.CurrentUser.Email.ToSsortingng(); } } using (SqlConnection connection1 = new SqlConnection(connectionSsortingng)) { connection1.Open(); using (SqlCommand command1 = new SqlCommand("someStoredProcedure", connection1)) { command1.Parameters.Add(new SqlParameter("@UserName", userName)); command1.Parameters.Add(new SqlParameter("@ProductCode", code)); SqlDataReader dr = command1.ExecuteReader(CommandBehavior.CloseConnection); results.Load(dr); } connection1.Close(); } } catch (Exception ex) { } return results; }
@UserName nvarchar(256), @ProductCode nvarchar(256), @StartDate nvarchar(256) = '1/1/1900', @EndDate nvarchar(256) = '12/30/2012' AS BEGIN SET NOCOUNT ON; Declare @UserID int Select @UserID = Users.UserID from Users where Users.Email = @UserName
Essayez de vous assurer que le type de commande est défini sur procédure stockée.
mycommand.CommandType = System.Data.CommandType.StoredProcedure;
Vous obtiendrez cette exception si la valeur de votre variable ‘userName’ est null
Si la valeur null est valide, transmettez plutôt «DBNull.Value» à la firebase database:
command1.Parameters.Add(new SqlParameter("@UserName", (userName ?? DBNull.Value));
Command1.CommandType = System.Data.CommandType.StoredProcedure
Cela forcera ExecuteReader à exécuter le exec au lieu de simplement l’essayer en tant que commande plate.
Par défaut, la propriété CommandText
doit contenir une commande SQL complète, pas seulement le nom de la procédure stockée.
Vous pouvez modifier cela en définissant la propriété CommandType
la SqlCommand
sur StoredProcedure
.
Vous pouvez également explicitement passer les parameters en modifiant le CommandText
en "someStoredProcedure @UserName, @ProductCode"
; Il s’agit d’une instruction SQL complète qui fonctionnera avec le type de Text
CommandType
par défaut.
EDIT : Je viens de l’essayer, et le seul moyen d’obtenir ce message d’erreur sans définir CommandType
sur StoredProcedure
(ce qu’il n’a pas fait) est si CommandText
est EXEC someStoredProcedure
. Passer un paramètre null
génère une erreur différente.