2008-10-13 67 views
0

我正在設計一些基於VB的ASP.NET 2.0,並且我試圖更多地使用可視化的各種ASP標籤工作室提供,而不是在代碼隱藏中手寫所有內容。我想從會話中傳入一個外部變量來確定用戶是誰進行查詢。ASP.NET:將外部變量傳遞給<asp:sqldatasource>標籤ASP.NET 2.0

<asp:sqldatasource id="DataStores" runat="server" connectionstring="<%$ ConnectionStrings:MY_CONNECTION %>" 
      providername="<%$ ConnectionStrings:MY_CONNECTION.ProviderName %>" 
      selectcommand="SELECT THING1, THING2 FROM DATA_TABLE WHERE (THING2 IN (SELECT THING2 FROM RELATED_DATA_TABLE WHERE (USERNAME = @user)))" 
      onselecting="Data_Stores_Selecting"> 

      <SelectParameters> 
      <asp:parameter name="user" defaultvalue ="" /> 
      </SelectParameters> 

      </asp:sqldatasource> 

而且在我後面的代碼我有:

Protected Sub Data_Stores_Selecting(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.SqlDataSourceSelectingEventArgs) Handles Data_Stores.Selecting 

    e.Command.Parameters("user").Value = Session("userid") 
End Sub 

我甲骨文squaks與ORA-01036,非法的變量名。我在查詢中聲明變量是錯誤的嗎?

我認爲外部變量與@前綴共享相同的名稱。從我所瞭解的情況來看,這應該是在執行select時將我想要的值放入查詢中。

編輯:好的,感謝迄今爲止的建議,第一個錯誤已更正,我需要使用:而不是@在查詢中的變量聲明。現在它生成一個ORA-01745無效的主機/綁定變量名稱。

編輯再次:好吧,看起來像用戶是一個保留字。它現在有效!感謝這一個其他觀點。我沒有想到這種方法。

回答

3

我相信Oracle使用冒號「:」,而不是符號「@」。


「用戶」可能是一個保留字。將其更改爲「userID」或其他類似內容。

+1

LOL。我曾經有過這樣的事情:D – 2008-10-14 16:06:07

2

您可能需要考慮使用SessionParameter而不僅僅是一個Parameter,並讓SqlDataSource直接從會話中提取用戶標識,而不需要任何干預。此外,上面鏈接的頁面上的例子似乎暗示你應該使用?而不是@user用於ODBC連接的參數替換。我認爲參數替換將由SqlDataSource完成,並且不會傳遞給Oracle,也就是說,在將查詢發送到數據庫之前,它將用用戶id的實際值代替參數(當然適當引用)。

<SelectParameters> 
    <SessionParameter Name="userID" SessionField="user" DefaultValue="" /> 
</SelectParameters> 
0

使用ASP.NET的SessionParameter肯定是去這裏的路 - 這就是爲什麼我們有它:)

使用ASP.NET參數,你可以很容易地包括從靜態源查詢中值,會話狀態,查詢字符串,控件屬性值,表單發佈數據,Cookie和用戶配置文件。

0
<asp:sqldatasource id="DataStores" runat="server" connectionstring="<%$ ConnectionStrings:MY_CONNECTION %>" 
     providername="<%$ ConnectionStrings:MY_CONNECTION.ProviderName %>" 
     selectcommand="SELECT THING1, THING2 FROM DATA_TABLE WHERE (THING2 IN (SELECT THING2 FROM RELATED_DATA_TABLE WHERE (USERNAME = @user)))" 
     onselecting="NAME_OF_SUB_Selecting"> 
     <SelectParameters> 
     <asp:parameter name="@user1" defaultvalue ="" /> 
     </SelectParameters> 
     </asp:sqldatasource> 


Protected Sub NAME_OF_SUB_Selecting(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.SqlDataSourceSelectingEventArgs) Handles Data_Stores.Selecting 
    e.Command.Parameters("@user1").Value = Membership.GetUser.ProviderUserKey.ToString() 
End Sub