0

正如标题中提到的,我正在尝试通过外部列表从 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> 
4

2 回答 2

2

抱歉,我意识到 sharepoint 本身为过滤类提供了 API。在 Microsoft.Sharepoint.Businessdata.runtime 下;

过滤类通常是比较过滤器、限制过滤器等。

过滤外部源的代码看起来像

const string entityName = "Name of internal name of the entity";
const string systemName = "name of the external system";
const string nameSpace = "name space of ect";

BdcService bdcservice = SPFarm.Local.Services.GetValue<BdcService>();
IMetadataCatalog catalog = bdcservice.GetDatabaseBackedMetadataCatalog(SPServiceContext.Current);
ILobSystemInstance lobSystemInstance = catalog.GetLobSystem(systemName).GetLobSystemInstances()[systemName];
IEntity entity = catalog.GetEntity(nameSpace, entityName);
IFilterCollection filters = entity.GetDefaultFinderFilters();
ComparisonFilter filter= (ComparisonFilter)filters[0];
IEntityInstanceEnumerator enumerator = entity.FindFiltered(filters, lobSystemInstance);
displayTable = entity.Catalog.Helper.CreateDataTable(enumerator);

这段代码直接与 ECT 通信,因此无需创建外部列表。

它也适用于表或存储过程

特别感谢 msdn[1] 提示我再次通过 api 搜索以找到合适的 api [1] http://msdn.microsoft.com/en-us/library/ff798510.aspx

于 2011-10-06T02:53:09.820 回答
1

您可以尝试这种方法并验证它是否有效(我有类似的问题,但是我没有使用存储过程)

using(var web = SPContext.Current.Web)
{
    var list = web.Lists[contextList.ID];
    var query = list.Views[contextView.ID].Query;

    var items = list.GetItems(new SPQuery() { Query = query});

    gridview1.DataSource = items.GetDataTable();
    gridview1.DataBind();
}
于 2011-10-04T12:51:43.980 回答