2010-12-10 20 views
0

J'ai une fonction comme celui-cilecteur ne lit pas les données

try 
    { 


     using(var sConnection = new SqlConnection(ConnectionString)) 
     using(var sCommand = sConnection.CreateCommand()) 
     { 
      sCommand.CommandText = @"SELECT 
              TABLE_NAME 
              AS 
              TABLES 
             FROM 
              INFORMATION_SCHEMA.TABLE_CONSTRAINTS 
             WHERE 
              CONSTRAINT_TYPE = 'PRIMARY KEY' 
             AND 
              TABLE_NAME <> 'dtProperties' 
            ORDER BY 
              TABLE_NAME"; 
      sConnection.Open(); 
      using(var reader = sCommand.ExecuteReader()) // Troublesome line 
      {      
       while(reader.Read()) 
       { 
        sb.AppendLine(reader.GetString(0)); 
       } 
      } 
     } 

    } 
    catch(Exception ex) 
    { 
     //All the exceptions are handled and written in the EventLog. 
     EventLog log = new EventLog("Application"); 
     log.Source = "MFDBAnalyser"; 
     log.WriteEntry(ex.Message); 
    } 
    return sb.ToString(); 
} 

le débogage, il donne le résultat jusqu'à ce que la connexion est ouverte, mais le lecteur var ne lit pas les données. Est-ce que quelqu'un peut signaler où l'erreur est !!

+0

Voulez-vous dire qu'il s'exécute sans exception, mais sans donner de données? Que montre SQL Profiler? –

+0

Pouvez-vous donner des détails sur l'exception? –

+0

Quelqu'un peut-il me dire pourquoi cela se produit? – Srivastava

Répondre

0

Votre code fourni est-il le même que celui que vous utilisez?

Un comportement étrange de 'travail' dans le débogage, mais pas dans l'exécution, se produit généralement si vous avez des propriétés d'auto-initialisation. Quelque chose comme ceci:

private string _name; 

public string Name 
{ 
    get { 
    if (_name == null) 
    { 
     name = string.Empty; 
    } 
    return _name; 
    } 
    set {_name = value;} 
} 

Donc, si vous utilisez _name directement et débogueur affiche une telle propriété, il est accidentellement "initialise votre propriété avant de l'utiliser.

0

On voit ici dans MSDN: Reader

while (reader.Read()) 
    { 
     Console.WriteLine(String.Format("{0}", reader[0])); 
    } 

Donc, essayez peut-être avec reader[0] au lieu de reader.getString(0)?

Modifier:

Essayez avec ceci:

public Form1() 
    { 
     InitializeComponent(); 

     String ConnectionString = @"Data Source=SERVER\SQLEXPRESS;Initial Catalog=DBNAME;User ID=USER;Password=PWD"; 

     StringBuilder sb = new StringBuilder(); 
     using (SqlConnection sConnection = new SqlConnection(ConnectionString)) 
     { 
      String query = @"SELECT TABLE_NAME AS TABLES FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE CONSTRAINT_TYPE = 'PRIMARY KEY' AND TABLE_NAME <> 'dtProperties' ORDER BY TABLE_NAME"; 
      SqlCommand comand = new SqlCommand(query, sConnection); 
      sConnection.Open(); 
      SqlDataReader reader = comand.ExecuteReader(); 

      if (reader.HasRows) 
      { 
       Console.WriteLine("reader.hasRows == true !"); 
      } 
      else 
      { 
       Console.WriteLine("reader.hasRows == FALSE !"); 
      } 

      while (reader.Read()) 
      { 
       sb.AppendLine(reader.GetString(0)); 
      } 
     } 

     Console.WriteLine(sb.ToString()); 
    } 
} 

Voir si cela fonctionne.

J'ai créé une nouvelle application Winform, l'ai essayé, ça marche pour moi.

Voici était ma sortie:

reader.hasRows == true ! 
Categorie 
Chantier 
... 
And all my table names. 
+0

Non monsieur ... il ne fonctionne pas non plus – Srivastava

+0

@Srivastava Ah, désolé ... Ok alors, je fave quelques questions (certains peuvent sembler stupides): 1. Existe-t-il une exception lorsque votre code s'exécute? 2. Votre requête obtient-elle des lignes lorsqu'elle est exécutée dans un client SQL? 3. Si vous déboguez pas à pas, bouclez-vous plusieurs fois Reader.read(), ce qui signifie que quelque chose est lu? – LaGrandMere

+0

Non monsieur ... il ne lit rien – Srivastava

0

Essayez de placer sConnection.Open() avant de créer sCommand.