我最近在远程服务器上放置了一个Web应用程序进行测试。此应用程序使用一系列SQL Server(Express)数据库来保存卡和用户信息,其中所有信息都链接到我的主数据库。我的web.config文件中引用了该数据库。
我从我的数据库中创建了.bak文件并在我的服务器上恢复它们,连接字符串现在显示:
<add key="ConnectionString" value="server=localhost; database=DatabaseMaster; uid=...; pwd=..."/>
在我的本地计算机上,应用程序很好,没有例外。但是,在通过Web服务器连接到我的应用程序并尝试从我的卡表中检索数据时,会抛出NullReferenceException错误。我已经通过以下代码中的断点检查了我的代码:
private void FillGrid()
{
DataSet ds = new DataSet();
//get data from session
ds = (DataSet)SessionNavigator.GetDataFromCurrentPage
(PageParams.Customer.DataCards);
if (ds != null)
{
DataView dv = ds.Tables["Cards"].DefaultView;
gridCtrl.RowsCount = dv.Count;
gridCtrl.BindGrid(dv);
}
}
我的检查发现DataSet ds确实不是null,实际上似乎应用程序没有识别表“Cards”,没有引用表中对象的实例。
令人困惑的是,其他表(例如用户)在服务器上没有任何问题。此外,操作与卡对象相关的数据(例如进行事务和更改点值)将反映在SQL Server Management Studio中。
我对SQL Server缺乏经验,所以我可能错了,但我不认为它与数据库本身有任何关系。
那么,在设置导致这些问题的应用程序时,我可能会错过任何明显的步骤吗?如果是,您是否可以推荐任何参考资料?
编辑:在通过PageParams Enumerable搜索并仔细查看ds数据集之后,我发现ds不是null但是值为{System.Data.DataSet},其中包含System.Data.DataTableCollection和一个大小列表0
答案 0 :(得分:2)
找到答案!在调试FillGrid方法时搜索我的输出,我找到了这个小行:
System.Data.SqlClient.SqlException: SQL Server blocked access to STATEMENT 'OpenRowset/OpenDatasource' of component 'Ad Hoc Distributed Queries' because this component is turned off as part of the security configuration for this server. A system administrator can enable the use of 'Ad Hoc Distributed Queries' by using sp_configure. For more information about enabling 'Ad Hoc Distributed Queries', see "Surface Area Configuration" in SQL Server Books Online
之后,只是通过SQL Server Management Studio中的sp_configure允许Ad Hoc Distributed Queries的一个简单案例,完全解决了这个问题。这解释了为什么我的应用程序本地副本工作正常但服务器在检索相关数据卡时遇到问题。
答案 1 :(得分:0)
可能只是表的名称没有从源读取,而且它在数据集中只是被称为“Table1”。
您是否尝试过查看数据集的实际内容?