2013-04-03 26 views
1

編輯:解決這個自己與菲利克斯幫助(見下面的答案)asp.net動態GridView控件的SelectCommand分頁/排序拋出Oracle錯誤

我嘗試添加使用一些基本的搜索/過濾功能到GridView SelectCommand。在更改DropdownList並單擊按鈕後,SelectCommand應該隨着添加SelectParameter一起更改。

問題是,一旦更改了SelectCommand並添加了合適的SelectParameter,只有第一頁完美顯示,顯示正確的過濾結果。試圖改變的頁面(或排序)拋出Oracle錯誤

(Sys.WebForms.PageRequestManagerServerErrorException:ORA-01036: 非法變量名稱/編號)。

當刪除篩選(因此恢復SelectCommand並刪除SelectParameter)時,分頁/排序工作正常。


的.ascx代碼:

(注意:owner_ddl DROPDOWNLIST是在一個單獨的代碼隱藏方法填入值)

<asp:DropDownList ID="owner_ddl" runat="server"> 
    <asp:ListItem Value="*">All</asp:ListItem> 
</asp:DropDownList> 
&emsp; 
<asp:Button ID="filter_btn" runat="server" Text="Filter" OnClick="filter_btn_Click" /> 

<br /> 
<br /> 

<asp:GridView ID="workbasket_gv" runat="server" AllowPaging="True" 
AllowSorting="True" PagerSettings-Mode="NextPreviousFirstLast" PageSize="20" 
AutoGenerateColumns="False" DataKeyNames="INCIDENT_ID" DataSourceID="sqlIncident" 
EmptyDataText="No incidents meet this criteria" Width="90%"> 
    <Columns> 
     <asp:CommandField ShowSelectButton="True" ButtonType="Button" SelectText="View"> 
      <ItemStyle Width="50px" /> 
     </asp:CommandField> 
     <asp:BoundField DataField="INCIDENT_ID" HeaderText="ID" ReadOnly="True" SortExpression="INCIDENT_ID"> 
      <ItemStyle Width="50px" /> 
     </asp:BoundField> 
     <asp:BoundField DataField="OWNER" HeaderText="Owner" SortExpression="OWNER"> 
      <ItemStyle Width="100px" /> 
     </asp:BoundField> 
     <asp:BoundField DataField="TITLE" HeaderText="Title" SortExpression="TITLE" /> 
     <asp:BoundField DataField="DATE_RAISED" HeaderText="Date Raised" SortExpression="DATE_RAISED" DataFormatString="{0:g}"> 
      <ItemStyle Width="200px" /> 
     </asp:BoundField> 
    </Columns> 
    <PagerSettings Mode="NextPreviousFirstLast" Position="TopAndBottom" FirstPageText="&lt;&lt; First" 
    LastPageText="Last &gt;&gt;" NextPageText="Next &gt;" PreviousPageText="&lt; Prev"> 
    </PagerSettings> 
    <PagerStyle HorizontalAlign="Center" /> 
</asp:GridView> 

<asp:SqlDataSource ID="sqlIncident" runat="server" ConnectionString="Data Source=dbmisc89_dbmisc89.w34.bmw.uk;Persist Security Info=True;User ID=W50XS001_W;Password=sales_2;" 
ProviderName="System.Data.OracleClient" SelectCommand="SELECT INCIDENT_ID, OWNER, TITLE, DATE_RAISED FROM INCIDENT_TBL WHERE TITLE IS NOT NULL ORDER BY DATE_RAISED DESC"> 
</asp:SqlDataSource> 

代碼隱藏:

protected void filter_btn_Click(object sender, EventArgs e) 
{ 
    if (owner_ddl.SelectedValue != "*") 
    { 
     // Defined owner 
     string sql = "SELECT INCIDENT_ID, OWNER, TITLE, DATE_RAISED FROM INCIDENT_TBL WHERE TITLE IS NOT NULL AND OWNER=:OWNER ORDER BY DATE_RAISED DESC"; 
     sqlIncident.SelectCommand = sql; 
     ControlParameter param = new ControlParameter("OWNER", System.Data.DbType.String, "owner_ddl", "SelectedValue"); 
     sqlIncident.SelectParameters.Add(param); 
    } 
    else 
    { 
     // All owners (Remove variable) 
     string sql = "SELECT INCIDENT_ID, OWNER, TITLE, DATE_RAISED FROM INCIDENT_TBL WHERE TITLE IS NOT NULL ORDER BY DATE_RAISED DESC"; 
     sqlIncident.SelectCommand = sql; 
     sqlIncident.SelectParameters.Clear(); 
    } 
    workbasket_gv.DataBind(); 
} 

回答

0

通過移除SelectParameter,並把owner_ddl.SelectedValue直接到SQL字符串解決了這個。還添加了一個Session變量傳遞給自己DataBind,所以分頁/排序保持正確的查詢。

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (IsPostBack) 
    { 
     if (!String.IsNullOrEmpty((String)Session["sqlOwnerType"])) 
     { 
      if ((String)Session["sqlOwnerType"] == "specific") 
       sqlIncident.SelectCommand = "SELECT INCIDENT_ID, OWNER, TITLE, DATE_RAISED FROM INCIDENT_TBL WHERE TITLE IS NOT NULL AND OWNER='" + owner_ddl.SelectedValue + "' ORDER BY DATE_RAISED DESC"; 
      else if ((String)Session["sqlOwnerType"] == "all") 
       sqlIncident.SelectCommand = "SELECT INCIDENT_ID, OWNER, TITLE, DATE_RAISED FROM INCIDENT_TBL WHERE TITLE IS NOT NULL ORDER BY DATE_RAISED DESC"; 
     } 
    } 
} 

protected void filter_btn_Click(object sender, EventArgs e) 
{ 
    if (owner_ddl.SelectedValue != "*") 
    { 
     // Defined owner 

     string sql = "SELECT INCIDENT_ID, OWNER, TITLE, DATE_RAISED FROM INCIDENT_TBL WHERE TITLE IS NOT NULL AND OWNER='" + owner_ddl.SelectedValue + "' ORDER BY DATE_RAISED DESC"; 
     sqlIncident.SelectCommand = sql; 

     Session["sqlOwnerType"] = "specific"; 
    } 
    else 
    { 
     // All owners (Remove variable) 
     string sql = "SELECT INCIDENT_ID, OWNER, TITLE, DATE_RAISED FROM INCIDENT_TBL WHERE TITLE IS NOT NULL ORDER BY DATE_RAISED DESC"; 
     sqlIncident.SelectCommand = sql; 

     Session["sqlOwnerType"] = "all"; 
    } 
    workbasket_gv.DataBind(); 
} 
0

請檢查有了這個。我不確定它的問題。讓我KNW如果其右......

if (owner_ddl.SelectedValue != "*") 
    { 
     // Defined owner 

ControlParameter param = new ControlParameter("OWNER", System.Data.DbType.String, "owner_ddl", "SelectedValue"); 
     sqlIncident.SelectParameters.Add(param); 


     string sql = "SELECT INCIDENT_ID, OWNER, TITLE, DATE_RAISED FROM INCIDENT_TBL WHERE TITLE IS NOT NULL AND OWNER=:OWNER ORDER BY DATE_RAISED DESC"; 
     sqlIncident.SelectCommand = sql; 

    } 
+0

不起作用,它似乎沒有區別,我仍然遇到同樣的問題。 – Ben

+0

爲什麼你添加這個分隔代碼。你可以在你的sqldatasource裏面添加參數... –

+0

我已經刪除了SelectParameter,並且試圖將'owner_ddl.SelectedValue'直接放到'sql'字符串中,現在的問題是更改頁面失去了新的'SelectCommand',它立即恢復回到最初的'SelectCommand'。我想這與ViewState變化有關,現在看看... – Ben

0
<asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:ConnectionString %>" 
      DeleteCommand="DELETE FROM [Table] WHERE [INCIDENT_ID] = @INCIDENT_ID" 
      InsertCommand="INSERT INTO [Table] ([INCIDENT_ID], [OWNER]) VALUES (@INCIDENT_ID, @OWNER)" 
      SelectCommand="SELECT * FROM [Table] WHERE ([OWNER] = @OWNER)" 
      UpdateCommand="UPDATE [Table] SET [OWNER] = @OWNER WHERE [INCIDENT_ID] = @INCIDENT_ID"> 
      <DeleteParameters> 
       <asp:Parameter Name="INCIDENT_ID" Type="Int32" /> 
      </DeleteParameters> 
      <InsertParameters> 
       <asp:Parameter Name="INCIDENT_ID" Type="Int32" /> 
       <asp:Parameter Name="OWNER" Type="String" /> 
      </InsertParameters> 
      <SelectParameters> 
       <asp:ControlParameter ControlID="owner_ddl" Name="OWNER" PropertyName="SelectedValue" Type="String" /> 
      </SelectParameters> 
      <UpdateParameters> 
       <asp:Parameter Name="OWNER" Type="String" /> 
       <asp:Parameter Name="INCIDENT_ID" Type="Int32" /> 
      </UpdateParameters> 
     </asp:SqlDataSource> 



protected void filter_btn_Click(object sender, EventArgs e) 
    { 
     SqlDataSource1.DataBind(); 
     workbasket_gv.DataBind(); 
    }