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

Как уже упоминалось в заголовке, я пытаюсь получить данные из хранимой процедуры 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();
}
});

Используя 2-й подход, я столкнулся с исключением "несанкционированного разрешения".

Я совершенно не понимаю, почему я сталкиваюсь с этой проблемой. Ребята, есть ли у вас опыт извлечения элементов из хранимых процедур через SharePoint BCS? Или есть более эффективные способы извлечения данных из хранимых процедур без повторения всех кодов в разных веб-частях?

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

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

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

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

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

Ответы [ 2 ]

2 голосов
/ 06 октября 2011

Извините, ребята, я понимаю, что сама 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);

Этот фрагмент кода связывается напрямую с ДЭХ, поэтому нет необходимости создавать внешний список.

Также это будет работать как для таблицы, так и для хранимой процедуры.

. Особая благодарность msdn [1] за подсказку, что я снова ищу поиск по API, чтобы найти соответствующий API [1] http://msdn.microsoft.com/en-us/library/ff798510.aspx

1 голос
/ 04 октября 2011

Вы можете попробовать этот подход и проверить, работает ли он или нет (у меня была похожая проблема, однако я не использовал хранимые процедуры)

...