为什么C#不接受(貌似)完美的Sql Server CE查询?

时间:2013-07-02 13:44:16

标签: c# sql sql-server-ce webmatrix asp.net-webpages

通过非常好的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#中将此查询编写为字符串并且我认为它应该是(并且就像我之前所做的那样)时,我收到服务器端错误,指示字符串格式不正确。这是该错误的图片:

enter image description here

并且(虽然我只测试输出,我应该让它退出错误),这是查询数据库的实际C#(即.cshtml)页面:

@{
    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页面上的其他内容,这就是我可以告诉你的全部内容。

2 个答案:

答案 0 :(得分:1)

,我发现在LIKE短语中我实际使用了CAST,如果在上面的示例中使用LIKE短语,它将如下所示:

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

我认为常规C#字符串与sql nvarchar数据类型不同。

对于任何能够为任何人(包括我自己)提供更多信息的人,仍然可以接受和赞成,这可能会从更精确的解释中受益(也就是说,如果还有更多的东西比简单的“它只是不一样的数据类型”解释。

(注意:如果它有助于任何未来的观众知道,LIKE短语中的参数是我改变的 ALL 。我没有必须强制转换或更改参数中涉及的语法写在LIKE短语之外)。

答案 1 :(得分:1)

这是一个很长的镜头,但可能会有所启发。尝试执行以下查询并阅读结果:

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

对于任何未发生错误的传递对象参数,您应该获得有关用于表示它的sql类型的信息。