2010-05-19 3 views
0

Update2 ok, j'ai pu le faire fonctionner, mais je pense qu'il ya un problème ayant deux datareaders différents whiles dans un autre. après le déplacer de l'extérieur tandis que dans une méthode cela fonctionne. L'exception de la première mise à jour était parce que je n'ai pas fermé le lecteur, donc il a ouvert trop de tables un JET s'est écrasé sur les 2048 tables ouvertes. Donc, mais je ne suis pas très satisfait du résultat, mais au moins les données sortent.problème continuer dans la boucle While dans les Try/Catch en C# (2.0)

Je pense que pour les besoins de MDB en C#, il est peut-être préférable d'utiliser le bon vieux ADODB COM Wrapper qui a fait ses preuves.

Merci à tous vos commentaires.

Mise à jour Après avoir déménagé dans une méthode que je reçois maintenant cette exception:

at System.Data.OleDb.OleDbConnectionInternal..ctor(OleDbConnectionString constr, OleDbConnection connection) 
    at System.Data.OleDb.OleDbConnectionFactory.CreateConnection(DbConnectionOptions options, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningObject) 
    at System.Data.ProviderBase.DbConnectionFactory.CreateNonPooledConnection(DbConnection owningConnection, DbConnectionPoolGroup poolGroup) 
    at System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection) 
    at System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory) 
    at System.Data.OleDb.OleDbConnection.Open() 
    at getMoney(String card, String field)Unspecified errorMicrosoft JET Database Engine 

Lorsque je tente d'utiliser dans mon ASPX page Web dans le Code Derrière:

try 
{     
    while() 
    { 
     ... 
     db.Open(); 
     readDataMoney = new OleDbCommand("SELECT * FROM Customer WHERE card = '" + customer.card + "';", db).ExecuteReader(); 
     while (readDataMoney.Read()) 
     { 
      try 
      { 
       if (!readDataMoney.IsDBNull(readDataMoney.GetOrdinal("Credit"))) 
       { 
        customer.credit = Convert.ToDouble(readDataMoney[readDataMoney.GetOrdinal("Credit")]); 
       } 
       if (!readDataMoney.IsDBNull(readDataMoney.GetOrdinal("Bonus"))) 
       { 
        customer.bonus = Convert.ToDouble(readDataMoney[readDataMoney.GetOrdinal("Bonus")]); 
       } 
      } 
      catch (Exception ex) 
      { 
       //Connector.writeLog("Money: " + ex.StackTrace + "" + ex.Message + "" + ex.Source); 
       customer.credit = 0.0; 
       customer.credit = 0.0; 
       continue; 
      } 
      finally { } 
     } 
     readDataMoney.Close(); 
     db.Close(); 
     ... 
    } 
} 
catch 
{ 
    continue; 
} 

La page entière se bloque s'il y a un problème lorsque la lecture de db ne fonctionne pas. J'ai essayé de vérifier! IsNull, mais le même problème. J'ai beaucoup de fichiers MDB différend à traiter, qui sont en lecture seule (ne peut pas réparer/compact) et certains ou d'autres pas. Même conception/disposition des tableaux. Avec le bon vieux ASP Classic 3.0 tous sont en cours de traitement avec le "On Resume Next". Je sais je sais. Mais c'est comme ça. Impossible de changer la source. Donc la question de base:

Alors est-il possible de dire à .NET de continuer la boucle quoi qu'il arrive dans la boucle d'essai s'il y a une exception?

Après beaucoup de temps wating je reçois ce exceptions:

at System.Data.Common.UnsafeNativeMethods.IDBInitializeInitialize.Invoke(IntPtr pThis) 
    at System.Data.OleDb.DataSourceWrapper.InitializeAndCreateSession(OleDbConnectionString constr, SessionWrapper& sessionWrapper) at System.Data.OleDb.OleDbConnectionInternal..ctor(OleDbConnectionString constr, OleDbConnection connection) 
    at System.Data.OleDb.OleDbConnectionFactory.CreateConnection(DbConnectionOptions options, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningObject) 
    at System.Data.ProviderBase.DbConnectionFactory.CreateNonPooledConnection(DbConnection owningConnection, DbConnectionPoolGroup poolGroup) 
    at System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection) 
    at System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory) 
    at System.Data.OleDb.OleDbConnection.Open() 
    at GetCustomer(String card)Thread was being aborted.System.Data 

et

System.Runtime.InteropServices.Marshal.ReadInt16(IntPtr ptr, Int32 ofs) 
System.Data.ProviderBase.DbBuffer.ReadInt16(Int32 offset) 
System.Data.OleDb.ColumnBinding.Value_I2() 
System.Data.OleDb.ColumnBinding.Value() 
System.Data.OleDb.OleDbDataReader.GetValue(Int32 ordinal) 
System.Data.OleDb.OleDbDataReader.get_Item(Int32 index) 
Thread was terminated.mscorlib 

Merci pour toute aide.

+0

Je pense que s'il y a un problème lors de la lecture du fichier de base de données, vous ne pourrez pas continuer la boucle while interne. Mais je ne suis pas sûr exactement quelle est votre question. Pourquoi avez-vous deux blocs d'essai? –

+0

le deuxième essayer/attraper était juste un essai mais il ne fait aucune différence s'il est là ou pas. ma première conjecture était aussi sur la boucle trop, qui peut continuer à s'appliquer à l'extérieur tandis que ça colle à l'intérieur, mais ce serait une erreur de conception de .net, ou? Je ne peux pas être coincé dans une boucle sans pouvoir continuer sur une exception. – csharpnoob

Répondre

0

On dirait qu'il est attrapant une exception sur le dernier enregistrement dans le fichier puis, parce que la fin de fichier a déjà été atteint, il ne cesse de lancer une exception et continue ing, encore et encore.

Je suppose que vous n'avez pas besoin de deux instructions continue, mais un seul (l'intérieur).

Vous devez réécrire ceci d'une manière que ne nécessite pas d'exception pour contrôler le flux du programme.

+0

oh, ça sonne bien, mais comment l'éviter ou le gérer. c'est seulement un ou aucun. L'identifiant de la carte est unique. – csharpnoob

+0

Vérifiez reader.IsEof ou une propriété similaire qui revient si la fin du fichier a été atteinte. –

+0

Essayez de supprimer à la fois les instructions 'continue' et 'try/catch', et voyez ce qui se passe. –

0

je remarquai que l'intérieur du bloc catch vous faites ceci:

Connector.writeLog(... 

Quelle classe est Connector, et que fait-il à l'intérieur writeLog? Tente-t-il d'écrire les informations d'erreur sur une table dans une base de données, ou écrit-il dans un fichier ou dans le journal des événements ou autre chose?

De plus, il s'agit probablement d'une faute de frappe, mais dans votre exemple de code, vous fermez une autre connexion (vsiDB) que celle que vous avez ouverte (db).

+0

Connector writeLog écrit seulement un fichier txt, la chose db est une erreur de copier-coller, la connexion est correcte. – csharpnoob

Questions connexes