0

タイトルで述べたように、外部リストを介してMSSQL08ストアドプロシージャからデータを取得しようとしています。私のマシンにはMicrosoftOffice2010がインストールされていないため、IEntityを使用してレコードをフィルタリングおよび取得できませんでした。フィルタクラスはMicrosoft.Office.BusinessData.dllに保持されていると思います。外部リストを使用してデータのフィルタリングと取得を実行するように制限します。

SharePointDesignerによって作成された外部リストは完全に機能します。ビュー設定で定義されたデータソースフィルターを編集することで、ストアドプロシージャを表示およびフィルター処理できます。

ただし、私の要件は、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();
}

ただし、上記のアプローチでは、リストから列名を取得することしかできません。データがリストから取得されていないようです。

したがって、2番目の試みは、昇格されたアクセス許可でコードを実行することでした。

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を介してストアドプロシージャからアイテムを取得した経験はありますか?または、異なる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の下にあります。

フィルタリングは、通常の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と直接通信するため、外部リストを作成する必要はありません。

また、テーブルまたはストアドプロシージャの両方で機能します

適切なAPIを見つけるためにAPIをもう一度検索するようにヒントを与えてくれたmsdn[1]に特に感謝します[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 に答える