【问题标题】:How can I do a cast in a SqlDataSource FilterExpression?如何在 SqlDataSource FilterExpression 中进行强制转换?
【发布时间】:2010-11-15 04:07:06
【问题描述】:

我正在使用单个文本框来搜索报告并过滤掉记录。我的一个字段是 int32,其余的是 varchar。因此,当过滤器尝试将文本框中的字符串与 int32 字段进行比较时,出现错误。这是 SQLDataSouce 和搜索框:

<asp:TextBox ID="SearchBox" AutoPostBack="true" OnTextChanged="SearchBox_TextChanged" runat="server"></asp:TextBox>

<asp:SqlDataSource ID="SqlDataSource1" runat="server" 
        ConnectionString="<%$ ConnectionStrings:oneworldunitedConnectionString %>" 
        SelectCommand="SELECT usrs.UserID, usrs.UserName, usrs.FirstName, usrs.LastName, jndt.PropertyValue AS JoinDate, rgn.PropertyValue AS Region, cty.PropertyValue AS City, spnsrnm.PropertyValue AS SponsorName FROM            dbo.Users AS usrs INNER JOIN
                     dbo.UserProfile AS jndt ON jndt.PropertyDefinitionID = 412 AND usrs.UserID = jndt.UserID INNER JOIN
                     dbo.UserProfile AS cty ON cty.PropertyDefinitionID = 27 AND usrs.UserID = cty.UserID INNER JOIN
                     dbo.UserProfile AS rgn ON rgn.PropertyDefinitionID = 28 AND usrs.UserID = rgn.UserID INNER JOIN
                     dbo.UserProfile AS spnsrnm ON spnsrnm.PropertyDefinitionID = 421 AND usrs.UserID = spnsrnm.UserID" 
        FilterExpression="UserID LIKE '%{0}%' OR UserName LIKE '%{0}%' OR FirstName LIKE '%{0}%' OR LastName LIKE '%{0}%' OR JoinDate LIKE '%{0}%' OR Region LIKE '%{0}%' OR City LIKE '%{0}%' OR SponsorName LIKE '%{0}%'">
    <FilterParameters>
        <asp:ControlParameter Name="Search" ControlID="SearchBox" PropertyName="Text" />    
    </FilterParameters>
</asp:SqlDataSource>

请不要抨击sql语句,我知道它效率极低。有谁知道如何更改 FilterExpression 以便在尝试将文本框值与 UserID 字段进行比较时不会出错?我试过这样做:

FilterExpression="CAST(UserID as varchar(4)) LIKE '%{0}%' OR UserName LIKE '%{0}%' OR FirstName LIKE '%{0}%' OR LastName LIKE '%{0}%' OR JoinDate LIKE '%{0}%' OR Region LIKE '%{0}%' OR City LIKE '%{0}%' OR SponsorName LIKE '%{0}%'"

但这没有用。我认为 UserID LIKE CAST('%{0}%' as varchar(4)) 是行不通的,因为如果它实际上是他们输入的字符串,那么您会收到错误消息。

编辑:这是我收到的错误消息“无法对 System.Int32 和 System.String 执行 'Like' 操作。” 那是在我进行演员表之前.然后在我做了演员表之后,我得到了“表达式包含未定义的函数调用 Cast()。”

有人有什么想法吗?

谢谢,
马特

【问题讨论】:

  • 请告诉我们错误信息。
  • 这些不是 SQL Server 错误。第一个肯定是 .net 错误,可能 ADO.net,但也可能是 CLR 错误。第二个对我来说完全是个谜。您的代码或您正在使用的东西都试图在将它们传递给 SQL Server 之前解析它们的字符串,这就是它的来源。

标签: sql sql-server casting filter sqldatasource


【解决方案1】:

问题可能不是 UserID,您的更改应该已经解决了这个问题。问题更可能来自其他比较领域之一,JoinDate 是领先的竞争者。 (我无法为您解决这个问题,因为我不知道您的字符串日期格式是什么)。


好的,如果日期格式是 mm/dd/yyy 那么你想将 JoinDate 的过滤比较更改为:

OR CONVERT(Varchar(10), JoinDate, 101) LIKE '%{0}%'

好的,根据错误消息,错误不是来自 SQL Server,而是来自您(客户端)端的某些东西。你需要做的是弄清楚那是什么,在你的代码中找到它,然后

1) 尝试设置“PassThrough”(或“Passthru”)模式,使其不会先尝试验证,

或 2) 查找该工具的 SQL 版本并将 CAST() 更改为相应的函数。例如,ODBC 将完全按照您在此处看到的那样做,并且由于 ODBC SQL 不支持 CAST 函数,您必须改用 ODBC SQL CONVERT() 函数。

请注意,ODBC 也有一个直通模式选项。

【讨论】:

  • 01/30/2009 是格式...应该说不能将 Date 与 String 而不是 Int32 与 String 进行比较?
  • "应该说不能比较 Date 到 String 而不是 Int32 到 String?" what 应该这么说吗?
  • 在我收到的错误消息中......我刚刚更新了问题以显示错误消息
  • 我切换了过滤器,使其仅在加入日期过滤,并且工作正常。我还对其进行了切换,使其仅在 UserID 上进行过滤,并且在我的问题的编辑中显示了错误。所以一定是 UserID 这样做了。
  • 这就是为什么提前发布错误消息如此重要的原因,它可以为我们双方节省大量时间。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-20
相关资源
最近更新 更多