我在Webmatrix中创建了一个数据库,它是一个名为Fish的表。它存储了许多鱼,捕获它们的方式等等。我在Webmatrix中创建了一个前端,以便可以搜索数据库。当我在搜索框中键入一条鱼然后点击搜索时,它会抛出一个我无法弄清楚的错误。我的数据库被称为“采购矩阵”。这张桌子叫做“鱼”。这是我为搜索功能所做的代码;
@ { var db = Database.Open(" Sourcing Matrix"); var selectCommand =" SELECT * FROM Fish&#34 ;; var searchTerm ="&#34 ;;
if(!Request.QueryString["searchField"].IsEmpty() ) { selectCommand = "SELECT * FROM Fish WHERE Fish = @0"; searchTerm = Request.QueryString["searchField"]; } if(IsPost){ var selectedData = db.Query(selectCommand, searchTerm); } } <h1>Search for Fish stored in the Database</h1>
搜索: 搜索
@if(!Request.QueryString["searchField"].IsEmpty() ){ foreach(var row in db.Query(selectCommand, searchTerm)) { <div class="col_12 box"> <form method="post"> <!--Entry in Search box--> </form> </div> } } else { <div class="col_12 box"> <form method="post"> <!--No entry in Search Box--> </form> </div> }
这是返回的错误:
列名无效。 [节点名称(如果有)=,列名= Fish]描述:期间发生了未处理的异常 执行当前的Web请求。请查看堆栈跟踪 有关错误及其来源的更多信息 代码。
异常详细信息:System.Data.SqlServerCe.SqlCeException:列 名称无效。 [节点名称(如果有)=,列名=鱼]
来源错误:
第25行:第26行:
@if(!Request.QueryString [&#34; searchField&#34;] .IsEmpty()){Line 27:
foreach(db.Query中的var行(selectCommand,searchTerm)){第28行:
第29行:
我尝试了各种不同的列名,它们可以阻止错误发生,但它们也不会返回任何结果。对我来说唯一合乎逻辑的事情就是让整个表格可供选择,以便搜索公共名称,拉丁名称或捕获区域,而不仅仅是来自一列的信息。
答案 0 :(得分:0)
您的问题涉及sql SELECT语句的WHERE子句:SQL WHERE Clause。
WHERE子句接受许多比较运算符,但始终必须指定要搜索的列,并使用OR运算符链接许多搜索条件。
另一个问题是=运算符搜索完全匹配;如果要搜索模式,则必须使用LIKE运算符和&#34;%&#34;用于在模式之前和之后定义通配符(缺少字母)的符号。
因此,如果你的Fish表有一个名为&#34的列;通用名&#34;和一个名为&#34的列;拉丁名&#34;并且您希望在两列中的一列中搜索包含给定模式的所有行,您的代码应为:
selectCommand = "SELECT * FROM Fish WHERE [common name] LIKE @0 OR [latin name] LIKE @0";
searchTerm = "%" + Request.QueryString["searchField"] + "%";
<强>被修改强>
您的错误可能是由最终的OR产生的。您的查询应以&#34; ....或[Reason] LIKE @ 0&#34;结束。我建议尝试搜索有限数量的字段并测试它是否有效,逐渐添加其他字段。
无论如何,通常不会以这种方式搜索关系数据库。有一些功能,如SQL Server全文搜索,或产品,如Apache Solr,或数据库类别,如非关系数据库,可以更好地实现这一目标。
对于&#34;标准方式&#34;使用WebMatrix过滤Sql Ce表请查看这篇好文章:Displaying Search Results In A WebGrid。