1

テーブルからレコードのリストを取得しようとしていますが、foreachループ内updateでレコードを1つずつ取得しようとしています。

これが私のコードです

     public IEnumerable<MessageOut> GetSMSInformation()
        {
            using (var db = new DataClasses1DataContext())
            {
                var sms = db.MessageOuts.Where(msg => msg.msgstatus.Equals("Pending")).Select(msg => msg);
                return sms.ToList();
            }
        }



     public void StartSMSSending()
        {
            var information = GetSMSInformation();

            foreach (var sms in information)
            {
                SendSMS(sms.reciever, sms.msg);
                UpdateRecords(sms,"Delivered", DateTime.Now);
            }
        }

   public void UpdateRecords(MessageOut sms, string msgStatus, DateTime sentTime)
        {
            using (var db = new DataClasses1DataContext())
            {
                sms.msgstatus = msgStatus;
                sms.senttime = sentTime;
                db.SubmitChanges();
            }
        }

レコードが更新されないだけで、エラーも発生しません。

誰かがこれを手伝ってくれますか?

4

3 に答える 3

7

Linq2Sqlクラスで更新操作を実行するには、コンテキストを存続させる必要があります。上記の例では、usingステートメント内に選択範囲を含めるため、レコードが返され、コンテキストがダンプされます。更新を行うと、新しいコンテキストが存在するため、オブジェクトに変更が登録されることはありません。これを行う方法は、コンテキストをよりグローバルなオブジェクトにするか、パラメーターとして渡すことです。

public IEnumerable<MessageOut> GetSMSInformation(DataContext context)
{
    var sms = context.MessageOuts.Where(
        msg => msg.msgstatus.Equals("Pending")).Select(msg => msg);
    return sms.ToList();
}

public void StartSMSSending()
{
    using (var db = new DataClasses1DataContext())
    {
        var information = GetSMSInformation(db);

        foreach (var sms in information)
        {
            SendSMS(sms.reciever, sms.msg);
            UpdateRecords(sms,"Delivered", DateTime.Now, db);
        }
    }
}

public void UpdateRecords(MessageOut sms, string msgStatus, DateTime sentTime, DataContext context)
{
    sms.msgstatus = msgStatus;
    sms.senttime = sentTime;
    context.SubmitChanges();
}

または、これを行うことができます(私の好みの方法):

public IEnumerable<MessageOut> GetSMSInformation()
{
    var sms = Context.MessageOuts.Where(
        msg => msg.msgstatus.Equals("Pending")).Select(msg => msg);
    return sms.ToList();
}

public void StartSMSSending()
{
    var information = GetSMSInformation(db);

    foreach (var sms in information)
    {
        SendSMS(sms.reciever, sms.msg);
        UpdateRecords(sms,"Delivered", DateTime.Now, db);
    }
}

public void UpdateRecords(MessageOut sms, string msgStatus, DateTime sentTime)
{
    sms.msgstatus = msgStatus;
    sms.senttime = sentTime;
    Context.SubmitChanges();
}

private DataClasses1DataContext _context = null;
public DataClasses1DataContextContext
{
    get
    {
        return _context ?? (_context = new DataClasses1DataContext());
    }
}
于 2012-10-09T11:47:05.640 に答える
3

このDBコンテキストからデータを抽出しています。

    public IEnumerable<MessageOut> GetSMSInformation()
    {
        using (var db = new DataClasses1DataContext())
        {
            var sms = db.MessageOuts.Where(msg => msg.msgstatus.Equals("Pending")).Select(msg => msg);
            return sms.ToList();
        }
    }

次に、以前のDBコンテキストからデータを更新し、別のDBコンテキストに変更を送信します。

    public void UpdateRecords(MessageOut sms, string msgStatus, DateTime sentTime)
    {
        using (var db = new DataClasses1DataContext())
        {
            sms.msgstatus = msgStatus;
            sms.senttime = sentTime;
            db.SubmitChanges();
        }
    }

DBコンテキストを参照として渡すか、クラスのメンバーとして保持するのが最適です。これにより、クラスインスタンスに対して単一のdbコンテキストインスタンスが保証されます。

私の提案は次のとおりです。

class SmsCenter
{
        private DataClasses1DataContext _dbContext;

        public SmsCenter()
        {
            _dbContext = new DataClasses1DataContext();
        }

        public IEnumerable<MessageOut> GetSMSInformation()
        {
            var sms = _dbContext.MessageOuts.Where(msg => msg.msgstatus.Equals("Pending")).Select(msg => msg);
            return sms.ToList();
        }



        public void StartSMSSending()
        {
            var information = GetSMSInformation();

            foreach (var sms in information)
            {
                SendSMS(sms.reciever, sms.msg);
                UpdateRecords(sms,"Delivered", DateTime.Now);
            }
        }

        public void UpdateRecords(MessageOut sms, string msgStatus, DateTime sentTime)
        {
            sms.msgstatus = msgStatus;
            sms.senttime = sentTime;
            _dbContext.SubmitChanges();
        }
}
于 2012-10-09T11:46:48.783 に答える
1

「sms」オブジェクトをdbに関連付けないでください。

            sms.msgstatus = msgStatus;
            sms.senttime = sentTime;
            db.MessageOut.Add(sms);
            //or
            db.MessageOut=sms;
            db.SubmitChanges();
于 2012-10-09T12:01:07.927 に答える