我正在使用单个文本框搜索报告并过滤掉记录。我的一个字段是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上执行'喜欢'操作。”那是在我做演员之前。然后在我完成演员后我得到了“表达式包含未定义的函数调用Cast()。”
有人有什么想法吗?
谢谢,
马特
答案 0 :(得分: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不支持您必须使用ODBC SQL CONVERT()函数的CAST函数。
请注意,ODBC也有pass-thru模式选项。