Пустое исключение во время GetValues ​​ODBCDataReader - PullRequest
0 голосов
/ 18 ноября 2010

Кажется, мне повезло столкнуться с забавными проблемами при развертывании моего программного обеспечения .

Настройка:

  • Windows 2000 Prof.
  • .NET 2.0 Application
  • Подключение к MySQL 5.0 через ODBCConnection с использованием MySQL ODBC-Connector 3.51.26

Я развертывал свое приложение, когда выполнял это исключение:

at System.Data.Odbc.OdbcConnection.HandleError(OdbcHandle hrHandle, RetCode retcode)
at System.Data.Odbc.OdbcDataReader.GetData(Int32 i, SQL_C sqlctype, Int32 cb, Int32& cbActualOut)
at System.Data.Odbc.OdbcDataReader.internalGetString(Int32 i)
at System.Data.Odbc.OdbcDataReader.GetValue(Int32 i, TypeMap typemap)
at System.Data.Odbc.OdbcDataReader.GetValue(Int32 i)
at System.Data.Odbc.OdbcDataReader.GetValues(Object[] values)
at MyAppl.UninterestingStackTace.StartsHere()

Да, это только трассировка стека ... потому что нет сообщения об исключении, также нет и InnerException (я также регистрирую их с момента моего последнего обращения), это все, что я получил.

Код выглядит следующим образом:

// DtRdr is a passed in ODBCDataReader
if (DtRdr != null && !DtRdr.IsClosed)
{
    Object[] buffer = new Object[DtRdr.FieldCount];

    while (DtRdr.Read())
    {
        DtRdr.GetValues(buffer); // Here happens the exception

        // Modify buffer and use it
    }
}

Это происходит только на этом компьютере, извлеченные данные / база данных хороши (проверено на другом компьютере в той же сети, и я также проверил это локально на своем компьютере).dev-machine) и, конечно, он не воспроизводится ни на одной другой машине.

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

Я написал быстрое и простое тестовое приложение, которое выдает ту же ошибку, но также выводит следующий оператор после завершения:

Error in my_thread_global_end(): 1 threads didn't exit

Я не уверен, связано ли это или нет, извините за путаницу.

Я снова потерян ... Кто-нибудь видел что-то подобное раньше?

Редактировать: Вот мое тестовое приложение:

using System;
using System.Data;
using System.Data.Odbc;

namespace ODBCTest
{
    class MainClass
    {
        public static void Main (string[] args)
        {
            try {
                Console.WriteLine ("Creating connection...");
                using (OdbcConnection conn = new OdbcConnection ("ConnStringHere")) {
                    conn.Open ();
                    Console.WriteLine ("Creating command...");
                    using (OdbcCommand cmd = conn.CreateCommand ()) {
                        cmd.CommandText = "SimpleSelectHere;";

                        Console.WriteLine ("Creating reader...");
                        using (OdbcDataReader rdr = cmd.ExecuteReader ()) {
                            if (rdr != null && !rdr.IsClosed) {
                                while (rdr.Read ()) {
                                    object[] temp = new object[rdr.FieldCount];
                                    rdr.GetValues (temp);
                                }

                                Console.WriteLine ("Seems to work fine.");
                            } else {
                                Console.WriteLine ("Could not create reader!");
                            }
                        }
                    }
                }
            } catch (Exception ex) {
                Console.WriteLine (ex.Message);
                Console.WriteLine (ex.StackTrace);
                Console.WriteLine ();
                if (ex.InnerException != null)
                {
                    Console.WriteLine (ex.InnerException.Message);
                    Console.WriteLine (ex.InnerException.StackTrace);
                } else {
                    Console.WriteLine("No InnerException.");
                }
            }

            Console.ReadKey ();
        }
    }
}

И его вывод:

Creating connection...
Creating command...
Creating reader...

   at System.Data.Odbc.OdbcConnection.HandleError(OdbcHandle hrHandle, RetCode retcode)
   at System.Data.Odbc.OdbcDataReader.GetData(Int32 i, SQL_C sqlctype, Int32 cb, Int32& cbActualOut)
   at System.Data.Odbc.OdbcDataReader.internalGetString(Int32 i)
   at System.Data.Odbc.OdbcDataReader.GetValue(Int32 i, TypeMap typemap)
   at System.Data.Odbc.OdbcDataReader.GetValue(Int32 i)
   at System.Data.Odbc.OdbcDataReader.GetValues(Object[] values)
   at ODBCTest.MainClass.Main(String[] args)

No InnerException.
<At this point I hit a key>
Error in my_thread_global_end(): 1 threads didn't exit

Ответы [ 2 ]

3 голосов
/ 18 ноября 2010

Будь я проклят!Это ошибка в MDAC 2.7 , установка 2.8 (или исправление) исправляет это.

И сообщение об ошибке потока является ошибкой в ​​ используемом MySQL ODBC-Connector.

0 голосов
/ 20 июня 2017

Я также наблюдал эту проблему в MDAC 2.6 SP2 при работе с Sybase DB, в моем случае помогла установка версии 2.8 SP1.

...