【问题标题】:ASP.net: Sqldatasource and Session variableASP.net:Sqldatasource 和 Session 变量
【发布时间】:2009-03-18 17:18:00
【问题描述】:
<asp:HiddenField ID="hfDualInitials" runat="server" Visible="false" OnInit="hfDualInitials_OnInit" />
    <asp:SqlDataSource ID="sdsStoreNo" runat="server" ConnectionString="<%$ ConnectionStrings:ConnStr %>"
        SelectCommand="select * from AccountCancellation_Process 
                       where store_num in (select distinct storeno from franchisedata where initials in (@DualInitials))
                       order by CustomerName ASC" >
        <SelectParameters>
            <asp:ControlParameter ControlID="hfDualInitials" DbType="String" Name="DualInitials" />
        </SelectParameters>                     
    </asp:SqlDataSource>

我有一个带有上述选择命令和以下代码的 Sqldatasource 来设置隐藏字段值

Protected Sub hfDualInitials_OnInit(ByVal sender As Object, ByVal e As EventArgs)        
    Dim _DualInitials As String = "('P2','7T')"
    Session.Add("DualInitials", _DualInitials)
    Me.hfDualInitials.Value = Session("DualInitials")
End Sub

我正在使用 ('P2','7T') 模拟会话,它将传递给上述 sql 命令。 当我运行查询时:

select * from AccountCancellation_Process where store_num in (select distinct storeno from franchisedata where initials in ('P2','7T'))

它返回一些数据,但在我的 Sqldatasource 选择命令中。它什么也不返回。我的猜测是因为(@DualInitials)中的首字母()已经在隐藏字段中,但是如果我删除()并且只有@DualInitials。我会得到“'@DualInitials' 附近的语法不正确。”

有没有人知道任何解决方法或我哪里弄错了?

【问题讨论】:

    标签: asp.net


    【解决方案1】:

    查看ADO.NET TableAdapter parameters 问题的答案。

    您有一个带有字符串参数的查询,而不是数组参数。所以,当你通过 "('P2','7T')" 你认为最终的查询是

    WHERE initials IN ('P2', '7T')
    

    实际上是

    WHERE initials IN ('(''P2'', ''7T'')')
    

    如果它只是两个首字母,那么只需使用 OR 语句重写。否则我不知道其他线程中提到的那些之外的好的解决方案。

    【讨论】:

    • 我在这里得到 -1 有什么特别的原因吗? IN 语句将参数视为字符串而不是序列。我为杰克的问题提供了一个解决方案。 wtf?
    【解决方案2】:

    您不能像这样在 SQL 中对 IN 语句进行参数化。您将不得不使用 SQL 的字符串连接(不好)或其他一些技术,例如解析分隔字符串。

    【讨论】:

      【解决方案3】:

      如果不运行示例,我无法确定,但是

      WHERE initials IN (<%=Eval(@DualInitials)%>)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-07
        • 1970-01-01
        • 2018-10-08
        • 1970-01-01
        • 1970-01-01
        • 2011-10-23
        相关资源
        最近更新 更多