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.
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? –
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