Где вызвать метод для автоматического увеличения кредита

#c# #methods

Вопрос:

Мне удалось создать метод для увеличения остатка по кредиту человека каждые 30 дней, но я не знаю, где в приложении Windows forms на C# вызвать этот метод, чтобы баланс по кредиту постоянно пересчитывался, чтобы его можно было увеличить. Должен ли я вызывать его при загрузке основной формы? или все формы, связанные с кредитом?

если вам интересно, метод выглядит следующим образом:

 public static void AutoIncrementAndFlag()  {  string select = "select cusnumber,loandate from loan where loanstatus = 'Active'";  SqlDataReader readnumberanddate = GetData(select).ExecuteReader(CommandBehavior.CloseConnection);  SortedListlt;string, stringgt; numberanddate = new SortedListlt;string, stringgt;();  while (readnumberanddate.Read())  {  numberanddate.Add(readnumberanddate["cusNumber"].ToString(), readnumberanddate["loandate"].ToString());  }  readnumberanddate.Close();  foreach(var key in numberanddate.Keys)  {  DateTime datetaken = DateTime.Parse(numberanddate[key]);  DateTime currentdate = DateTime.Now;  TimeSpan daysbetween = currentdate - datetaken;  string diff2 = daysbetween.ToString("%d");//convert the time you found into a single digit by turning it into a string  int intdiff = int.Parse(diff2);//convert number of days from string format to be able to do math on it  int res = intdiff / 30;//now divide the days by 30 and use the result in a loop as I will below  int resflag = res % 60;  if (res gt; 0)  {    string getbal = $"select loanbalance from Loan where cusNumber='{key}' AND loanstatus='Active'";  SqlDataReader readbalance = GetData(getbal).ExecuteReader(CommandBehavior.CloseConnection);  Listlt;stringgt; balance = new Listlt;stringgt;();  while (readbalance.Read())  {  balance.Add(readbalance["loanbalance"].ToString());  }  readbalance.Close();  int count = 0;  double loanbalance = double.Parse(balance[0]);  while (count lt; res)  {  loanbalance = loanbalance   0.10 * loanbalance;   }  //now build my update string  string update = $"UPDATE Loan set loanbalance =@1 where cusnumber=@2 AND loanstatus=@3";    SqlCommand com = new SqlCommand(update, dbase.Connected());  com.Parameters.AddWithValue("@1", loanbalance);  com.Parameters.AddWithValue("@2", key);  com.Parameters.AddWithValue("@3",statusactive);  com.ExecuteNonQuery();  //now loan has been automatically incremented I just need to know where to locate methods now  }  if (resflag gt;= 2)  {  //we flag customer red here  string update = "UPDATE customer set flag =@1 where cusnumber =@2 ";  SqlCommand com = new SqlCommand(update,dbase.Connected());  com.Parameters.AddWithValue("@1", "Red");  com.Parameters.AddWithValue("@2", key);  }      }  }  

Метод создается в классе под названием Регистрация, и ниже показано, как выглядит таблица в представлении таблицы займов

Комментарии:

1. Примечание: вам разрешено использовать текстовые имена в параметрах SQL; "UPDATE Loan set loanbalance = @loanbal where cusnumber=@cusno AND loanstatus=@stat" . В вашем коде в другом месте есть примеры разумного именования переменных, например TimeSpan daysbetween = currentdate - datetaken; . — нет никаких штрафов и только плюсы в применении разумной стратегии именования везде

2. //convert the time you found into a single digit by turning it into a string — также стоит отметить, что этого не следует делать; не используйте строку в качестве некоторого промежуточного пути для вещей, которые могут и должны оставаться числами. Временной интервал имеет .Days свойство, которое представляет собой количество целых дней. Он также имеет десятичную .TotalDays дробь, такую как 1.5, которая будет a .Days = 1 and .Hours = 12 . Вам не нужно превращать промежуток времени в строку и обратно в int, чтобы получить количество дней в виде int; .Days это int, и .TotalDays его можно сделать так с помощью приведения (усекает 1,5 до 1)

3. Если вы собираетесь создать метод, который, например, запускает и вычисляет остатки по кредитам, взгляните на его идемпотентность — это означает, что независимо от того, сколько раз вы его запускаете, он не должен приводить к разным результатам для одних и тех же входных данных. Например, не пишите это так, чтобы новая запись добавлялась каждый раз при ее запуске; напишите это так, чтобы существующая запись обновлялась/игнорировалась, а новая запись добавлялась только в том случае, если ее еще нет. Это означает, что пользователи не могут вызвать проблемы, запустив его дважды либо случайно, либо по незнанию.

4. @CaiusJard спасибо, я понял большинство ваших замечаний, и я рад, что узнал больше о промежутке времени. Но возникла еще одна проблема. Метод просто отказывается запускаться , никакого сообщения об ошибке ничего не происходит, он просто загружается, загружается и загружается, но если я закомментирую вызов метода, программа начнет запускаться. В чем может быть проблема?

5. Обычно это указывает на то, что запрос занимает очень много времени. На какой линии это «загружается, загружается и загружается»?