0

Visual Studio 2010とC#およびSQLManagementStudioを使用しています。

私はメールボックス機能に取り組んでいます。

ユーザーが返信ボタンをクリックすると、返信の内容が次のようになるメソッドを作成しました。

private string adjustContentForReply(List<Guid> sender)
    {
        string content = string.Empty;
        messageID = (Guid)Session["messageID"];

        //haal de ontvangers uit de database van het bericht
        List<Guid> receivers = m.bussinesCollection.BussinesMessageReceiver.GetReceivers(messageID);

        //pas de inhoud van het bericht aan met de details van het vorige bericht
        content = "<br /><br />----------------------------------------<br />";
        content += "Ontvangen op: " + m.bussinesCollection.BussinesMessageReceiver.GetMessageReceiver(messageID, boxOwner).DateReceived.ToString() + "<br />";
        content += "Onderwerp: " + m.bussinesCollection.BussinesMessage.GetMessageSubject(messageID) + "<br />";
        content += "Van: " + m.bussinesCollection.BussinesPerson.GetFullName(sender[0]) + "<br />";
        content += "Aan: ";

        //Voeg één of meerdere ontvangers toe aan details
        foreach (Guid rec in receivers)
        {
            content += m.bussinesCollection.BussinesPerson.GetFullName(rec);
            if (receivers.Count() > 1)
                content += "; ";
        }
        content += "<br />";
        content += "----------------------------------------<br /><br />";

        //voeg de inhoud van het vorige bericht aan de content
        content += m.bussinesCollection.BussinesMessage.GetMessageContent(messageID);

        return content;
    }

それは私に行のエラーを与えています

content += "Ontvangen op: " + m.bussinesCollection.BussinesMessageReceiver.GetMessageReceiver(messageID, boxOwner).DateReceived.ToString() + "<br />";

エラーは

オブジェクト参照がオブジェクト インスタンスに設定されていません。

GetMessageReceiver()は次のようになります

public MessageReceiver GetMessageReceiver(Guid msgId, Guid personId)
        {
            var message = from msg in Db.MessageReceivers
                          where msg.MessageID.Equals(msgId) && msg.ReceiverID.Equals(personId)
                          select msg;

          return  message.Count().Equals(1) ? message.First() : null;
        }

デバッグしてmessageIdとBoxOwnerIdを取得し、データベースでクエリを実行すると、指定された組み合わせに対して2つの行が表示されます。

誰かが私を助けることができますか?

問題はそこから解決され、返信用のメッセージを作成できるようになりました。しかし、送信ボタンのページをクリックすると、同じエラーがそこにスローされます。

4

3 に答える 3

3

あなたがしたい

return message.First();

それ以外の

return  message.Count().Equals(1) ? message.First() : null;

null結果が複数ある場合は、コードが返されます。そして、あなたはあなたが提供したIDのためにデータベースに2つの行があると言います、それであなたは得ていnullます...

メッセージが常にではない参照を返す場合、コードは正しく機能するように構造化されているため、ではFirstなくを使用する必要があります。FirstOrDefaultnull

于 2012-10-01T07:20:32.720 に答える
1

その行でNullReferenceExceptionが発生した場合:

content += "Ontvangen op: " + m.bussinesCollection.BussinesMessageReceiver.GetMessageReceiver(messageID, boxOwner).DateReceived.ToString() + "<br />";

その後、nullほとんどどこにでもある可能性があります。この場合を除いて:明らかにnullがないm.bussinesCollection.BussinesMessageReceiverか、数行前にエラーが発生したはずです。

したがって、GetMessageReceiverまたははDateReceivednullです。

正確に1つのメッセージがない場合(つまり、0または> = 2)、GetMessageReceiverメソッドがnullを返すことを知っていますか?

于 2012-10-01T07:22:00.320 に答える
0

の戻り値をチェックしていないため、エラーが発生しますGetMessageReceiver()GetMessageReceiverが返されないことを確認するnullか、関数を使用する前に戻り値を確認する必要があります。

MessageReceiver receiver = m.bussinesCollection.BussinesMessageReceiver.GetMessageReceiver(messageID, boxOwner);
if (receiver == null)
    // handle error
    return;

content += "Ontvangen op: " + receiver.DateReceived.ToString() + "<br />";
于 2012-10-01T07:20:50.697 に答える