如标题所述,我试图通过外部列表从MSSQL 08存储过程检索数据。由于我的机器没有安装Microsoft Office 2010,我无法使用IEntity来过滤和检索我的记录;我相信过滤器类保存在Microsoft.Office.BusinessData.dll中。限制我使用外部列表来执行数据的过滤和检索。
由SharePoint设计器创建的外部列表工作完美;我可以通过编辑视图设置中定义的数据源筛选器来查看和筛选存储过程。
然而,我的要求是在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 . getiitems (SPView);现在的问题是如何以编程方式更改过滤器。我尝试使用SPView。方法,修改默认值。然而,这似乎确实有效。
<Method Name="getTeam">"
<Filter Name="code" Value="2"/>"
</Method>
对不起,我意识到sharepoint本身为过滤类提供了API。
过滤类通常是ComparisonFilter, limit filter等
过滤外部源的代码看起来像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
您可以尝试这种方法并验证它是否有效(我有一个类似的问题,但我没有使用存储过程)
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();
}