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

Posted

技术标签:

【中文标题】ASP.NET:将外部变量传递到 <asp:sqldatasource> 标记 ASP.NET 2.0【英文标题】:ASP.NET : Passing a outside variable into a <asp:sqldatasource> tag ASP.NET 2.0 【发布时间】:2008-10-13 21:48:51 【问题描述】:

我正在设计一些基于 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,非法变量名对我发声。我在查询中声明变量错误吗?

我认为外部变量与 @ 前缀共享相同的名称。据我了解,这应该是在执行选择时将我想要的值放入查询中。

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

再次编辑:好的,看起来 user 是一个保留字。现在可以了!感谢您对此的其他观点。我没有想到这种方法。

【问题讨论】:

【参考方案1】:

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


“用户”可能是一个保留字。将其更改为“userID”或类似名称。

【讨论】:

哈哈。我也遇到过这种情况:D【参考方案2】:

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

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

【讨论】:

【参考方案3】:

使用 ASP.NET 的 SessionParameter 绝对是最好的选择——这就是我们拥有它的原因 :)

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

【讨论】:

【参考方案4】:
<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

【讨论】:

以上是关于ASP.NET:将外部变量传递到 <asp:sqldatasource> 标记 ASP.NET 2.0的主要内容,如果未能解决你的问题,请参考以下文章

asp.net 核心环境变量未传递给 vuejs 配置

将 Html 字符串从控制器传递到查看 ASP.Net MVC

Asp.Net - 将处理卸载到外部应用程序

如何在asp.net mvc中将数据从视图传递到控制器

ASP.NET 页面之间传递值的几种方式

将 ID 从视图传递到控制器 (ASP.NET)