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
Спасибо за любую помощь.