无法在 ASP.NET Razor - WebMatrix 数据库查询()方法中传递 2 个参数
Unable to pass 2 parameter in ASP.NET Razor - WebMatrix Database Query() method
我无法使用带有 2 个内插字符串的 WebMatrix 数据库方法 Query()
。
实际代码:(不工作)
@{
var db = Database.Open("WebPagesMovies") ;
var selectCommand = "SELECT * FROM Movies";
var item = "";
var search = "";
if(!Request.QueryString["searchTitle"].IsEmpty() ) {
selectCommand = "SELECT * FROM Movies WHERE @0 LIKE @1";
item = Request.QueryString["item"];
search = "%" + Request.QueryString["search"] + "%";
}
var selectedData = db.Query(selectCommand, item, search); // **NOT WORKING**
var grid = new WebGrid(source: selectedData, defaultSort: "Genre", rowsPerPage:3);
}
工作
@{
var db = Database.Open("WebPagesMovies") ;
var selectCommand = "SELECT * FROM Movies";
var search = "";
if(!Request.QueryString["searchTitle"].IsEmpty() ) {
selectCommand = "SELECT * FROM Movies WHERE Title LIKE @0";
item = Request.QueryString["item"];
search = "%" + Request.QueryString["search"] + "%";
}
var selectedData = db.Query(selectCommand, item, search);
var grid = new WebGrid(source: selectedData, defaultSort: "Genre", rowsPerPage:3);
}
为什么我无法在 Query()
方法中插入 2 个字符串,如 item
和 search
? ASP.NET 不支持吗?
在调试时,我可以看到值已分配给 item
和 search
。但是值不会传递给 Query()
方法。
官方文档:
这是一个非常有趣的方法。您的代码正在做的是使用参数化 SQL。参数有@0、@1等。 db.Query 语句将参数传递给 SQL。我相信这些参数的使用位置有很大的限制。它们只能用于数据可以去的地方,而不是 SQL 命令或 table 名称或字段可以去的地方。所以因为Title是一个字段名,所以不能参数化。
所以猜测有时你想搜索标题,有时你想搜索发布日期等等,你有多种选择。
一个是检查传入的项目变量,可能在 switch 语句中,然后有几个 sql 语句,每个语句只处理一个项目。所以你的代码看起来像这样的伪代码:
switch (item)
{
case 'title':
selectCommand = "SELECT * FROM Movies WHERE Title LIKE @0";
break;
case 'releaseDate':
selectCommand = "SELECT * FROM Movies WHERE ReleaseDate = @0";
break;
...
}
这就是参数化字段名称没有意义的原因之一。因为'Title'是字符串,所以可以用LIKE命令,但是日期不行。
我无法使用带有 2 个内插字符串的 WebMatrix 数据库方法 Query()
。
实际代码:(不工作)
@{
var db = Database.Open("WebPagesMovies") ;
var selectCommand = "SELECT * FROM Movies";
var item = "";
var search = "";
if(!Request.QueryString["searchTitle"].IsEmpty() ) {
selectCommand = "SELECT * FROM Movies WHERE @0 LIKE @1";
item = Request.QueryString["item"];
search = "%" + Request.QueryString["search"] + "%";
}
var selectedData = db.Query(selectCommand, item, search); // **NOT WORKING**
var grid = new WebGrid(source: selectedData, defaultSort: "Genre", rowsPerPage:3);
}
工作
@{
var db = Database.Open("WebPagesMovies") ;
var selectCommand = "SELECT * FROM Movies";
var search = "";
if(!Request.QueryString["searchTitle"].IsEmpty() ) {
selectCommand = "SELECT * FROM Movies WHERE Title LIKE @0";
item = Request.QueryString["item"];
search = "%" + Request.QueryString["search"] + "%";
}
var selectedData = db.Query(selectCommand, item, search);
var grid = new WebGrid(source: selectedData, defaultSort: "Genre", rowsPerPage:3);
}
为什么我无法在 Query()
方法中插入 2 个字符串,如 item
和 search
? ASP.NET 不支持吗?
在调试时,我可以看到值已分配给 item
和 search
。但是值不会传递给 Query()
方法。
官方文档:
这是一个非常有趣的方法。您的代码正在做的是使用参数化 SQL。参数有@0、@1等。 db.Query 语句将参数传递给 SQL。我相信这些参数的使用位置有很大的限制。它们只能用于数据可以去的地方,而不是 SQL 命令或 table 名称或字段可以去的地方。所以因为Title是一个字段名,所以不能参数化。
所以猜测有时你想搜索标题,有时你想搜索发布日期等等,你有多种选择。
一个是检查传入的项目变量,可能在 switch 语句中,然后有几个 sql 语句,每个语句只处理一个项目。所以你的代码看起来像这样的伪代码:
switch (item)
{
case 'title':
selectCommand = "SELECT * FROM Movies WHERE Title LIKE @0";
break;
case 'releaseDate':
selectCommand = "SELECT * FROM Movies WHERE ReleaseDate = @0";
break;
...
}
这就是参数化字段名称没有意义的原因之一。因为'Title'是字符串,所以可以用LIKE命令,但是日期不行。