【问题标题】:C# OleDbDataReaderC# OleDbDataReader
【发布时间】:2012-04-21 18:26:48
【问题描述】:

如何更改:

public void Charge(string bankaccountnumber, decimal moneyamount)
    {
       foreach (Bankaccount bankaccountInProcess in bankaccount)
        {
            if (bankaccountnumber == bankaccountInProcess.Bankaccountnumber)

                bankaccountInProcess.ChargeFromBankAccount(moneyamount);

        }

        return;
}

要使用 OleDbDataReader 而不是那个 foreach?

当要求输入要从银行帐户中提取的金额然后从 BalanceAmountAvailableForWithdrawal(以及 WholeAccountBalance)中提取时,在控制台中输入moneyamount。但是access文件中没有moneyamount列,只有WholeAccountBalance和BalanceAmountAvailableForWithdrawal货币列。

以下是我如何在课堂的不同部分更改它的示例:

public bool IdentifyUser(string bankAccountnumber, int passWord)
    {


        connection = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0; Data Source= C:\\asd.accdb");
            connection.Open();


        OleDbCommand getOne = new OleDbCommand();
        getOne.Connection = connection;
        getOne.CommandText = "SELECT accounNum, pinCode FROM Account WHERE accountNum = '" +
             bankAccountnumber +"'";
        OleDbDataReader readOne = readOne.ExecuteReader();
        if (readOne.Read())
        {
            int GottenPassWord = (int)readOne["pinCode"];
            if (GottenPassWord == passWord)

            return true;
        }

        else
        {
            Console.WriteLine("Account was not found");            
        }
        connection.Close();
        return false;

    }

这是我到目前为止的想法:

public void Charge(string bankaccountnumber, decimal moneyamount)
    {

        connection = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0; Data Source= C:\\asd.accdb");
            connection.Open();

        OleDbCommand getOne = new OleDbCommand();
        getOne.Connection = connection;
        getOne.CommandText = "SELECT accounNum, WholeAccountBalance, BalanceAmountAvailableForWithdrawal FROM Account WHERE accounNum = '" +
             bankaccountnumber + "'";
        OleDbDataReader readOne = readOne.ExecuteReader();
        if (readOne.Read())
        {
        // i dont know what to put here to make this do the same thing as the foreach did

        return;

        }

        else
        {
            Console.WriteLine("Charging did not work");

            return;

        }
}

【问题讨论】:

  • 对我来说,不清楚您想要实现什么 - 首先:因为您的示例是用您的母语而不是英语,其次:因为您想使用 @987654324 替换某些“内存中”集合上的导航@loop 和OleDbDataReader,用于对数据库中的记录进行操作。如果您在数据库中有由您的集合表示的数据,则使用正确的 SELECT 查询从数据库中提取它,就像您在第二个示例中所做的那样(只需使用 while (reader.Read()) 循环来连续读取所有记录)。
  • 对不起,现在是英文的。 foreach 之前所做的是它读取帐户数组,其中我拥有所有帐户信息,例如我们的银行帐户号码、余额等,但现在我试图用访问数据库替换它。我希望这有助于理解我在这里问什么。
  • 私人账户[] 账户; public BankAccountDatabase() { accounts = new Account[2];账户[0] = 新账户("500500-8080", 1111, 1000m, 1000m); account[1] = new Account("1", 1, 1000m, 2000m); }

标签: c# visual-studio ms-access oledb oledbdatareader


【解决方案1】:

如果您的 Access 表 Account 有 3 列:accounNumWholeAccountBalanceBalanceAmountAvailableForWithdrawal,那么您基本上应该这样做(我也对其进行了一些更正和更新)。只是检查它,因为我没有测试它。

public void Charge(string bankaccountnumber, decimal moneyamount)
{
    using (OleDbConnection connection = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0; Data Source= C:\\asd.accdb"))
    {
        connection.Open();

        using (OleDbCommand cmd = new OleDbCommand())
        {
            cmd.Connection = connection;
            cmd.CommandText = "SELECT accounNum, WholeAccountBalance, BalanceAmountAvailableForWithdrawal FROM Account WHERE accounNum = @accNum";
            cmd.Parameters.AddWithValue("@accNum", bankaccountnumber);

            using (OleDbDataReader reader = cmd.ExecuteReader())
            {
                if (reader.Read())  //assuming accounNum is an unique field (primary key)
                {
                    decimal balanceAmountAvailableForWithdrawal = Convert.ToDecimal(reader["BalanceAmountAvailableForWithdrawal"]);
                    if (balanceAmountAvailableForWithdrawal >= moneyamount)   //check if you can withdraw money
                    {
                        cmd.CommandText = @"UPDATE Account 
                                            SET WholeAccountBalance = WholeAccountBalance - @moneyamount, 
                                                BalanceAmountAvailableForWithdrawal = BalanceAmountAvailableForWithdrawal - @moneyamount 
                                            WHERE accounNum = @accNum";

                        cmd.Parameters.AddWithValue("@moneyamount", moneyamount);

                        int result = cmd.ExecuteNonQuery();

                        if (result == 1)
                            Console.WriteLine("Money withdrawn sucessfully.");
                        else
                            Console.WriteLine("Error while withdrawing, operation has failed.");
                    }
                    else
                    {
                        Console.WriteLine("Not enough money to withdrawn requested ammount.");
                    }
                }
                else
                {
                    Console.WriteLine("Charging did not work");
                }
            }
        }
    }
}

【讨论】:

  • 非常感谢,这工作! (只是稍微修改了一下,基本上是从英语到我的语言)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-18
相关资源
最近更新 更多