#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. Обычно это указывает на то, что запрос занимает очень много времени. На какой линии это «загружается, загружается и загружается»?