0
 dataSet = clsDb.MailData("SELECT * FROM CM_Mail cm WHERE cm.[ActualTime] < '" + DateTimeOffset.UtcNow + "' ", CommandType.Text);
        DataTable datatablepending = (from ds in dataSet.Tables[0].AsEnumerable() where ds.Field<string>("Status") == MailStatus.Pending.ToString() select ds).CopyToDataTable();
        DataTable datatableInprogress = (from ds in dataSet.Tables[0].AsEnumerable() where ds.Field<string>("Status") == MailStatus.Inprogress.ToString() select ds).CopyToDataTable();

        if (datatablepending.Rows.Count != 0)
        {
            for (int i = 0; i < datatablepending.Rows.Count; i++)
            {

                dataSet = clsDb.MailData("UPDATE CM_Mail SET [Status] = '" + updateStatus + "',LastProccessedTime = '" + DateTimeOffset.UtcNow.ToString() + "' WHERE Id='" + datatablepending.Rows[i]["Id"].ToString() + "'", CommandType.Text);
            }

        }
        if (datatableInprogress.Rows.Count != 0)
        {
            for (int i = 0; i < datatableInprogress.Rows.Count; i++)
            {
                dataSet = clsDb.MailData("UPDATE CM_Mail SET [Status] = '" + updateStatus + "',SentTime = '" + DateTimeOffset.UtcNow + "',LastProccessedTime = '" + DateTimeOffset.UtcNow.ToString() + "' WHERE Id='" + datatableInprogress.Rows[i]["Id"].ToString() + "'", CommandType.Text);
            }



        }

私がこれをやろうとすると、datatableInprogress常に行がない場合があります。実行時に、「データソースがありません」という例外が発生します。なんで?そして、この問題を解決するにはどうすればよいですか?

4

1 に答える 1

0

条件の行がない場合は、DataTable 構造を複製するだけです。

var pendingRows = 
  dataSet.Tables[0].AsEnumerable()
         .Where(r => r.Field<string>("Status") == MailStatus.Pending.ToString());

DataTable datatablepending = pendingRows.Any() ? pendingRows.CopyToDataTable() :
                                                 dataSet.Tables[0].Clone();

ところで、なぜ DataTable が必要なのですか? ID取得できます!

var pendingIds = 
     from r in dataSet.Tables[0].AsEnumerable()
     where r.Field<string>("Status") == MailStatus.Pending.ToString()
     select r.Field<int>("Id");

申し訳ありませんが、ループで dataSet を割り当てている理由はわかりませんが、これを再現するコードは次のとおりです。

string updateStringFormat = 
 "UPDATE CM_Mail SET [Status] = '{0}',LastProccessedTime = '{1}' WHERE Id='{2}'";

foreach(var id in pendingIds)
{
    var commandText = String.Format(updateStringFormat, updateStatus, DateTimeOffset.UtcNow, id);
    dataSet = clsDb.MailData(commandText, CommandType.Text);
}
于 2013-03-15T07:32:52.297 に答える