2010-04-06 5 views
1

Scénario est ceci; J'ai une requête sqldatareader qui semble ne rien retourner quand j'essaye de convertir le sqldatareader en datatable en utilisant datatable.load.VB.net Debug sqldatareader - fenêtre immédiate

Donc, je débogue dedans, je prends la requête SQL verbeuse avant qu'elle ne rentre dans le sqldatareader, juste pour m'assurer qu'il est correctement formaté. Je copie et colle ceci dans le serveur SQL pour l'exécuter et voir s'il retourne n'importe quoi. C'est le cas, une rangée.

Je retourne à Visual Studio et laisse le programme continuer, je crée une datatable et j'essaie de charger le sqldatareader mais il retourne juste un lecteur vide. Je suis déconcerté par ce qui se passe.

Je vais copier une version du code (pas exact de requête SQL J'utilise mais proche) ici:

Dim cn As New SqlConnection 
cn.ConnectionString = <connection string details here> 
cn.Open() 
Dim sqlQuery As String = "select * from Products where productid = 5" 
Dim cm As New SqlCommand(sqlQuery, cn) 
Dim dr As SqlDataReader = cm.ExecuteReader() 

Dim dt as new DataTable 
dt.load(dr) 

dt devrait avoir le contenu mais il est vide. Si je copie cette requête SQL dans le serveur SQL et l'exécute, j'obtiens une rangée de résultats.

Des idées que je fais mal?

de MISE À JOUR ############

J'ai maintenant remarqué qu'il semble revenir d'une ligne moins que je reçois avec chaque requête SQL. Donc, si je cours moi-même le SQL et que j'obtiens une rangée alors le datatable semble avoir 0 rangées. Si la requête renvoie 4 lignes, le datatable a 3 !! Très étrange, des idées quelqu'un?

######### mise à jour Pour ############

Ok je l'ai fait une boucle pour compter les lignes de la datareader avant d'utiliser la méthode datatable.load. Dans ma requête de test, je reçois 4 lignes (la quantité correcte) dans le lecteur de données, dès que j'utilise la méthode datatable.load, il dit que le datatable est vide, que se passe-t-il ?!

###### Ok

Il semble donc un datareader est une chose à sens unique, itérer pour obtenir le nombre de lignes et il est essentiellement vide aussi loin que tout autre morceau de code est concerné. Je ne me suis pas rendu compte que c'était en avant seulement et ne «réinitialiser» pas une fois lu.

+0

J'ai vu des résultats très similaires en raison de la façon dont VB.Net analyse (pour l'absence d'un meilleur terme) ... Essayez de mettre des mécanismes de syntaxe "évidents" comme [] autour des noms de fichiers et/ou de colonnes dans le Instruction SQL, etc ... Vous pouvez également essayer d'utiliser un SqlDataAdapter (.fill) au lieu du .load et voir si les données montrent en haut – tobrien

+0

Oui, le SqlDataReader est en avant seulement comme la documentation dit: "Fournit un moyen de lire un flux de lignes uniquement en avant d'une base de données SQL Server". http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqldatareader.aspx –

Répondre

1

Insérer cette ligne au-dessus dt.load (dr), vérifiez la valeur dans votre fenêtre de débogage:

Debug.WriteLine("Datareader has rows: " & dr.HasRows) 

Assurez-vous également que votre connexion se ferme en changeant cm.ExecuteReader() à:

cm.ExecuteReader(CommandBehavior.CloseConnection); 
+1

Vérifiez également que vous fermez le DataReader lorsque vous en avez terminé avec. http://msdn.microsoft.com/en-us/library/haa3afyz(VS.80).aspx – DOK

+0

ok, va essayer tout ce qui précède et voir comment je m'entends, merci! –

Questions connexes