2009-11-14 5 views
4

J'ai réussi à faire passer mon projet de odbc.datareader à mysql.datareader. Le problème est qu'avec le premier lecteur de données/odbc), la propriété AffectedRows récupère le nombre de lignes correctement même s'il s'agissait d'une requête pure. Mais ça ne marche pas avec mysql.datareader, son -1 alors. Je ne vois donc pas comment récupérer le nombre de lignes, c'est-à-dire "les vues de résultat". EDIT: Je connais son lecteur uniquement en avant, mais ce que je ne comprends pas est: Si un point d'arrêt à la ligne DBreader = commande.ExecuteRader(), je peux voir que DBreader a - dans la vue résultat - autant d'objets que les lignes devraient être. Comment ça se fait que c'est connu juste après la course? MerciComment compter des lignes dans MySqlDataReader?

Répondre

3

La raison pour laquelle DataReader ne contient pas le rowcount est qu'il peut être très coûteux à calculer. Par exemple, vous dites exécutez une requête qui renvoie les bons de commande qui ont été saisis cette année et non Deleted:

SELECT * FROM PurchaseOrders 
WHERE PurchaseDt > '2009-01-01' 
AND IsDeleted = 0 

Et vous utilisez cette requête avec un DataReader et de lire les 10 premières lignes. SQL Server "envoie" des lignes au client lorsqu'il le demande. Chaque fois que vous demandez une autre ligne, SQL Server exécute l'étape suivante de la requête. Ainsi, même SQL Server ne connaît pas le nombre total de lignes avant que vous n'ayez lu toutes les lignes.

+0

Comment puis-je demander seulement 10 lignes? Si j'exécute SELECT * .... je suppose que le lecteur de données C# fait tout en une seule étape, je veux dire l'application va geler jusqu'à ce que la requête n'est pas terminée? – Petr

+0

Une façon de demander 10 lignes est d'appeler Read() seulement 10 fois. Un autre serait d'ajouter «LIMIT 10» à la fin de la requête MySQL – Andomar

+0

Oui, mais je ne veux pas faire :) Je demandais ce que si j'envoie simple SELECT toute requête, de sorte que la connexion DB fonctionne avec chaque lecture, puis c'est fermé? – Petr

0

Voici la fonction que j'utilise. N'hésitez pas à l'adapter à vos besoins.

/// <summary> 
    /// Counts the number of rows in a given table. 
    /// </summary> 
    /// <param name="tableName">The name of the table to query.</param> 
    /// <param name="closeConnectionWhenDone">A flag indicating whether the connection should be closed once the query is executed.</param> 
    /// <returns>The number of rows in the table.</returns> 
    private static int GetNumRowsInTable(string tableName, bool closeConnectionWhenDone = false) 
    { 
     string selectQueryString = String.Format("select 1 from {0};", tableName); 
     int numRows = 0; 
     CommandBehavior behavior = closeConnectionWhenDone ? CommandBehavior.CloseConnection : CommandBehavior.Default; 
     using (var command = new OdbcCommand(selectQueryString, ODBCHelper.Connection)) 
     using (var reader = command.ExecuteReader(behavior)) 
     { 
      while (reader.Read()) 
      { 
       numRows++; 
      } 
     } 

     return numRows; 
    } 
2

Pour compter le nombre de lignes dans une table (par exemple le nom est studentTable), d'une part j'utiliser suivant l'instruction SQL:

SELECT COUNT(*) FROM studentTable 

J'utilise cette déclaration que le texte de commande pour l'objet MySqlCommand .

ensuite de connaître la valeur (le nombre de lignes) en utilisant un objet de MySqlDataReader (par exemple son nom est lecteur) J'utilise le code suivant:

reader.GetString(0); 

est Ci-dessous le code que j'utilise:

...    
MySqlConnection conn = new MySqlConnection(connString); 
MySqlCommand command = conn.CreateCommand(); 
command.CommandText = "SELECT COUNT(*) FROM studentTable"; 
try 
{ 
    conn.Open(); 
} 
catch (Exception ex) 
{ 
    label1.Content = ex.Message; 
} 

reader = command.ExecuteReader(); 
while (reader.Read()) 
{ 
    label1.Content = ""; 
    label1.Content = reader.GetString(0); 
} 

reader.Close(); 
conn.Close(); 
0

Es muy simple, le lecteur ne tiene pas l'optión de contánde filas existe, el Datable si tiene esa opción. En savoir plus sur les commentaires et les infos sur le lecteur de données sur les contacts avec lesquels vous pouvez communiquer (y compris les coordonnées complètes, les coordonnées et les coordonnées complètes).

String consulta = "SELECT * FROM xxx"; 
conexion.Open(); 
comando.CommandText = consulta; 

reader = command.ExecuteReader(); 

DataTable dt = new DataTable(); 
dt.Load(reader); 

int nrofilas = dt.Rows.Count; 

foreach (DataRow dr in dt.Rows) 
{ 
    var value = dr["nameField"]; 
} 
+0

Bienvenue dans Stack Overflow. Veuillez inclure quelques explications avec votre code (qu'avez-vous réparé? Où la question originale a-t-elle mal tourné?) Les réponses avec un code non mis en commentaire peuvent être marquées comme étant de mauvaise qualité et supprimées. – Graham

Questions connexes