ASP.NET:将外部变量传递到<asp:sqldatasource>标记ASP.NET 2.0 </asp:sqldatasource>

时间:2008-10-13 21:48:51

标签: sql vb.net asp.net-2.0 selectcommand

我正在设计一些基于VB的ASP.NET 2.0,我正在尝试更多地使用visual studio提供的各种ASP标签,而不是在代码隐藏中编写所有内容。我想从Session中传入一个外部变量来识别用户的查询对象。

<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

Oracle用ORA-01036(非法变量名称)对我嗤之以鼻。我在查询中声明变量是错误的吗?

我认为外部变量与@prefixed共享相同的名称。根据我的理解,这应该是在执行select时将我想要的值放入查询。

编辑:好的,感谢到目前为止的建议,第一个错误已得到纠正,我需要使用:而不是@用于查询中的变量声明。现在它生成一个ORA-01745无效的主机/绑定变量名。

再次编辑:好的,看起来用户是一个保留字。它现在有效!感谢您对此问题的其他观点。我没有想到那种方法。

4 个答案:

答案 0 :(得分:3)

我相信Oracle使用冒号“:”,而不是符号“@”。

<小时/> “用户”可能是一个保留字。将其更改为“userID”或类似内容。

答案 1 :(得分:2)

您可能需要考虑使用SessionParameter而不仅仅是参数,让SqlDataSource直接从会话中提取用户ID,而无需您的任何干预。此外,上面链接的页面上的示例似乎暗示您应该使用?而不是@user用于ODBC连接的参数替换。我认为参数替换将由SqlDataSource完成,而不是传递给Oracle,也就是说它会在将查询发送到数据库之前替换用户id的实际值代替参数(当然正确引用)。 p>

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

答案 2 :(得分:0)

使用ASP.NET的SessionParameter绝对是走到这里的方式 - 这就是我们拥有它的原因:)

使用ASP.NET参数,您可以轻松地在查询中包含来自静态源,会话状态,查询字符串,控件属性值,表单发布数据,Cookie和用户配置文件的值。

答案 3 :(得分: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