2013-07-29 4 views
1

У меня возникла проблема, когда каждый раз, когда я обновляю свою страницу, выплаченный кредит увеличивается на 500. Я понимаю, что моя логика ошибочна, после 1 месяца с даты подачи заявки на кредит, «loanPaid» увеличится на 500, но я хочу, чтобы каждый следующий месяц он увеличился на 500 долларов. Если кто-нибудь может помочь мне с логикой. Буду премного благодарен. Я думал использовать какой-то цикл, но не знаю, что и как. Я студент-первокурсник, поэтому, пожалуйста, прошу прощения за мой стиль кодирования. СпасибоКак добавить «loanPaid» каждый месяц


public class LoanDAL 
{ 
    string connString = ConfigurationManager.ConnectionStrings["Oakhorizons"].ToString(); 
    public LoanDAL() 
    { 
     // 
     // TODO: Add constructor logic here 
     // 
    } 

    public DataTable getAllLoanInfoDT() 
    { 
     using (SqlConnection conn = new SqlConnection(connString)) 
     { 
      DataTable dt = new DataTable(); 
      SqlCommand cmd2 = new SqlCommand(); 
      cmd2.Connection = conn; 
      // cmd.CommandType = CommandType.StoredProcedure; 
      cmd2.CommandText = "SELECT DISTINCT purchaseDate FROM LoanPortfolio WHERE (custID LIKE 'OH00002') AND (loanType LIKE 'Personal Loan')"; 
      cmd2.Parameters.AddWithValue("@custID", "OH00002"); 
      cmd2.Parameters.AddWithValue("@loanType", "Personal Loan"); 
      conn.Open(); 
      string custID = "OH00002"; 
      SqlDataAdapter da = new SqlDataAdapter(); 
      da.SelectCommand = cmd2; 
      da.Fill(dt); 
      int iMonthNo = int.Parse(System.DateTime.Now.Month.ToString()); 
      DateTime dtDate = new DateTime(2000, iMonthNo, 1); 
      double dMonthNow = Double.Parse(dtDate.ToString("MM")); 
      LoanTableAdapters.LoanPortfolioTableAdapter loanAdapter = new LoanPortfolioTableAdapter(); 
      string LoanDate = loanAdapter.RetrieveData(custID.ToString()).ToString(); 
      string month = dt.ToString(); 

      double dLoanDate = Double.Parse(LoanDate.Substring(3, 2)); 

      if (dMonthNow > dLoanDate) 
      { 
       String sql = "UPDATE LoanPortfolio SET loanPaid = loanPaid + 500"; 
       sql += "WHERE (loanType LIKE 'Personal Loan') AND (custID LIKE 'OH00002')"; 
       cmd2.Connection = conn; 
       cmd2.CommandText = sql; 

       cmd2.ExecuteNonQuery(); 

      } 
      conn.Close(); 
} 
} 

После редактирования:

public DataTable getAllLoanInfoDT() 
{ 
    using (SqlConnection conn = new SqlConnection(connString)) 
    { 
     SqlCommand cmd2 = new SqlCommand(); 
     cmd2.Connection = conn; 
     // cmd.CommandType = CommandType.StoredProcedure; 
     cmd2.CommandText = "SELECT DISTINCT loanUpdateDate FROM LoanPortfolio WHERE (custID LIKE 'OH00002') AND (loanType LIKE 'Personal Loan')"; 
     cmd2.Parameters.AddWithValue("@custID", "OH00002"); 
     cmd2.Parameters.AddWithValue("@loanType", "Personal Loan"); 
     conn.Open(); 
     SqlDataReader myReader = cmd2.ExecuteReader(); 
     DateTime loanUpdateDate = Convert.ToDateTime(myReader); 
     DateTime currDateTime = DateTime.Now; 

     int loanToBeAdded = (((currDateTime.Year - loanUpdateDate.Year) * 12) + currDateTime.Month - loanUpdateDate.Month) * 500; 
     if (loanToBeAdded > 0) 
     { 
      String sql = "UPDATE LoanPortfolio SET loanPaid = loanPaid + " + loanToBeAdded.ToString() + ", loanUpdateDate = " + DateTime.Now.ToString(); 
      sql += " WHERE (loanType LIKE 'Personal Loan') AND (custID LIKE 'OH00002')"; 

      //Execute the above query here 
     } 
     conn.Close(); 

     using (SqlDataAdapter dAd = new SqlDataAdapter("SELECT * FROM LoanPortfolio where custID like 'OH00002'", conn)) 
     { 
      DataTable dTable = new DataTable(); 
      dAd.Fill(dTable); 
      return dTable; 
     } 
    } 
} 
+0

Я не получить то, что вы делаете в вашем коде. Особенно почему вы создаете SqlDataAdapter, заполняете DataTable и просто используете его для преобразования DataTable в строку, что приведет к именам типов?? –

+0

Извините, сэр. Я все еще новичок в этом.Я был бы признателен, если бы вы могли помочь тому, что должно быть правильным способом получения данных в подобной ситуации. – Miguel

+1

Не могли бы вы описать, что именно вы хотите сделать в методе 'getAllLoanInfo' –

ответ

0

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

Решение вашей проблемы должно быть следующим

  1. Во-первых, создать новый столбец в вашей «LoanPortfolio» стол именно «LastUpdatedLoanPaidDate». Тип должен быть Date для этого столбца. Это сохранит дату, когда вы последний раз добавили $ 500 в столбец «loanPaid».

  2. Установите этот столбец так же, как «buyDate», когда вы впервые добавляете строку в таблицу «LoanPortfolio». Поэтому первоначально «purchaseDate» и «LastUpdatedLoanPaidDate» будут такими же.

  3. Fetch только «LastUpdatedLoanPaidDate» вместо «purchaseDate», как

    cmd2.CommandText = "SELECT DISTINCT LastUpdatedLoanPaidDate FROM LoanPortfolio WHERE (custID LIKE 'OH00002') AND (loanType LIKE 'Personal Loan')"; 
    
  4. Предполагая, что там будет только одна запись извлекается из приведенного выше запроса Следующий код должен добавить $ 500 в колонке «loadPaid» один раз каждый месяц

    //Fetch "LastUpdatedLoanPaidDate" here 
    
        //This will be "LastUpdatedLoanPaidDate" coming from database i.e. dt[0][0].ToString(). Hard-coded here for simplicity 
        string strLastUpdatedLoanPaidDate = "07/29/2013"; 
    
        DateTime lastUpdatedLoanPaidDate = Convert.ToDateTime(strLastUpdatedLoanPaidDate); 
        DateTime currDateTime = DateTime.Now; 
    
        //This will make sure that all the previous purchases are also handled and not just previous month's 
        //This is important when you are implementing new logic on existing data 
        int loanToBeAdded = (((currDateTime.Year - lastUpdatedLoanPaidDate.Year) * 12) + currDateTime.Month - lastUpdatedLoanPaidDate.Month) * 500; 
    
        //If loadToBeAdded is zero then need not update database 
        if (loanToBeAdded > 0) 
        { 
         String sql = "UPDATE LoanPortfolio SET loanPaid = loanPaid + " + loanToBeAdded.ToString() + ", LastUpdatedLoanPaidDate = " + DateTime.Now.ToString(); 
         sql += " WHERE (loanType LIKE 'Personal Loan') AND (custID LIKE 'OH00002')"; 
    
         //Execute the above query here 
        } 
    

Там могут быть некоторые вещи, которые мне не хватает в зависимости от ваших требований. Кроме того, для инструкции обновления может потребоваться настройка, поскольку я ее не тестировал, но в целом это должно сделать трюк.

Надеюсь, это помогло.

С уважением,

Samar

+0

Я пробовал ваши коды, и у меня возникла эта проблема: «Невозможно передать объект типа« System.Data.SqlClient.SqlDataReader »для ввода« System.IConvertible ».» Спасибо за ваш ответ, это очень подробно. =) – Miguel

+0

Можете ли вы помочь мне проверить, правильно ли я объявил его после редактирования моей работы? – Miguel

+0

Вы не можете преобразовать читателя напрямую в DateTime. Вам понадобится цикл while в виде SqlDataReader reader = cmd.ExecuteReader(); while (reader.Read()) { DateTime loanUpdateDate = Convert.ToDateTime (читатель [0]); ломать; } – samar

0

Вы также должны указать в таблице, когда вы увеличили кредит в последний раз, и проверить это значение, тоже. Вы можете вставить новый столбец lastLoanIncrease в таблицу LoanPortFolio как char(6) и сохранить месяц и год, когда вы увеличили его. Затем перед тем, как снова увеличить, проверьте его.

0

Вам не нужен цикл.

Ваш вопрос в вашей условной if

//DateTime loanDate = new DateTime(2000, 1, 18); 
DateTime loanDueDate = Foo.GetLoanDueDate(loanId); 

int loanDueMonth = loanDueDate.Month; 
int currentMonth = DateTime.Now.Month; 

if (currentMonth > loanDueMonth) 
    { 
     // update db 
     loanDate.AddMonths(1); 
     Foo.UpdateLoanDueDate(loanId, loanDate); // increase loan due date for next month so that the conditional is true next month. 
    } 
+0

Итак, как мне получить мой «buyDate» для сравнения с датой сейчас? Я не получаю строку «DateTime loanDueDate = Foo.GetLoanDueDate (loanId);». А что такое «Foo» ?. Извините, я все еще новичок для этого. – Miguel

+0

Вы храните его и извлекаете из базы данных. Foo - это примерный класс, который получает и устанавливает дату вашего кредита, вы должны его создать. Вы должны следить за тем, когда кредит должен быть оплачен. –

+0

Так что мне нужно сделать еще один класс под названием «Foo» ?. Я смущенно сэр. Я все еще новичок в этом. – Miguel

Смежные вопросы