无法在 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 个字符串,如 itemsearch? ASP.NET 不支持吗?

在调试时,我可以看到值已分配给 itemsearch。但是值不会传递给 Query() 方法。

官方文档:

  1. https://www.asp.net/web-pages/overview/getting-started/introducing-aspnet-web-pages-2/form-basics
  2. https://msdn.microsoft.com/en-us/library/webmatrix.data.database.query(v=vs.111).aspx

这是一个非常有趣的方法。您的代码正在做的是使用参数化 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命令,但是日期不行。