我最近因为一个新问题而苦苦挣扎。我有一个数据库表,其中包含多个字段(列),其中包含几行,包含与字段名相关的(money - decimal)值。
例如:
我想要做的是从数据库中获取这些值,将它们一起添加并在标签中显示总量。
到目前为止,我使用OleDbDataReader来满足我所有的输出/存储值需求。虽然我完全不知道如何添加读取值,因为读者通常希望读取预定义的字段名称。
在我的项目中,用户可以添加自定义新字段名称(因此您无法在阅读器中预先定义字段名称,因为您不知道用户将在数据库中添加哪些自定义字段名称这些自定义添加的字段名称及其值也需要在总量中添加,但是..
有没有人知道如何解决这个问题?
我尝试过多种方法,例如将它存储在一个数组中,定义十进制变量并使用像x = x + (decimal)reader[0]
这样的东西,但这一切都没有用,所以我想我离开了。
我用于阅读部分的代码(和查询)如下:
try
{
connection.Open();
OleDbCommand command = new OleDbCommand();
command.Connection = connection;
string query = "select * from money where [Month]='January'";
command.CommandText = query;
OleDbDataReader reader = command.ExecuteReader();
while (reader.Read())
{
//Something I tried
//x[0] = (decimal)reader[0];
//x[1] = (decimal)reader[1];
//And so on...
//Another thing I tried
//list.Add(reader.GetInt32(0));
}
//list.ToArray();
//int sum = list.Sum();
// y = x[0] + x[1] + ...;
connection.Close();
}
catch (Exception ex)
{
MessageBox.Show("Error" + ex);
}
答案 0 :(得分:1)
您应该只能声明一个变量,然后将所有列相加。如果您不知道阅读器中的列数,可以使用reader.FieldCount
获取。{/ p>
您无需知道列名即可从阅读器获取数据。您可以在开始时按列索引访问它,例如reader[0]
,或使用GetDecimal(0)
等辅助方法。
try
{
connection.Open();
OleDbCommand command = new OleDbCommand();
command.Connection = connection;
string query = "select * from money where [Month]='January'";
command.CommandText = query;
OleDbDataReader reader = command.ExecuteReader();
// start the total at 0
int total = 0.0m;
while (reader.Read())
{
// loop through all the fields in the reader
for(int f = 0; f < reader.FieldCount; f++) {
// read as a decimal and add to the total
total += reader.GetDecimal(f);
}
}
connection.Close();
}
catch (Exception ex)
{
MessageBox.Show("Error" + ex);
}
答案 1 :(得分:1)
希望这有帮助 -
decimal total = 0M;
while (dr.Read())
{
for (int i = 0; i < dr.FieldCount; i++)
{
total+= (decimal) (dr[i] != DBNull.Value ? dr[i] : 0.0);
}
}
这将为每一行添加所有列的值。
答案 2 :(得分:1)
Datareader有一个名为字段数的属性,它可以给出列数..所以你可以使用类似下面的内容
double num=0.0m;
for (int i = 0; i < rdr.FieldCount; i++)
num += rdr[i];