ASP.NET远程开发连生产库遇空引用错误,如何等待SQL查询完成?
我的ASP.NET应用在部署服务器上运行正常,但从远程开发计算机连接生产数据库时,出现**"Object reference not set to an instance of an object"**错误。我推测这是由于填充下拉框的SQL查询或填充网格的子程序未及时返回,导致页面渲染未等待其完成。
涉及SQL查询的子程序有:FillGridOnLoad()、FillAseguradoraDropdownList() 和 FillDoctorDropdownList()。
我想在页面渲染时加入等待逻辑,等这些SQL查询子程序执行完成后再继续,请问这是否可行?若可行,应在何处插入等待逻辑?
相关代码片段如下:
Partial Class all orders Inherits System.Web.UI.Page Protected Sub gridOrdenes_PageIndexChanged(sender As Object, e As EventArgs) Handles gridOrdenes.PageIndexChanged gridOrdenes.AllowPaging = True End Sub Protected Sub gridOrdenes_PageIndexChanging(sender As Object, e As GridViewPageEventArgs) Handles gridOrdenes.PageIndexChanging gridOrdenes.PageIndex = e.NewPageIndex FillGridOnLoad() End Sub Protected Sub Page_Load(sender As Object, e As EventArgs) Handles Me.Load
...部分身份验证等代码...以下是代码最后部分:
If Not IsPostBack Then FillGridOnLoad() '填充实验室下拉框 Dim laboratorios As New laboratorios dropLaboratorio.DataSource = laboratorios.fetch_all() dropLaboratorio.DataTextField = "laboratorio" dropLaboratorio.DataValueField = "idLaboratorio" dropLaboratorio.DataBind() dropLaboratorio.Items.Insert(0, "") FillAseguradoraDropdownList() FillDoctorDropdownList() End If End Sub
无需额外添加等待逻辑
当前Page_Load中的代码均为同步执行,FillGridOnLoad()、FillAseguradoraDropdownList()等方法会按顺序执行,前一个方法执行完毕后才会启动下一个,页面渲染本身会等待所有同步方法完成后再进行。你推测的“页面未等待查询完成就渲染”不成立,无需额外添加等待逻辑。空引用错误的真实原因
出现**"Object reference not set to an instance of an object"**错误,主要是以下几种情况:
- 远程开发机连接生产数据库时,网络延迟、权限不足或SQL语句执行失败,导致查询返回null数据源,后续代码直接调用该数据源的属性/方法;
- 页面控件(如
dropAseguradora、dropDoctor)在远程环境中未正确初始化,绑定数据时引用了空对象; laboratorios.fetch_all()或其他查询方法在远程连接时抛出异常,导致数据源未被正确赋值,触发后续DataBind()操作报错。
- 具体排查方案
- 给三个查询方法添加
try-catch块,捕获并输出异常详情,排查是否存在数据库连接失败、权限不足等问题; - 在每个查询方法执行后,检查返回的数据源是否为null,若为空则添加兜底处理(比如绑定空集合);
- 验证远程开发机的数据库连接字符串是否正确,确认开发机具备访问生产数据库的权限;
- 开启调试模式逐行执行代码,定位触发空引用错误的具体代码行。
- 异步场景下的处理(若适用)
如果FillGridOnLoad()等方法是异步实现的,需将Page_Load改为异步方法,并使用Await等待每个异步方法完成:
Protected Async Sub Page_Load(sender As Object, e As EventArgs) Handles Me.Load '...身份验证代码... If Not IsPostBack Then Await FillGridOnLoadAsync() Await FillAseguradoraDropdownListAsync() Await FillDoctorDropdownListAsync() '其他绑定代码... End If End Sub
同时需在ASPX页面中设置Async="true":
<%@ Page Async="true" ... %>
但从当前代码来看,所有方法均为同步执行,优先排查前面提到的空引用问题即可。
内容的提问来源于stack exchange,提问作者Adalberto Hernandez Vega

