Странное исключение NullReferenceException на ExecuteReader

когда я пытаюсь выполнить следующий код, в ExecuteReader возникает исключение NullReferenceException:

static public IDataReader executeReader(string query, string connectionString, string databaseType)
    {
        switch(databaseType)
        {               
            case "SqlServer":
                //stuff for Sql Server      
            case "DB2":
                iDB2Connection myConnectionDB2 = new iDB2Connection(connectionString);

                iDB2Command sqlCommandDB2 = new iDB2Command(query,  myConnectionDB2);
                sqlCommandDB2.CommandTimeout=0;
                try
                {                       
                    sqlCommandDB2.Connection.Open();
***The exception is raised here...***
                    return sqlCommandDB2.ExecuteReader(CommandBehavior.CloseConnection);
                }
                catch (Exception e)
                {
                    sqlCommandDB2.Dispose();
                    myConnectionDB2.Close();
                    throw new Exception("Error in DBHelper:ExeSQL()-> " + e.ToString());
                }       
            default:
                //stuff for Oracle
        }                           
    }

Вот исключение сообщения:

System.NullReferenceException: ссылка на объект не относится к определенному экземпляру объекта. в Microsoft.Win32.Win32Native.CopyMemoryUni (StringBuilder pdst, IntPtr psrc, IntPtr sizetcb) в System.Runtime.InteropServices.Marshal.PtrToStringUni (IntPtr ptr) в IBM.Data.DBHoldecol.by строка выше.

Каждый параметр заполнен, запрос выполняется правильно с SQL-представлением, строка подключения правильная и тип базы данных в порядке ... Как и любой статический метод, ничего больше не нужно устанавливать ... я уверен, что это что-то глупое , но не могу понять что.


person gobes    schedule 08.08.2011    source источник
comment
Где вы устанавливаете переменную sql? Вы хотели использовать переменную query, переданную в функцию?   -  person George Johnston    schedule 08.08.2011
comment
Судя по трассировке стека, это может быть проблема библиотеки (IBM.Data.DB2.iSeries), если ваш sql установлен и действителен, как отмечает Питер выше.   -  person Dan Abramov    schedule 08.08.2011
comment
Драйверы iSeries иногда могут быть действительно странными. Сделайте так, чтобы вы были исправлены и обновлены. У нас было много подобных проблем, прежде чем мы узнали, что у нас есть пара обновлений.   -  person asawyer    schedule 08.08.2011
comment
Моя dll iSeries - V5R3, я пробую обновить до V5R4 ... Я дам вам знать.   -  person gobes    schedule 08.08.2011
comment
Похоже, что провайдер данных IBM.Data.DB2.iSeries падает очень некрасиво при копировании строки Unicode из некоторой памяти в IntPtr psrc в StringBuilder pdst. Эта строка будет содержать столько байтов, сколько число, на которое указывает IntPtr sizetcb. Я предполагаю, что построитель строк не был создан. Либо вам нужно вызвать поставщика данных DB2 по-другому, либо получить другую версию, которая работает более элегантно.   -  person Jodrell    schedule 08.08.2011
comment
Подождите немного, и вы сможете ответить на свой вопрос (и я проголосую за ответ).   -  person John Saunders    schedule 08.08.2011


Ответы (1)


Блин, обновление с V5R3 до V5R4 устранило ошибку. Простое 15-минутное обновление решило 3 дня головокружения. Рад внести свой вклад :)

person gobes    schedule 09.08.2011
comment
Эти водители могут делать множество других странных вещей, которые мне могут поверить. Лично мне больше всего нравится, когда оценщик решает, что ваш запрос может работать дольше тайм-аута, поэтому он просто немедленно возвращается, ничего не выполняя, но без ошибок или исключений. Просто пустой набор данных. - person asawyer; 09.08.2011
comment
О, и похоже, что последняя версия (я надеюсь) - V6R1M0. - person asawyer; 09.08.2011
comment
ИМО, DB2 сама по себе большая фигня. Мы обновимся до V6, когда все наши серверы будут готовы, то есть, возможно, в декабре. Или в следующем году. - person gobes; 10.08.2011