0

完全に優れた SQL クエリとは、WebMatrix 内で次のクエリを実行すると、完全に機能することを意味します。

SELECT page AS location, (len(page) - len(replace(UPPER(page), UPPER('o'), ''))) / len('o') AS occurences, 'pageSettings' AS tableName FROM PageSettings WHERE page LIKE '%o%'
UNION
SELECT pageTitle AS location, (len(pageTitle) - len(replace(UPPER(pageTitle), UPPER('o'), ''))) / len('o') AS occurences, 'ExternalSecondaryPages' AS tableName FROM ExternalSecondaryPages WHERE pageTitle LIKE '%o%' 
UNION
SELECT eventTitle AS location, (len(eventTitle) - len(replace(UPPER(eventTitle), UPPER('o'), ''))) / len('o') AS occurences, 'MainStreetEvents' AS tableName FROM MainStreetEvents WHERE eventTitle LIKE '%o%'

ここでは'o'、検索する静的検索文字列として使用しています。問題ありませんが、それほど動的ではありません。

ここで、このクエリを C# で文字列として記述すると、そうあるべきだと思います (以前にも行ったように)、文字列が正しい形式ではないことを示すサーバー側エラーが発生します。これがそのエラーの写真です:

ここに画像の説明を入力

そして (私は出力をテストしているだけですが、間違いをやめる必要があります.cshtml)、データベースを照会する実際の C# (つまり ) ページは次のとおりです。

@{
    Layout = "~/Layouts/_secondaryMainLayout.cshtml";    

    var db = Database.Open("Content");
    string searchText = Request.Unvalidated["searchText"];
    string selectQueryString = "SELECT page AS location, (len(page) - len(replace(UPPER(page), UPPER(@0), ''))) / len(@0) AS occurences, 'pageSettings' AS tableName FROM PageSettings WHERE page LIKE '%' + @0 + '%' ";
    selectQueryString += "UNION ";
    selectQueryString += "SELECT pageTitle AS location, (len(pageTitle) - len(replace(UPPER(pageTitle), UPPER(@0), ''))) / len(@0) AS occurences, 'ExternalSecondaryPages' AS tableName FROM ExternalSecondaryPages WHERE pageTitle LIKE '%' + @0 + '%' ";
    selectQueryString += "UNION ";
    selectQueryString += "SELECT eventTitle AS location, (len(eventTitle) - len(replace(UPPER(eventTitle), UPPER(@0), ''))) / len(@0) AS occurences, 'MainStreetEvents' AS tableName FROM MainStreetEvents WHERE eventTitle LIKE '%' + @0 + '%'";

    @:beginning <br/>
    foreach (var row in db.Query(selectQueryString, searchText))
    {
        @:entry
        @:@row.location &nbsp;
        @:@row.occurences &nbsp;
        @:@row.tableName
        <br/>
    }
}

foreach (var row in db.Query(selectQueryString, searchText))行が間違っているため、クエリに何か問題があることを強く示唆していますが、ここでの構文についてはすべて正しいように見え、データベースに直接クエリを実行しても完全に実行されます (パラメータ化されていないことに注意してください)。 .

論理的には、このクエリのパラメーター化に関連する構文のどこかでエラーが発生したと思いますが、二重チェックと三重チェック (およびこれを行った過去の経験) により、ここではすべて問題ないように見えます。

このクエリのパラメータ化に関連する構文を台無しにしましたか、それとも私が見落としている他の何かがここで働いていますか?

確かに、以前にテストしたので、クエリ文字列から取得した値は、実際に期待どおりのものであると言えますが、実際には他にあまりないので、.cshtmlページがまだありますが、それが私があなたに言えるすべてです。

4

2 に答える 2

1

これはロングショットですが、いくつかの光を当てる可能性があります。次のクエリを実行して、結果を読んでみてください。

select top 1 sql_variant_property(@0, 'BaseType') as type from MainStreetEvents;

エラーにならない渡されたオブジェクト パラメーターについては、それを表すために使用されている SQL 型に関する情報を取得する必要があります。

于 2013-07-02T16:51:45.610 に答える
1

ここに質問を投稿した直後に、この問題の解決策を 2 日間にわたって検索した結果、答え見つかりましたLIKECAST上記の例の LIKE 句で使用すると、次のようになります。

LIKE '%' + CAST(@0 AS nvarchar) + '%'

通常の C# 文字列は、SQLnvarcharデータ型と同じではないと思います。

より正確な説明から恩恵を受ける可能性のある人 (私を含む) のために、これにもう少し光を当てることができる人には、まだ同意と賛成があります (つまり、単純な「それ以上のものがある場合)同じデータ型ではありません」の説明)。

(注: 将来の視聴者が知るのに役立つ場合、LIKE 句のパラメーターはすべて私が変更したものです。LIKE 句の外側に記述されたパラメーターに含まれる構文については、キャストまたは変更する必要はありませんでした)。

于 2013-07-02T14:03:07.967 に答える