对象引用未设置为数据集中对象的实例
Posted
技术标签:
【中文标题】对象引用未设置为数据集中对象的实例【英文标题】:object reference not set to an instance of an object In dataset 【发布时间】:2012-04-10 15:35:55 【问题描述】:我正在使用下面的代码来填充数据集
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;
在我第一次调用函数时,我只得到第一个填充数据的表,其他的看起来像这样
数据可视化器中的错误就像
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 页面时,我得到了所有带有正确数据的表格。
提前致谢
新编辑
大家好,感谢您的快速回复。 但我在 catch 中没有收到任何错误。数据集完全填充成功,即使第一个表的数据我得到了正确的,但其余 2 个表我发现这个异常不是代码。
最新更新
我还在另一项测试中发现,Dataset Visualizer 没有显示那个数据表。它包含记录/表,但仍然显示上述一个错误。可能是由于某些问题
【问题讨论】:
at EnhancedDataSetVisualizer.VisualizerCommunicator.GetTableCellValue
摆脱邪恶空catch
块。
What is a NullReferenceException in .NET? 的可能重复项
如何绑定datagridview?
Özgür Kara,在这个数据集中,我得到了 3 个表,首先我直接绑定到 Repeater
,其余数据将绑定到转发器控件的 ItemDataBound
事件。
【参考方案1】:
猜测,很有可能发生了异常,因为你有......
catch
return null;
UI 无法呈现空数据集。我建议检查是否引发了异常,如果是,请查看其消息以查看连接数据库或使用记录填充 DataSet 是否存在问题。
编辑
既然你确认了 catch 块中没有异常,我快速浏览了一下,Visual Studio 可能存在问题。有一个MSDN forum entry 看起来像同样的问题。
还有一个connect issue logged,他们说这个问题在 Visual Studio 2010 中得到了解决,你能在 2010 年重现这个问题吗(如果你可以访问它?)
【讨论】:
【参考方案2】:我的猜测是与此有关:
catch
return null;
这意味着无论出现什么问题,您都会忽略问题(甚至不记录它)并返回 null。任何尝试使用返回值而不检查是否为空的东西都会给出您显示的异常。
你不应该永远拥有这种“捕获所有并忽略”处理程序。如果您真的想捕获所有异常(这在调用堆栈的根部可能是合理的),那么您应该始终记录异常 - 此时您不应该再尝试做任何事情工作。
在这种情况下,您可能应该有一个异常处理程序更高,但根本不在这里捕获异常 - 让它在堆栈中冒泡,但通过中止处理更高级别的异常当前用户操作。假装没有出错,但给出一个目前显然无法处理的返回值,这不是一个好主意。
我会敦促你不要返回一个空的DataSet
- 我会说在这里“处理”任何错误可能是不合适的,因为你真的不知道如何处理它。
【讨论】:
【参考方案3】:您是否在检查返回值是否不为空?您的函数中可能有一些例外。我会将捕获部分重新制作为
catch
return new DataSet();
或者更好的是,我会做一些错误事件来显示一些带有错误的消息框。
catch(Exception exc)
Error(exc);
return new DataSet();
【讨论】:
以上是关于对象引用未设置为数据集中对象的实例的主要内容,如果未能解决你的问题,请参考以下文章
Blazor Webassembly:对象引用未设置为对象 i 的实例