SqlDataSource FilterExpressionでキャストを実行するにはどうすればよいですか?
-
05-07-2019 - |
質問
単一のテキストボックスを使用してレポートを検索し、レコードを除外しています。私のフィールドの1つは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ステートメントをbashしないでください。非常に非効率的です。 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))
は、実際に入力した文字列である場合はエラーが発生するため、機能しないと考えました。
編集:エラーメッセージは次のとおりです。&quot; System.Int32およびSystem.Stringで「いいね」操作を実行できません。&quot; キャスト。次に、キャストを行った後、&quot;式には未定義の関数呼び出しCast()が含まれています。&quot;
アイデアはありますか?
ありがとう、
マット
解決
問題はおそらくUserIDではなく、変更により修正されているはずです。多くの場合、問題は他の比較フィールドの1つから発生し、JoinDateが主要な候補です。 (文字列の日付形式がわからないため、これを修正することはできません。)
OK、日付形式がmm / dd / yyyの場合、JoinDateのフィルター比較を次のように変更します。
OR CONVERT(Varchar(10), JoinDate, 101) LIKE '%{0}%'
OK、エラーメッセージに基づいて、エラーはSQL Serverから発生したものではありませんが、(クライアント)側の何かから発生している必要があります。あなたがする必要があるのは、それが何であるかを理解し、あなたのコードでそれを見つけて、それから
1)&quot; PassThrough&quot;の設定を試みます。 (または&quot; Passthru&quot;)モードであるため、最初に検証を試みません
または2)その機能のバージョンのSQLを検索し、CAST()を対応する関数に変更します。たとえば、ODBCはここで表示されているとおりに動作し、ODBC SQLはCAST関数をサポートしていないため、代わりにODBC SQL CONVERT()関数を使用する必要があります。
ODBCにはパススルーモードオプションもあることに注意してください。