ссылка на объект не установлена ​​для экземпляра объекта в наборе данных - PullRequest
2 голосов
/ 27 марта 2012

Я использую следующий код для заполнения набора данных

public static DataSet GetDataSetBySP(string spName)
    {
        try
        {
            using (SqlConnection conn = new SqlConnection(ConnString))
            {
                conn.Open();
                SqlCommand cmd = conn.CreateCommand();
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.CommandText = spName;
                cmd.CommandTimeout = 60;
                SqlDataAdapter da = new SqlDataAdapter(cmd);
                DataSet ds = new DataSet();
                da.Fill(ds);

                conn.Close();
                return ds;
            }
        }
        catch
        {
            return null;
        }
    }

в первый раз, когда я вызываю функцию, я получаю только первую таблицу, заполненную данными, и другие будут выглядеть так enter image description here

и ошибка в Data Visualizer похожа на

DataSet Visualizer

Unhandled exception has occurred in a component in your application.If you click Continue,the application will ignore this error and attempt to continue.

Object referance not set to an instance of an object


See the end of this message for details on invoking 
just-in-time (JIT) debugging instead of this dialog box.

************** Exception Text **************
System.NullReferenceException: Object reference not set to an instance of an object.
   at EnhancedDataSetVisualizer.VisualizerCommunicator.GetTableCellValue(Int32 rowIndex, Int32 colIndex)
   at EnhancedDataSetVisualizer.DataSetForm.dataGridView_CellValueNeeded(Object sender, DataGridViewCellValueEventArgs e)
   at System.Windows.Forms.DataGridView.OnCellValueNeeded(DataGridViewCellValueEventArgs e)
   at System.Windows.Forms.DataGridView.OnCellValueNeeded(Int32 columnIndex, Int32 rowIndex)
   at System.Windows.Forms.DataGridViewCell.GetValue(Int32 rowIndex)
   at System.Windows.Forms.DataGridViewCell.PaintWork(Graphics graphics, Rectangle clipBounds, Rectangle cellBounds, Int32 rowIndex, DataGridViewElementStates cellState, DataGridViewCellStyle cellStyle, DataGridViewAdvancedBorderStyle advancedBorderStyle, DataGridViewPaintParts paintParts)
   at System.Windows.Forms.DataGridViewRow.PaintCells(Graphics graphics, Rectangle clipBounds, Rectangle rowBounds, Int32 rowIndex, DataGridViewElementStates rowState, Boolean isFirstDisplayedRow, Boolean isLastVisibleRow, DataGridViewPaintParts paintParts)
   at System.Windows.Forms.DataGridViewRow.Paint(Graphics graphics, Rectangle clipBounds, Rectangle rowBounds, Int32 rowIndex, DataGridViewElementStates rowState, Boolean isFirstDisplayedRow, Boolean isLastVisibleRow)
   at System.Windows.Forms.DataGridView.PaintRows(Graphics g, Rectangle boundingRect, Rectangle clipRect, Boolean singleHorizontalBorderAdded)
   at System.Windows.Forms.DataGridView.PaintGrid(Graphics g, Rectangle gridBounds, Rectangle clipRect, Boolean singleVerticalBorderAdded, Boolean singleHorizontalBorderAdded)
   at System.Windows.Forms.DataGridView.OnPaint(PaintEventArgs e)
   at System.Windows.Forms.Control.PaintWithErrorHandling(PaintEventArgs e, Int16 layer, Boolean disposeEventArgs)
   at System.Windows.Forms.Control.WmPaint(Message& m)
   at System.Windows.Forms.Control.WndProc(Message& m)
   at System.Windows.Forms.DataGridView.WndProc(Message& m)
   at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
   at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
   at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)


************** Loaded Assemblies **************
mscorlib
    Assembly Version: 2.0.0.0
    Win32 Version: 2.0.50727.3053 (netfxsp.050727-3000)
    CodeBase: file:///C:/WINDOWS/Microsoft.NET/Framework/v2.0.50727/mscorlib.dll
----------------------------------------
Microsoft.VisualStudio.CommonIDE
    Assembly Version: 9.0.0.0
    Win32 Version: 9.0.30729.1
    CodeBase: file:///C:/WINDOWS/assembly/GAC_MSIL/Microsoft.VisualStudio.CommonIDE/9.0.0.0__b03f5f7f11d50a3a/Microsoft.VisualStudio.CommonIDE.dll
----------------------------------------
System.Windows.Forms
    Assembly Version: 2.0.0.0
    Win32 Version: 2.0.50727.3053 (netfxsp.050727-3000)
    CodeBase: file:///C:/WINDOWS/assembly/GAC_MSIL/System.Windows.Forms/2.0.0.0__b77a5c561934e089/System.Windows.Forms.dll
----------------------------------------
System
    Assembly Version: 2.0.0.0
    Win32 Version: 2.0.50727.3053 (netfxsp.050727-3000)
    CodeBase: file:///C:/WINDOWS/assembly/GAC_MSIL/System/2.0.0.0__b77a5c561934e089/System.dll
----------------------------------------
System.Drawing
    Assembly Version: 2.0.0.0
    Win32 Version: 2.0.50727.3053 (netfxsp.050727-3000)
    CodeBase: file:///C:/WINDOWS/assembly/GAC_MSIL/System.Drawing/2.0.0.0__b03f5f7f11d50a3a/System.Drawing.dll
----------------------------------------
System.Configuration
    Assembly Version: 2.0.0.0
    Win32 Version: 2.0.50727.3053 (netfxsp.050727-3000)
    CodeBase: file:///C:/WINDOWS/assembly/GAC_MSIL/System.Configuration/2.0.0.0__b03f5f7f11d50a3a/System.Configuration.dll
----------------------------------------
System.Xml
    Assembly Version: 2.0.0.0
    Win32 Version: 2.0.50727.3053 (netfxsp.050727-3000)
    CodeBase: file:///C:/WINDOWS/assembly/GAC_MSIL/System.Xml/2.0.0.0__b77a5c561934e089/System.Xml.dll
----------------------------------------
Microsoft.VisualStudio.DebuggerVisualizers
    Assembly Version: 9.0.0.0
    Win32 Version: 9.0.30729.1
    CodeBase: file:///C:/WINDOWS/assembly/GAC_MSIL/Microsoft.VisualStudio.DebuggerVisualizers/9.0.0.0__b03f5f7f11d50a3a/Microsoft.VisualStudio.DebuggerVisualizers.dll
----------------------------------------
Microsoft.VisualStudio.Debugger.DataSetVisualizer
    Assembly Version: 9.0.0.0
    Win32 Version: 9.0.30729.1
    CodeBase: file:///C:/Program%20Files/Microsoft%20Visual%20Studio%209.0/Common7/Packages/Debugger/Visualizers/Microsoft.VisualStudio.Debugger.DataSetVisualizer.dll
----------------------------------------
System.Data
    Assembly Version: 2.0.0.0
    Win32 Version: 2.0.50727.3053 (netfxsp.050727-3000)
    CodeBase: file:///C:/WINDOWS/assembly/GAC_32/System.Data/2.0.0.0__b77a5c561934e089/System.Data.dll
----------------------------------------

************** JIT Debugging **************
To enable just-in-time (JIT) debugging, the .config file for this
application or computer (machine.config) must have the
jitDebugging value set in the system.windows.forms section.
The application must also be compiled with debugging
enabled.

For example:

<configuration>
    <system.windows.forms jitDebugging="true" />
</configuration>

When JIT debugging is enabled, any unhandled exception
will be sent to the JIT debugger registered on the computer
rather than be handled by this dialog box.

Может кто-нибудь сказать мне, почему я вижу это?Но во второй раз, когда я обновляю свою страницу aspx, я получаю все таблицы с правильными данными.

заранее спасибо

Новое редактирование

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

Последнее обновление

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

Ответы [ 3 ]

0 голосов
/ 27 марта 2012

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

    catch
    {
        return new DataSet();
    }

или даже лучше, я бы сделал какое-нибудь событие Error, которое показало бы какое-нибудь сообщение с ошибкой.

    catch(Exception exc)
    {
        Error(exc);
        return new DataSet();
    }
0 голосов
/ 27 марта 2012

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

catch
{
    return null;
}

Это означает, что что бы ни пошло не так , вы проигнорируете проблему (даже не войдя в нее) и простовернуть ноль.Все, что пытается использовать возвращаемое значение без проверки на нулевое значение, выдаст исключение, которое вы показали.

Вы должны никогда не иметь такого рода обработчика "catch all and ignore".Если вы действительно хотите перехватить все исключения (что может быть разумно в корне стека вызовов), то вы должны всегда регистрировать исключение - и в этот момент вам не нужно больше пытаться выполнять работу.

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

Я бы призываю вас не возвращать пустое DataSet либо - я бы сказал, что, вероятно, просто неуместно иметь здесь какую-либо «обработку» ошибок, поскольку вы действительно не знаете, как ее обрабатывать.

0 голосов
/ 27 марта 2012

По-видимому, существует высокая вероятность возникновения исключения, и поскольку у вас есть ...

     catch
    {
        return null;
    }

Пользовательский интерфейс не может отобразить нулевой набор данных.Я рекомендую проверить, возникает ли исключение, и если это так, посмотрите на его сообщение, чтобы увидеть, есть ли проблема с подключением к БД или заполнением DataSet записями.

РЕДАКТИРОВАТЬ

Поскольку выconfrm нет исключений в блоке catch, я быстро осмотрелся и могла возникнуть проблема с Visual Studio.На форуме MSDN запись выглядит так же.

Существует также проблема подключения, зарегистрированная , и они говорят, что проблема исправлена ​​в Visual Studio 2010, вы можете воспроизвести ее в 2010 году (если у вас есть доступ к ней?)

...