【发布时间】:2013-07-02 13:44:16
【问题描述】:
完美的 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# 中的字符串时,并且我认为它应该是(甚至我之前做过)时,我收到一个服务器端错误,表明该字符串的格式不正确。这是该错误的图片:
而且(虽然我只是在测试输出,我是否应该让它退出错误),这里是查询数据库的实际 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
@:@row.occurences
@:@row.tableName
<br/>
}
}
由于它在foreach (var row in db.Query(selectQueryString, searchText)) 行上出错,这严重表明我的查询有问题,但是,这里的语法对我来说一切似乎都是正确的,如果我查询数据库,它甚至可以完美执行(请注意,未参数化)直接。
从逻辑上讲,我会假设我在参数化此查询所涉及的语法上犯了错误,但是,我的双重和三重检查(以及我过去这样做的经验)坚持一切看起来都很好。
我是否弄乱了参数化此查询所涉及的语法,还是我忽略了其他在起作用的东西?
我知道我可以肯定地告诉你,正如之前已经测试过的那样,我从查询字符串中得到的值确实是我所期望的,但实际上并不多.cshtml 页面上的其他内容,我能告诉你的就这些了。
【问题讨论】:
-
如果您传递给
.Query()的参数对象类型与SQL @0 变量的预期不匹配,通常会发生此错误。在这种情况下,我想知道在查询字符串中的多个位置指定相同的参数是否有效。 -
是因为有0而不是o吗?真的只是一个平底船
-
@ebyrob 实际上,这是合法的,因为我以前使用过它(谢天谢地)。但是待机,我想我其实已经找到了问题所在。将在一秒钟内发布。
标签: c# sql sql-server-ce webmatrix asp.net-webpages