2011-01-18 4 views
0

J'ai effectué quelques recherches avant de publier cette question et je suis conscient du fait que lorsqu'aucune donnée n'est renvoyée, ExecuteScalar lève une exception System.NullReferenceException. C'est pourquoi j'ai modifié mon proc stocké pour "return 1" afin de garantir une valeur de retour. Cependant, je reçois toujours l'exception de référence NULL.ExecuteScalar renvoie NullReferenceException lors de l'appel d'un proc stocké qui renvoie 1

J'ai donc essayé d'utiliser le SqlCommand pour interroger une table qui contient des données:

 SqlCommand sqlCommand = new SqlCommand("SELECT * FROM ATableThatHasValues", conn) 

Quand je courais exécuter scalaire, je suis en mesure de ramasser une valeur, donc je sais que j'ai l'autorisation d'interroger la base de données. Je soupçonne que c'est un paramètre d'autorisation spécifique stocké que j'ai raté?

J'apprécierais vraiment tout commentaire/suggestion car j'ai été bloqué dessus pendant un jour maintenant. :(

Mon code ressemble à ceci:

 using (SqlConnection sqlConnection = new SqlConnection(connectionString)) 
     { 
      sqlConnection.Open(); 
      using (SqlCommand sqlCommand = new SqlCommand("GetSomeValue", sqlConnection)) 
      { 
       sqlCommand.CommandType = CommandType.StoredProcedure; 
       //sqlCommand.Parameters.Add(new SqlParameter("@Id", this.ID)); 
       //sqlCommand.Parameters.Add(new SqlParameter("@State", 1 /* active */)); 

       byte retValue = (byte)sqlCommand.ExecuteScalar(); 
       return retValue; 
      } 
     } 

MERCI

+3

Quelle ligne lance l'exécution? Où est la trace de la pile? – asawyer

+0

Vous comprenez le but de 'ExecuteScalar', n'est-ce pas? Il renvoie la première colonne de la première ligne de données, tout le reste est ignoré. Y a-t-il une raison pour que vous l'utilisiez avec 'SELECT *'? –

Répondre

2

estimation aléatoire

Vous utilisez RETOUR donc il n'y a pas de jeu de données à lire la colonne 1, rangée 1 pour! ExecuteScalar

Utilisez les paramètres SELECT ou OUTPUT

Edit: En fait, pas si aléatoire

RETURN 1 n'est pas un jeu de résultats: il est un paramètre « spécial »

sqlCmd.Parameters.Add(New SqlParameter("RETURN_VALUE", SqlDbType.Int)).Direction = ParameterDirection.ReturnValue 
+0

Merci! Ça a marché. Mon proc stocké original renvoie un resultset mais à des fins de débogage, je l'ai modifié en pensant que cela m'aiderait à déboguer, mais cela m'a en fait complètement déraillé. J'étais tellement frustré que j'ai manqué une petite faute de frappe dans ma procédure stockée initiale qui a commencé tout le processus de débogage. :(De toute façon, merci encore! – Bryan

3

Je vais juste préciser ce que @gbn dit. Lorsque vous exécutez du code SQL, vous pouvez renvoyer des informations de trois manières différentes: OUTPUT paramètres, données tabulaires et/ou une seule valeur RETURN. Comme @gbn dit, RETURN valeurs sont essentiellement spécialisés OUTPUT paramètres. ExecuteScalar voit uniquement des informations à partir des données tabulaires, à savoir la première colonne de la première rangée. Si aucune donnée tabulaire n'est reçue lorsque vous appelez ExecuteScalar, une valeur null est renvoyée à la place. Si vous essayez de faire quelque chose avec cette valeur nulle alors évidemment vous obtiendrez un NRE.

+0

Bonne explication, merci – gbn

Questions connexes