Option 1 is your best bet, but:-
a) The method accessing the database really should return a new BankAccount model object, rather than setting the properties of this
:-
class BankAccountModel
{
public string AccountNumber { get; set; }
public string AccountName { get; set; }
public string Bank { get; set; }
public string AccountType { get; set; }
public static BankAccountModel GetAccount(string accountNumber)
{
var account = new BankAccountModel()
{
AccountNumber = accountNumber,
};
using (SqlConnection newCon = new SqlConnection(db.GetConnectionString))
{
...
account.AccountName = rdr.GetString(1);
account.Bank = rdr.GetString(2);
account.AccountType = rdr.GetString(3);
}
return account;
}
}
b) If you're making a WPF/Winforms/Webforms application, you'll want to investigate Data Binding rather than manually setting the values of your controls to the values of your model.
var account = BankAccountModel.GetAccount(accountNumber);
myControl.DataSource = account;
(Or if you're making an ASP.NET MVC application, you just pass your model to the view):-
var model = BankAccountModel.GetAccount(accountNumber);
return View(model);
c) It's usually helpful if your model doesn't have to concern itself with the way that it's being persisted. Eventually you'll want to pull the "GetAccount" method out of your Model class and into some dedicated data access code (e.g. a BankAccountRepository). This gives you better flexibility for situations where you need to control the lifecycle of your managed resources (e.g. the database connection), or if you need to obtain BankAccountModels from multiple sources:-
class BankAccountModel
{
public string AccountNumber { get; set; }
public string AccountName { get; set; }
public string Bank { get; set; }
public string AccountType { get; set; }
}
class BankAccountRepository
{
public BankAccountModel GetAccount(string AccountNumber)
{
...
}
}