使用带有Webmatrix的QueryValue获取commandText值不能为null或为空

时间:2012-12-10 14:33:24

标签: c# sql sql-server-ce webmatrix

我在查询另一个页面上的条目值时收到错误,就在它插入数据库之后。错误如下:

Value cannot be null or an empty string.
Parameter name: commandText

Stack Trace看起来像这样(不确定这是否有帮助):

[ArgumentException: Value cannot be null or an empty string.
Parameter name: commandText]
   WebMatrix.Data.Database.QueryValue(String commandText, Object[] args) +20791
   ASP._Page_EntryViewer_cshtml.Execute() in c:\Users\administrator.OKMCITY\Documents\My Web Sites\Persons Of Interest\EntryViewer.cshtml:101
   System.Web.WebPages.WebPageBase.ExecutePageHierarchy() +197
   System.Web.WebPages.WebPage.ExecutePageHierarchy(IEnumerable`1 executors) +69
   System.Web.WebPages.WebPage.ExecutePageHierarchy() +151
   System.Web.WebPages.StartPage.RunPage() +17
   System.Web.WebPages.StartPage.ExecutePageHierarchy() +62
   System.Web.WebPages.WebPageBase.ExecutePageHierarchy(WebPageContext pageContext, TextWriter writer, WebPageRenderingBase startPage) +76
   System.Web.WebPages.WebPageHttpHandler.ProcessRequestInternal(HttpContextBase httpContext) +114

错误发生的行(第101行):

Line 99:     var db = Database.Open("PersonsOfInterest");
Line 100:
Line 101:    var activeID = db.QueryValue((string)Session["activeEntrySelectQueryString"], (string)Session["gPOIName"], (string)Session["gDateLastModified"], (string)Session["gGender"], (string)Session["gRace"], (string)Session["gHeight"], (string)Session["gWeight"], (string)Session["gHairColor"], (string)Session["gEyeColor"], (string)Session["gDOB"], (string)Session["gAge"], (string)Session["gSS"], (string)Session["gDL"], (string)Session["gDOC"], (string)Session["gVehicleTag"], (string)Session["gFBI"], (string)Session["gOfficer"], (string)Session["gAdditionalDescriptors"], (string)Session["gHomePhone"], (string)Session["gAliases"], (string)Session["gSourceOfInformation"], (string)Session["gAddress"], (string)Session["gAddressInformation"], (string)Session["gKnownAssociates"], (string)Session["gVehicleDescription"], (string)Session["gCellPhone"], (string)Session["gCellPhone2"], (string)Session["gCellPhone3"], (string)Session["gPOICautions"], (string)Session["gComments"], (string)Session["gWorkPhone"], (string)Session["gSummarizedIncidents"], (string)Session["gPOILastName"]);
Line 102:    Session["gEntryID"] = activeID;
Line 103:   

我似乎找不到这个错误的原因,因为它发生在用户将他/她的条目“保存”到数据库中之后,但是发生者看似随意而且看似随机。该页面尝试查询该条目的唯一主键的值。存储在上面看到的会话变量中的值是根据以前用于将新条目插入数据库的值存储的(我必须这样做,因为主键“是identity”,并且值会自动增加加入)。

可能有更好(更简单)的方法来做我想做的事情,但我认为这样做比仅仅在主键上使用MAX(聚合函数)更加一致。

我可能会就此问题提供更多信息,但我真的不想用不必要的信息填写此页面(如果我还没有)。如果我还能提供其他任何内容,请告诉我。

还有一些说明:

'Session [“gDateLastModified”]'是从使用JavaScript自动绘制的表单上的字段中获取的,因此该值(精确到第二个)应该(与此查询中的所有其他变量一样)匹配刚输入数据库的值(是的,我确信用户已启用JavaScript并正常运行)。

此外,它可能是显而易见的,但第101行的QueryValue命令将第一个参数作为选择查询字符串,当然使用参数化查询,其余参数是必须匹配以检索行中的行数据库中。

请记住偶尔会出现此错误。

如果我添加了太多信息(或遗漏了一些东西),我真的很抱歉,但我不知道从哪里开始假设这个问题可能是什么,所以不确定什么可以帮助任何试图帮助的人我。如果我还能提供其他任何内容,请告诉我。

更新

我现在所知道的是,只要它是'IsPost',就会故意填充字符串,然后该字符串用于直接填充有问题的Session变量。我知道会话变量实际上是cookie,但很确定没有人手动清除它们(并且他们必须在点击提交按钮之后和下一页加载之前,在此过程的中间某处),还有什么可以导致这个值被清除?我假设commandText是一个在db.QueryValue期间传递我的查询字符串值的变量,这是正确的吗?

1 个答案:

答案 0 :(得分:1)

我会在使用之前检查会话是否实际具有值:

var activeEntrySelectQuery = (string) Session["activeEntrySelectQueryString"];
if (string.IsNullOrEmpty(activeEntrySelectQuery)) {
    throw new ArgumentException("The active entry select query has gone missing.");
}

您可以添加适当的附加信息(并创建自己的异常类型)以帮助您找到问题。但我怀疑这是问题 - 会话不包含您期望的值。