Извлечение SPListItem через внешний список, источник которого взят из хранимой процедуры SQL Server 08

Как упомянуто в заголовке, я пытаюсь получить данные из хранимой процедуры 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? Или есть более эффективные способы извлечения данных из хранимых процедур без повторения всех кодов в разных веб-частях?

--------------- Редактировать 5 октября -------------------------------

Я решил попробовать выполнить хранимую процедуру напрямую, а не через bcs. Но так как некоторые хранимые процедуры довольно часто используются. Можно ли поделиться этим фрагментом кода, чтобы его можно было повторно использовать в разных веб-частях?

-------------- Редактировать 5 октября + 4 часа ---------------------

Я понимаю, что если я укажу значение по умолчанию для фильтра в операции чтения списка ECT. Я мог бы получить элемент в списке через: SPList.getItems(SPView); Теперь возникает вопрос, как изменить фильтр программно. Я пытался использовать SPView.Method, чтобы изменить значение по умолчанию. Однако, похоже, это работает.

 <Method Name="getTeam">" 
    <Filter Name="code" Value="2"/>"
    </Method> 

2 ответа

Решение

Извините, ребята, я понимаю, что сама sharepoint предоставляет API для классов фильтрации. находится под Microsoft.Sharepoint.Businessdata.runtime;

Классы фильтрации обычный ComparisonFilter, лимитный фильтр и т. Д.

код для фильтрации внешнего источника выглядит примерно так

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();
}
Другие вопросы по тегам