0

データベースに挿入された直後に、別のページのエントリの値を照会するとエラーが発生します。エラーは次のとおりです。

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

スタック トレースは次のようになります (これが役立つかどうかはわかりません)。

[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:   

このエラーは、ユーザーが自分のエントリをデータベースに「保存」した直後に発生しますが、散発的かつ一見ランダムに発生するため、このエラーの理由を見つけることができないようです。ページは、そのエントリの一意の主キーの値を照会しようとします。上記のセッション変数内に保存されている値は、新しいエントリをデータベースに挿入するために以前に使用された値から保存されています (主キーは「ID」であり、値は毎回自動的にインクリメントされるため、この方法で行う必要があります)。エントリー追加)。

私がやろうとしていることを行うためのより良い (より簡単な) 方法があるかもしれませんが、主キーだけで単純に MAX (集計関数) を使用するよりも、この方法で行う方が一貫性があると思いました。

この問題については、おそらくもっと多くの情報を提供できますが、このページに不必要な情報を詰め込みたくはありません (まだ行っていない場合)。他に提供できるものがあれば教えてください。

さらにいくつかのメモ:

'Session["gDateLastModified"]' は、JavaScript を使用して自動的にプロットされるフォームのフィールドから取得されるため、この値 (秒単位まで正確) は (このクエリの他のすべての変数と同様に) 値と一致する必要があります。データベースに入力されました (はい、ユーザーが JavaScript をオンにして正しく機能していることは確かです)。

また、おそらく明らかですが、101 行目の QueryValue コマンドには、もちろんパラメーター化されたクエリを使用して選択クエリ文字列として最初の引数があり、残りの引数は、データベース内の行を取得するために一致する必要があります。

このエラーはたまにしか発生しないことに注意してください。

情報を追加しすぎた場合 (または何かを省略した場合) は本当に申し訳ありませんが、この問題が何であるかをどこから推測し始めればよいかわかりません。他に提供できるものがあれば教えてください。

アップデート

今のところ私が知っているのは、文字列が「IsPost」である限り意図的に入力され、その文字列が問題のセッション変数を直接入力するために使用されるということだけです。セッション変数が実際には Cookie であることは知っていますが、誰も手動でそれらをクリアしていないことは確かです (そして、送信ボタンを押した後、次のページが読み込まれる前に、このプロセスの途中でそれを行う必要があります)。この値がクリアされる原因として他に何が考えられるでしょうか? commandText は、db.QueryValue 中にクエリ文字列の値が渡される変数だと思いますが、これは正しいですか?

4

1 に答える 1

1

それらを使用する前に、セッションに実際に値があることを確認します。

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

問題を見つけるのに役立つように、適切な追加情報を追加 (および独自の種類の例外を作成) できます。しかし、これが問題だと思います - セッションには期待する値が含まれていません。

于 2012-12-10T14:42:56.160 に答える