2008-10-13 66 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