使用数据集

时间:2015-09-22 08:46:37

标签: c# wpf database linq object

作为一个辅助项目,我正在开发一个使用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中找到余额的代码

BankData.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.

请帮忙。

5 个答案:

答案 0 :(得分: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来说是有用的,正如他在下面的评论中所描述的那样:

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();
} 

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

问题是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;
} 

答案 3 :(得分:0)

您需要使用FirstOrDefault()

之类的内容从集合中获取结果
return Convert.ToString(id.FirstOrDefault());

您实际上是在迭代器上调用ToString,而不是实际获取结果。

答案 4 :(得分:0)

我的工作基于vedbhawsar的解决方案。

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

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

return id.ToString();

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

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

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