正如标题中提到的,我正在尝试通过外部列表从 MSSQL 08 存储过程中检索数据。由于我的机器没有安装 Microsoft Office 2010,我无法使用 IEntity 过滤和检索我的记录;我相信过滤器类保存在 Microsoft.Office.BusinessData.dll 中。限制我使用外部列表来执行数据的过滤和检索。
SharePoint Designer 创建的外部列表完美运行;我可以通过编辑视图设置中定义的数据源过滤器来查看和过滤存储过程。
但是我的要求是以编程方式过滤和检索 C# 中的项目。所以我的第一次尝试只是使用 SPList.GetItems(SPView) 方法查询外部列表。
using (SPWeb web = SPContext.Current.Web){
SPList list = web.Lists[contextList.ID];
SPView view = list.Views[contextView.ID];
SPListItemCollection items = list.GetItems(view);
gridview1.DataSource = items.GetDataTable();
gridview1.Databind();
}
但是,上述方法只能从列表中获取列名。似乎没有从列表中检索到数据。
所以我的第二次尝试是以提升的权限运行代码。
SPSite contextSite = SPContext.Current.Site;
SPWeb contextWeb = SPContext.Current.Web;
SPList contextList = contextWeb.Lists[listName];
SPView contextView = contextList.Views[0];
SPSecurity.RunWithElevatedPrivileges(delegate()
{
using (SPSite site = new SPSite(contextSite.ID))
using (SPWeb web = site.OpenWeb(contextWeb.ID))
{
SPList list = web.Lists[contextList.ID];
SPView view = list.Views[contextView.ID];
SPListItemCollection items = list.GetItems(view);
gridview1.DataSource = items.GetDataTable();<br/>gridview1.Databind();
}
});
使用第二种方法,我面临“未经授权的许可”异常。
我很困惑为什么我会面临这个问题。你们有通过 SharePoint BCS 从存储过程中检索项目的经验吗?或者有没有更好的方法从存储过程中提取数据,而无需在不同的 Web 部件中重复所有代码?
--------------- 10 月 5 日编辑 -------------------------------
我决定尝试直接执行存储过程,而不是通过 bcs。但是作为一些存储过程还是比较常用的。是否可以共享这段代码,以便在不同的 Web 部件之间重复使用?
-------------- 编辑 10 月 5 日 + 4 小时 ---------
我意识到,如果我在 ECT 的读取列表操作中为过滤器指定默认值。我将能够通过以下方式检索列表中的项目:SPList.getItems(SPView); 现在的问题变成了如何以编程方式更改过滤器。我尝试使用 SPView.Method 来更改默认值。然而,这似乎确实有效。
<Method Name="getTeam">"
<Filter Name="code" Value="2"/>"
</Method>