2

単一のテキスト ボックスを使用してレポートを検索し、レコードを除外しています。私のフィールドの 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))それが実際に入力された文字列である場合、エラーが発生するため、うまくいかないと思いました。

編集: 「System.Int32 および System.String で「Like」操作を実行できません」というエラー メッセージが表示されます。キャストする前の話です。次に、キャストを行った後、「式には未定義の関数呼び出しCast()が含まれています」というメッセージが表示されました。

誰にもアイデアはありますか?

ありがとう、
マット

4

1 に答える 1

1

問題はおそらくUserIDではなく、変更によって修正されているはずです。問題は他の比較フィールドの1つに起因している可能性が高く、JoinDateが主要な候補です。(文字列の日付形式がわからないため、修正できません)。


OK、日付形式がmm / dd / yyyの場合、JoinDateのフィルター比較を次のように変更します。

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

OK、エラーメッセージに基づくと、エラーはSQL Serverからではなく、(クライアント)側の何かから発生している必要があります。あなたがする必要があるのは、それが何であるかを理解し、それをあなたのコードで見つけ、そして次のいずれかです

1)「PassThrough」(または「Passthru」)モードを設定して、最初に検証を試みないようにします。

または2)そのファシリティのバージョンのSQLを検索し、CAST()を対応する関数に変更します。たとえば、ODBCはここに表示されていることを正確に実行します。ODBCSQLはCAST関数をサポートしていないため、代わりにODBC SQL CONVERT()関数を使用する必要があります。

ODBCにはパススルーモードオプションもあることに注意してください。

于 2009-07-29T17:49:03.677 に答える