ExecuteReader ne returnne rien

J'ai une table appelée 'MatchType' et elle contient:

ID | MatchTypeName 1 | One Day 2 | Two Day 3 | T20 

J'ai une méthode pour récupérer un logging de cette table basée sur une piqûre qui va correspondre à une valeur dans MatchTypeName :

 public static int GetByName(ssortingng matchType) { MatchType item = new MatchType(); using (SqlConnection con = new SqlConnection(BaseDataAccessLayer.GetConnectionSsortingngByName())) { using (SqlCommand cmd = new SqlCommand(STORED_PROC_GetByName, con)) { cmd.CommandType = CommandType.StoredProcedure; cmd.Parameters.Add("@matchTypeName", SqlDbType.VarChar, 20).Value = matchType; con.Open(); using (IDataReader reader = cmd.ExecuteReader()) { item.LoadFromReader(reader); } } } return item.Id; } 

Cette méthode appelle cette procédure stockée:

 CREATE PROCEDURE [dbo].[MatchType_GetByName] (@matchTypeName varchar(20)) AS BEGIN SET NOCOUNT ON SELECT [Id], [MatchTypeName] FROM [dbo].[MatchType] WHERE [MatchTypeName] = @matchTypeName RETURN @@ERROR END 

Lorsque GetByName méthode GetByName , je passe une string "One Day". J'ai confirmé cela par le debugging. Je ne peux pas postr un message d'erreur qui soit utile car il n'y en a aucun qui soit généré. Juste aucune donnée n'est returnnée dans le lecteur …

J'ai quelques autres methods et procédures stockées qui utilisent un process similaire et ils fonctionnent. La seule chose que je peux voir est la différence est que j'utilise la clause WHERE sur une valeur varchar / ssortingng qui est quelque chose que les autres requêtes ne font pas …

Pourtant, je peux exécuter ce proc stocké et il returnne tous les loggings ..

 BEGIN SET NOCOUNT ON SELECT [Id], [MatchTypeName] FROM [dbo].[MatchType] RETURN @@ERROR END 

La longueur par défaut pour varchar déclarée sans taille est 1. Vous l'avez déclaré comme cela dans votre paramètre proc stocké, donc vous ne passez que le premier caractère.

Changez votre déclaration:

 (@matchTypeName varchar) 

à une taille pertinente:

 (@matchTypeName varchar(20)) 

En outre, ajoutez la taille dans le code et assurez-vous que le cas dans votre nom de paramètre correspond à votre proc stocké:

 cmd.Parameters.Add("@matchTypeName", SqlDbType.VarChar, 20).Value = matchType; 

La procédure exécute la requête et affiche les résultats (c'est pourquoi cela fonctionne dans SSMS), mais ne returnne rien. Essayez ceci (notez, je ne l'ai pas réellement testé).

 CREATE PROCEDURE [dbo].[MatchType_GetByName] @matchTypeName varchar(20), @matchTypeID INT OUTPUT AS BEGIN SET NOCOUNT ON SELECT @matchTypeID = [Id], [MatchTypeName] FROM [dbo].[MatchType] WHERE [MatchTypeName] = @matchTypeName RETURN @@ERROR END 

Essaye ça:

 using (SqlCommand cmd = new SqlCommand(STORED_PROC_GetByName, con)) { cmd.CommandType = CommandType.StoredProcedure; cmd.Parameters.AddWithValue("@matchTypeName", matchType); con.Open(); using (IDataReader reader = cmd.ExecuteReader()) { item.LoadFromReader(reader); } } 

Propriété SqlCommand.Parameters