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 天的搜索该问题的解决方案的答案,但是,当我仔细查看我使用的一些旧代码时,我发现在LIKE我实际使用的短语中CAST这样,如果在我上面的示例中的 LIKE 短语中使用它,它将如下所示:

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

我想常规的 C# 字符串与 sqlnvarchar数据类型不同。

对于可能从更精确的解释中受益的任何人(包括我自己)来说,对于任何可能对此有更多了解的人(也就是说,如果除了简单的“它是只是不同的数据类型”解释)。

(注意:如果它有助于任何未来的观众了解,LIKE 短语中的参数是我更改的全部。我不必强制转换或更改任何关于写入 LIKE 短语之外的参数所涉及的语法的任何内容)。

于 2013-07-02T14:03:07.967 回答