0

DBにエントリが存在するかどうかをチェックするifステートメントがあります。コードは、電子メールアドレスがすでに存在するかどうかを正しくチェックしますが、電子メールが存在しない場合、エラーが発生します。

Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: Cannot perform runtime binding 
on a null reference at CallSite.Target(Closure , CallSite , Object ) at 
ASP._Page__footer_cshtml.Execute()

しかし、既存の電子メールを取得するコードを削除すると、次の行になります。

var getrecord = db.QuerySingle("Select Email from Registrations where email = @0", email); 
emailexists = getrecord.email;

データは問題なくDBに保存されます。同じDbヘルパーを使用しているためかどうかわかりませんか?

  try
            {
                var db = Database.Open("MiniDB"); 
                var getrecord = db.QuerySingle("Select Email from Registrations where email = @0", email); 
                emailexists = getrecord.email;
                if (emailexists != ""){
                    msg = "This Email address is already registed";    
                    saved = false;
                }
                else {
                    var insertCommand = "INSERT INTO Registrations (Email, Name, regDate) VALUES(@0, @1, @2)"; 
                    db.Execute(insertCommand, email, name, regDate); 
                    saved = true;
                }
            }
            catch (Exception ex)
            {

                msg = ex.ToString();
                saved = false;
            }
4

1 に答える 1

0

WebMatrix でデータベース内の値を取得 (その後テスト) しているときに、データベース内のフィールドに応じて、データベースにクエリを実行し、値を変数 ""、null、および System.DBNull に格納した後に遭遇したことが 1 つあります。値は 3 つの異なるものであり、空の文字列または単に null をチェックすると、例とほぼ同じようにエラーがスローされました。

うまくいけば、私はこれを手伝っています (これはあなたの問題ではないかもしれませんが、DBNull を見たことがなかったので、かなり長い間、同様の状況で私を困惑させたことは知っています)。

この DBNull 値は、データベースからフィールド値を割り当てた変数に移動しました。これは、セッション変数であり、オブジェクトのように扱われたためです。この DBNull 値を通常の変数に格納できるかどうかはわかりません (通常の null に変換されません)。また、当時はバイナリデータ(画像)を使用していたと思いますが、それが違いを生むかどうかはわかりませんが...

最後に、私のコードでは、(データベース内の) フィールドが空、null などであることを確認するときに、次のようなものを使用しました (通常の変数の代わりにセッション変数のみを使用):

if (emailexists != "" && emailexists != null && emailexists != System.DBNull.Value)
{
    //code goes here.
}

これが役立つことを願っています!

于 2012-11-06T18:00:31.343 に答える