2011-03-22 10 views
0

私はC#とSharepointの両方がかなり新しいです。予期せぬ動作をする非常に基本的なコードを持っています。私は明らかにここでの基本的なトラブルシューティングのスキルのいくつかが欠けていて、誰かが私を正しい方向に向けることができればと思っていました。Sharepoint 2010アプリケーションページの問題

ボタンとラベルが1つのアプリケーションページがあります。私はちょうどうまく動作する外部リストからいくつかの情報を取得するために、ページのロードイベントで少しのコードを持っています。私はエラーを返すボタンのコードの正確なコピーを持っています。私はpageloadイベントの同じコードがうまくやっているように見えるときにボタンがエラーを返す理由を知りたいと思います。

C#コード:

using System; 
using Microsoft.SharePoint; 
using Microsoft.SharePoint.WebControls; 
using System.Text; 

namespace farmBDCProj2.Layouts.farmBDCProj2 
{ 
    public partial class TestGetInfo : LayoutsPageBase 
    { 
     protected void Page_Load(object sender, EventArgs e) 
     { 
      StringBuilder output = new StringBuilder(); 
      output.Append("<h2>Generated by PageLoad event</h2>"); 
      SPContext context = SPContext.Current; 
      using(SPSite site = context.Site) 
      using (SPWeb web = site.AllWebs["BDC_SQL"]) 
      { 
       SPList list = web.Lists["BDC_SQL"]; 
       foreach (SPListItem item in list.Items) 
       { 
        output.AppendFormat("<br>item: {0}", item["ADName"]); 
       } 
      } 
      Label1.Text = output.ToString(); 
     } 

     public void btn_click(object sender, EventArgs e) 
     { 
      StringBuilder output = new StringBuilder(); 
      output.Append("<h2>Generated by button click event</h2>"); 
      SPContext context = SPContext.Current; 
      using (SPSite site = context.Site) 
      using (SPWeb web = site.AllWebs["BDC_SQL"]) 
      { 
       SPList list = web.Lists["BDC_SQL"]; 
       foreach (SPListItem item in list.Items) 
       { 
        output.AppendFormat("<br>item: {0}", item["ADName"]); 
       } 
      } 
      Label1.Text = output.ToString(); 
     } 
    } 
} 

ASPXページ:

<%@ Assembly Name="$SharePoint.Project.AssemblyFullName$" %> 
<%@ Import Namespace="Microsoft.SharePoint.ApplicationPages" %> 
<%@ Register Tagprefix="SharePoint" Namespace="Microsoft.SharePoint.WebControls" Assembly="Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %> 
<%@ Register Tagprefix="Utilities" Namespace="Microsoft.SharePoint.Utilities" Assembly="Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %> 
<%@ Register Tagprefix="asp" Namespace="System.Web.UI" Assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" %> 
<%@ Import Namespace="Microsoft.SharePoint" %> 
<%@ Assembly Name="Microsoft.Web.CommandUI, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %> 
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="TestGetInfo.aspx.cs" Inherits="farmBDCProj2.Layouts.farmBDCProj2.TestGetInfo" DynamicMasterPageFile="~masterurl/default.master" %> 

<asp:Content ID="PageHead" ContentPlaceHolderID="PlaceHolderAdditionalPageHead" runat="server"> 

</asp:Content> 

<asp:Content ID="Main" ContentPlaceHolderID="PlaceHolderMain" runat="server"> 
    <asp:Button ID="Button1" runat="server" Text="Click Here" OnClick="btn_click" /> 
    <br /> 
    <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label> 
</asp:Content> 

<asp:Content ID="PageTitle" ContentPlaceHolderID="PlaceHolderPageTitle" runat="server"> 
Application Page 
</asp:Content> 

<asp:Content ID="PageTitleInTitleArea" ContentPlaceHolderID="PlaceHolderPageTitleInTitleArea" runat="server" > 
My Application Page 
</asp:Content> 

私が手にエラーがbtn_clickイベントの 'foreachの' 段階にあり、次のようにエラーテキストは次のとおりです。

Microsoft.SharePoint.SPException was unhandled by user code 
    Message=Access denied by Business Data Connectivity. 
    Source=Microsoft.SharePoint 
    ErrorCode=-2146232832 
    StackTrace: 
     at Microsoft.SharePoint.SPListDataSource.GetEntityInstanceEnumerator(XmlNode xnMethodAndFilters) 
     at Microsoft.SharePoint.SPListDataSource.GetFilteredEntityInstancesInternal(XmlDocument xdQueryView, Boolean fFormatDates, Boolean fUTCToLocal, String firstRowId, Boolean fBackwardsPaging, String& bdcidFirstRow, String& bdcidNextPageRow, List`1& lstColumnNames, Dictionary`2& dictColumnsUsed, List`1& mapRowOrdering, List`1& lstEntityData) 
     at Microsoft.SharePoint.SPListDataSource.GetFilteredEntityInstances(XmlDocument xdQueryView, Boolean fFormatDates, Boolean fUTCToLocal, String firstRowId, Boolean fBackwardsPaging, String& bdcidFirstRow, String& bdcidNextPageRow, List`1& lstColumnNames, Dictionary`2& dictColumnsUsed, List`1& mapRowOrdering, List`1& lstEntityData) 
     at Microsoft.SharePoint.SPListItemCollection.EnsureEntityDataViewAndOrdering(String& bdcidFirstRow, String& bdcidNextPageFirstRow) 
     at Microsoft.SharePoint.SPListItemCollection.EnsureListItemsData() 
     at Microsoft.SharePoint.SPListItemCollection.get_Count() 
     at Microsoft.SharePoint.SPEntityInstanceEnumerator.System.Collections.IEnumerator.MoveNext() 
     at farmBDCProj2.Layouts.farmBDCProj2.TestGetInfo.btn_click(Object sender, EventArgs e) 
     at System.Web.UI.WebControls.Button.OnClick(EventArgs e) 
     at System.Web.UI.WebControls.Button.RaisePostBackEvent(String eventArgument) 
     at System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument) 
     at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) 
    InnerException: Microsoft.BusinessData.Infrastructure.AccessDeniedException 
     Message=Access denied by Business Data Connectivity. 
     Source=Microsoft.SharePoint 
     StackTrace: 
      at Microsoft.SharePoint.BusinessData.Runtime.DataClassRuntime.ExecuteInternal(IDataClass thisDataClass, ILobSystemInstance lobSystemInstance, ILobSystem lobSystem, IMethodInstance methodInstanceToExecute, IMethod methodToExecute, IParameterCollection nonReturnParameters, Object[]& overrideArgs) 
      at Microsoft.SharePoint.BusinessData.Runtime.EntityRuntime.ExecuteInternal(IDataClass thisDataClass, ILobSystemInstance lobSystemInstance, ILobSystem lobSystem, IMethodInstance methodInstanceToExecute, IMethod methodToExecute, IParameterCollection nonReturnParameters, Object[]& overrideArgs, IFilterCollection filters) 
      at Microsoft.SharePoint.BusinessData.Runtime.EntityRuntime.ExecuteFiltered(IEntity this, IFilterCollection filterCollection, IMethodInstance methodInstanceToExecute, ILobSystemInstance lobSystemInstance) 
      at Microsoft.SharePoint.BusinessData.Runtime.EntityRuntime.<FindFiltered>b__3(IEntity e, IMethodInstance mi, IFilterCollection fc, ILobSystemInstance lsi) 
      at Microsoft.SharePoint.BusinessData.Runtime.EntityInstanceEnumeratorFactory.CreateEntityInstanceEnumerator(IEntity entity, IMethodInstance methodInstance, IFilterCollection filters, ILobSystemInstance lobSystemInstance, ExecutionCallBack executionCallBack) 
      at Microsoft.SharePoint.BusinessData.MetadataModel.Static.Entity.FindFiltered(IFilterCollection filterCollection, String finderName, ILobSystemInstance lobSystemInstance) 
      at Microsoft.SharePoint.SPListDataSource.GetEntityInstanceEnumerator(XmlNode xnMethodAndFilters) 
     InnerException: 

ご協力いただければ幸いです。

ありがとう、Matt。

+0

これはそれとは何の関係もないかもしれませんが、その後、現在のサイトとWebを扱っている場合それらのオブジェクトを処分する必要があります。これらのオブジェクトが現在のスコープにないときにのみ破棄します。これは奇妙な問題を引き起こします。 usingコンストラクタはdisposeメソッドを自動的に呼び出します。それは株式の奇妙です。 – ScottE

答えて

1

ScottEが述べたように、SPContextで提供されているWebインスタンスとSiteインスタンスは削除されています。それは間違っている。あなたはそれらを処分することはできません。

他のサイトでは、コードを頻繁に実行しています。 ASP.NETライフサイクルを見てみましょう。ポストバック(ボタンクリック)の場合、ロジックはロードメソッド(Page_Load_Stage)とクリックハンドラ(Event_stage)内で実行されます。この2つのことに加えて、このApplicationPageを参照しているユーザーが少なくともこの外部コンテンツタイプに対して読み取りアクセス許可を持っていることを確認する必要があります。

例外として、現在のユーザーには、BDC_SQLリストに関連付けられている要求された外部コンテンツタイプを読み取る権限がありません。

トルステン

関連する問題