我正在C#.net windows应用程序中创建一个银行管理系统应用程序。 与所有银行一样,账户持有人(储蓄银行账户)在月末支付利息(例如当前余额的3.5%)。 我准备了它的代码。
public void frmbankmg_Load(object sender, EventArgs e)
{
try
{
Transact();
DateTime date = DateTime.Now.Date;
//DateTime date = DateTime.Parse("Nov 1,2010");
int day = date.Day;
double Account = 0, Balance = 0;
string status = "";
if (day == 1)
{
SqlConnection conn = ConnectionString();
string s = "select Account_No,Balance_Amount,Status from SavingAcct";
SqlCommand cmd = new SqlCommand(s, conn);
conn.Open();
SqlDataReader rd = cmd.ExecuteReader();
while (rd.Read())
{
Account = Convert.ToDouble(rd["Account_No"].ToString());
Balance = Convert.ToDouble(rd["Balance_Amount"].ToString());
status = rd["Status"].ToString();
if (status == "Open")
{
Interest(Account, Balance);
}
}
conn.Close();
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
private void Transact()
{
try
{
DateTime date = DateTime.Now.Date;
int month = date.Month;
int year = date.Year;
int days = DateTime.DaysInMonth(year, month);
if (days == date.Day)
{
double Account = 0, Balance = 0;
string status = "";
SqlConnection conn = ConnectionString();
string s = "select Account_No,Balance_Amount,Status from SavingAcct";
SqlCommand cmd = new SqlCommand(s, conn);
conn.Open();
SqlDataReader rd = cmd.ExecuteReader();
while (rd.Read())
{
Account = Convert.ToDouble(rd["Account_No"].ToString());
Balance = Convert.ToDouble(rd["Balance_Amount"].ToString());
status = rd["Status"].ToString();
if (status == "Open")
{
string Transaction = "No";
string s1 = "insert into Transactions(Account_No,Date,Current_Balance,Month,Year,Transact) values('" + Account + "','" + date + "','" + Balance + "','" + month + "','" + year + "','" + Transaction + "'";
SqlCommand cmd1 = new SqlCommand(s1, conn);
conn.Open();
cmd1.ExecuteNonQuery();
conn.Close();
}
}
conn.Close();
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
private void Interest(double Acctno,double balance)
{
try
{
DateTime date = DateTime.Now.Date;
//DateTime date = DateTime.Parse("Nov 1,2010");
int month = date.Month;
int year = date.Year;
month = month - 1;
SqlConnection conn = ConnectionString();
string s = "select Date,Current_Balance from Transactions where Account_No='" + Acctno + "' and Month='" + month + "'";
SqlDataAdapter da = new SqlDataAdapter(s, conn);
DataSet ds = new DataSet();
da.Fill(ds, "Transactions");
int totalRows = ds.Tables["Transactions"].Rows.Count;
conn.Open();
DateTime date1 = DateTime.Now, date2, date3;
int row, row1 = -1, row2 = -1, day1, day2;
for (row = 0; row < totalRows; row++)
{
date1 = (DateTime)ds.Tables["Transactions"].Rows[row][0];
int d = date1.Day;
if (d <= 10)
{
date2 = date1;
day1 = d;
row1 = row;
}
else
{
date3 = date1;
day2 = d;
row2 = row;
}
}
double Bal1 = 0;
if (row1 == -1)
{
Bal1 = NoTransactions_Bet1_and_10(Acctno, month);
}
else
{
Bal1 = Convert.ToDouble(ds.Tables["Transactions"].Rows[row1][1]);
}
double Bal2 = Convert.ToDouble(ds.Tables["Transactions"].Rows[row2][1]);
double credit = 0;
if (Bal1 <= Bal2)
{
credit = (3.5) / 100 * Bal1;
balance = balance + (credit);
}
else
{
credit = (3.5) / 100 * Bal2;
balance = balance + (credit);
}
string str = "update SavingAcct set Balance_Amount='" + balance + "' where Account_No='" + Acctno + "'";
SqlCommand cmd = new SqlCommand(str, conn);
cmd.ExecuteNonQuery();
string comment = "By Interest";
string transact = "Yes";
string str1 = "insert into Transactions(Account_No,Date,Particulars,Credit,Current_Balance,Month,Year,Transact) values('" + Acctno + "','" + DateTime.Now.Date + "','" + comment + "','" + credit + "','" + balance + "','" + month + "','" + year + "','" + transact + "')";
SqlCommand cmd1 = new SqlCommand(str1, conn);
cmd1.ExecuteNonQuery();
conn.Close();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
private double NoTransactions_Bet1_and_10(double Acct_no,int month)
{
try
{
month = month - 1;
string s = "select * from Transactions where Account_No='" + Acct_no + "' and Month='" + month + "'";
SqlConnection con = ConnectionString();
SqlDataAdapter da = new SqlDataAdapter(s, con);
DataSet ds = new DataSet();
da.Fill(ds, "Transactions");
con.Open();
int Tot_row = ds.Tables["Transactions"].Rows.Count;
double Balance = Convert.ToDouble(ds.Tables["Transactions"].Rows[Tot_row - 1][6]);
con.Close();
return Balance;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
当我在表单加载事件中执行interest()方法时,此方法将在应用程序启动的月份的第一天运行。 但每次关闭并重新启动我的应用程序时,它也会在同一天运行。 因此,每当申请在每月的第1天开始时,将支付利息。 由于没有特定的时间启动应用程序,所以我无法使用时间逻辑。 你能帮我解决这个问题吗?
答案 0 :(得分:5)
您无法保证任何人都可以运行您的应用程序,更不用说当运行它时。所以这样的逻辑应该在应用程序之外,在Windows服务或甚至数据库作业中处理,您可以依赖它在某个时间间隔或某个特定时间运行。
答案 1 :(得分:2)
您可以简单地将运行该函数的最后日期写回数据库,并在函数开头检查该日期。
答案 2 :(得分:2)
通常,您可以通过数据库本身的预定作业而不是客户端代码执行此操作。
答案 3 :(得分:2)
这似乎是一项系统维护任务。当然,你不希望人们在有人打开申请之前必须等到他们的储蓄利息 - 如果这个月的最后一天是银行假日,或者每个人出于某种原因正在做其他事情。不要将这些类型的任务放在windows.forms应用程序中 - 将其设置为每月运行一次的服务器上的计划任务。
答案 4 :(得分:1)
不要在应用程序启动时运行它,不要试图这样做。
如果必须,请单击按钮运行它。并且还保存它运行的状态,这样它就不会发生两次。
也许还会保存生成的值,以便你有一些发生的事情的记录,如果要再次运行,为了让我们说修改,你有一个修改屏幕,以便可以更新特定的帐户。
你应该把它作为一个自己调度的服务运行,或者至少是一个可以由Windows调度程序运行的应用程序,而无需人工干预。
谁将按下1月1日的按钮
答案 5 :(得分:0)
你设置了一个无头控制台应用程序,它在执行时会自动运行代码(将错误记录到某个文件的错误点),并设置Windows Task Scheduler每月一次调用它(可能是12个) :1月1日上午1点或某事。)