在C#(2.0)中的Try / Catch中的While循环中继续问题

时间:2010-05-19 22:25:52

标签: asp.net c#-2.0 try-catch

UPDATE2 好吧,我能够让它工作,但我认为有一个问题 另外两个不同的数据管理器。搬出去之后 在它工作的方法中的外部。第一次更新的例外是因为我没有关闭阅读器,所以它打开了太多的表,JET在2048个开放表上崩溃了。所以,但我对结果不是很满意,但至少数据出来了。

我认为对于C#中的MDB目的而言,最好使用已经证明可以完成它的旧的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;
}

如果从db读取的数据不起作用时出现问题,则整个页面会挂起。 我试图检查!isNull,但同样的问题。 我有很多不同的MDB文件要处理,这些只是readonly(无法修复/压缩) 还有一些或其他没有。相同的表格设计/布局。用旧的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 :(得分:0)

看起来它正在文件中的最后一条记录上捕获异常然后,因为已经到达文件结尾,它只是一遍又一遍地抛出异常和continue

我怀疑你需要两个继续语句,但只有一个(内部语句)。

您应该以不需要例外来控制程序流的方式重写它。

答案 1 :(得分:0)

我注意到你在catch区域内执行此操作:

Connector.writeLog(...

什么类是Connector,它在writeLog内做了什么?它是否尝试将错误信息写入数据库中的表,还是写入文件或事件日志或其他内容?

此外,这可能是一个拼写错误,但在您的代码示例中,您关闭的是与您打开的连接(vsiDB)不同的连接(db)。