Проблема с продолжением в цикле while в Try / Catch в C # (2.0) - PullRequest
0 голосов
/ 20 мая 2010

Update2 хорошо, я смог заставить его работать, но я думаю, что есть проблема с два разных datareaders в то время как внутри другого. после перемещения внешнего в то время как в методе это работает. Исключением из первого обновления было то, что я не закрывал читателя, поэтому он открыл слишком много таблиц, и JET потерпел крах на 2048 открытых таблицах. Но я не очень доволен результатом, но, по крайней мере, данные выходят.

Я думаю, что для целей MDB в C #, возможно, лучше использовать старый добрый ADODB COM Wrapper, который, как было доказано, выполняет свою работу.

Спасибо всем вашим комментариям.

Обновление После того, как я переместил его в метод, я получил это исключение:

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

Когда я пытаюсь использовать на своей веб-странице ASPX в коде:

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;
}

Вся страница зависает, если возникает проблема, когда чтение из БД не работает. Я пытался проверить на! IsNull, но та же проблема. У меня есть много разных MDB-файлов для обработки, которые доступны только для чтения (не удается восстановить / сжать) а некоторые или другие нет. Тот же дизайн / макет таблиц. Со старым добрым ASP Classic 3.0 все они обрабатываются с помощью «On Resume Next». Я знаю я знаю. Но так оно и есть. Не могу изменить источник. Итак, основной вопрос:

Так есть ли способ сообщить .NET продолжать цикл, что бы ни происходило внутри Попробуйте цикл, если есть какие-либо исключения?

После большого времени полива я получаю следующие исключения:

    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

и

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 

Спасибо за любую помощь.

Ответы [ 2 ]

0 голосов
/ 20 мая 2010

Я заметил, что внутри блока catch вы делаете это:

Connector.writeLog(...

Какой класс Connector и что он делает внутри writeLog? Пытается ли он записать информацию об ошибке в таблицу базы данных или записывает в файл, журнал событий или что-то еще?

Кроме того, это, вероятно, опечатка, но в своем примере кода вы закрываете другое соединение (vsiDB), чем открываемое вами (db).

0 голосов
/ 20 мая 2010

Похоже, что он перехватывает исключение в последней записи в файле, а затем, поскольку конец файла уже достигнут, он просто продолжает выдавать исключение и continue снова и снова.

Я подозреваю, что вам не нужны два оператора продолжения, а только одно (внутреннее).

Вы должны переписать это так, чтобы не требовало исключения для управления потоком программы.

...