【问题标题】:Find bankbalance with Dataset使用数据集查找银行余额
【发布时间】:2015-09-22 08:46:37
【问题描述】:

作为一个附带项目,我正在开发一个使用 C# 和 WPF 来创建表单的基本银行系统。

目前,我有四个表单和两个不同的全局类。

表格有:

  • 欢迎页面;此表单用于创建存储在 BankData.cs 中的初始数据集。我所有的数据库表都存储在这里 - 该表称为 UserData。
  • 验证用户;此表单是用户输入他们的帐号和密码的地方。我在这里做了一些验证,以确保它是 6 个字符并且只有整数等。然后我调用 Global.cs 类,它有一个方法来选择数据库并将用户登录(检查它是否匹配)。如果是这样,那么我将 AccountNumber 和 PIN 存储在 BankData.cs 类中。
  • 选项表;此表单只是三个按钮,目前进入显示平衡表单。
  • 显示平衡;此表单应显示该用户的当前余额和剩余提款限额(250 英镑,尽管当他们提款更多时,该限额会下降。他们不能提款超过此限额)。

我的问题是当我尝试显示当前余额时。我尝试通过将其转换为数据表来使用 linq 查询数据集。但是,当我尝试显示余额时,我得到的是这个而不是余额:

System.Linq.Enumerable+WhereSelectEnumerableIterator'2[System.Data.DataRow,System.String]

我将所有内容都转换为字符串,但不会更改此消息。我也尝试返回余额的整数值,但这会导致编译器错误。

我已经附加了应该在 Options Form 类的标签上显示余额的代码,以及在 BankData.cs 中找到余额的代码

银行数据.cs

public static string FindBalance()
{
    DataTable dt = new DataTable();
    dt = ds.Tables[0];

    var id = (from DataRow dr in dt.Rows
              where (string)dr["AccountNo"] == accountNumber
              select dr.Table.Rows[5].ToString());

    //return dt.Rows[rowNum][columName].ToString();

    return id.ToString();
} 

DisplayBalance cs:

lblcurBal.Content = "Current Balance: " + BankData.FindBalance();
//Find the Balance of the Account Number here.

请帮忙。

【问题讨论】:

  • " 我尝试使用 linq 通过将数据集转换为数据表来查询数据集。" 为什么?您可以直接访问数据表 datasetname.Tables[0] 或使用 datasetname.Tables 重载;
  • 这给我带来了问题,当谷歌搜索时,它说将其转换为从内存中作为数据集子集的数据表?

标签: c# wpf database linq object


【解决方案1】:

试试这个:代码中的一个小改动

public static string FindBalance()
{
    DataTable dt = new DataTable();
    dt = ds.Tables[0];

    var id = (from DataRow dr in dt.Rows
          where dr["AccountNo"] == accountNumber
          select dr["BalanceColumnName"]).FirstOrDefault();



    return id.ToString();
} 

编辑:

这对 Paul 有效,正如他在下面的 cmets 中所描述的:

public static string FindBalance()
{
    DataTable dt = new DataTable();
    dt = ds.Tables[0];

    var id = (from DataRow dr in dt.Rows
          where Convert.ToString(dr["AccountNo"]) == accountNumber
          select dr["BalanceColumnName"]).FirstOrDefault();



    return id.ToString();
} 

【讨论】:

  • 这个答案还提供了上面评论中详述的错误。
  • 当我将 dr["AccountNo"] 更改为 Convert.ToString(dr["AccountNo"]) 时,此解决方案有效。非常感谢。
  • @Paul Okey,所以您的 accountNumber 变量是字符串,而数据库中 AccountNo 列的数据类型不同?
  • 是的,在数据​​库中我的 AccountNo 存储为整数。我不知道为什么它在应用程序中存储为字符串。但是,因为这是一个原型,只要它可以工作就可以了。
【解决方案2】:

在这种特殊情况下,您需要使用 id.FirstOrDefault(); 而不是 id.ToString(); 作为返回值,因为 FirstOrDefault 实际上从您的 linq 查询中获取数据,而 ToString 只是查询内部字符串表示形式。

换句话说,变量id 的值不是您编写的查询的结果,而是查询本身。并且FirstOrDefault 从这个查询中检索第一个结果。

【讨论】:

  • 您好,感谢您在这么短的时间内给出答复。将返回值更改为 id.FirstOrDefault() 时,我在输出对话框中收到此错误:“EDCP2.exe 中出现‘System.InvalidCastException’类型的第一次机会异常”,然后它在显示余额表单上显示为空白。附带说明一下,这不会使我的程序崩溃,只是不会显示余额。
  • @Paul 好吧,它可能是由(string)dr["AccountNo"] 抛出的。在您检索到查询结果之前,实际上并未进行此转换 - 这就是您之前没有收到此异常的原因。尝试检查您的数据表并查找它是否具有无法转换为 AccountNo 列中的字符串的值。
  • Balance 列中的所有数据都是整数,这就是为什么我认为我最初应该返回一个 int。但是,这引发了错误,当我转换为字符串时,它并没有减去它不显示的事实。
【解决方案3】:

问题是id 是一个枚举,它是一个值的集合,看起来你期望的是单个值。

假设您的DataTable第 6 列 代表余额,

public static string FindBalance()
{
    DataTable dt = new DataTable();
    dt = ds.Tables[0];

    var id = (from DataRow dr in dt.Rows
              where (string)dr["AccountNo"] == accountNumber
              select dr[5].ToString()).FirstOrDefault();

    //return dt.Rows[rowNum][columName].ToString();

    return id== null? "" : id;
} 

【讨论】:

  • 嗨,这个答案也为我提供了上面评论中指定的错误。
  • 您好,错误是:“EDCP2.exe 中出现'System.InvalidCastException' 类型的第一次机会异常” 它不会导致程序崩溃。它只会停止显示余额。
  • @RahulSingh 对不起,你的方法导致了同样的错误。
  • 如果您共享 DataTable 架构/定义会很有帮助。
【解决方案4】:

您需要从集合中获取结果,使用类似FirstOrDefault()

return Convert.ToString(id.FirstOrDefault());

你实际上是在迭代器上调用ToString,并没有真正获得结果。

【讨论】:

  • 这个答案在上面的评论中也给我提供了错误。
【解决方案5】:

我根据 vedbhawsar 的解决方案完成了这项工作。

通过将 BankData.cs 类上的代码更改为:

var id = (from DataRow dr in dt.Rows
          where Convert.ToString(dr["AccountNo"]) == accountNumber
          select dr["Balance"]).FirstOrDefault();

return id.ToString();

它允许我显示已登录用户的余额。

非常感谢;现在我只需要复制它来获取最低余额。 当它不起作用时期待我回来哈哈。

再次感谢所有帮助我得出这个结论的人。

【讨论】:

    猜你喜欢
    • 2021-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-31
    • 2022-11-15
    • 2015-02-18
    • 2018-01-17
    • 1970-01-01
    相关资源
    最近更新 更多