C# - SqlDataReader 缺少列

C# - SqlDataReader missing columns

这是我的记录,就像下面 table 中的那样。 sql query

我的SQL查询是

select Category_NM as 'Kategoriler', avg(Payment) as 'Ortalamalar' 
from Islem 
where Category_Type = 'Gider' 
group by Category_NM 

还有我的代码:

public SqlDataReader DataReader(string Query_)
{
    SqlCommand cmd = new SqlCommand(Query_, con);
    SqlDataReader dr = cmd.ExecuteReader();
    return dr;
}

SqlDataReader dr = sınıf.DataReader("select Category_NM as 'Kategoriler',AVG(Payment) as 'Ortalamalar' from Islem where Category_Type = 'Gider' group by Category_NM");
dr.Read();

chart1.Series[0].IsValueShownAsLabel = true;

while (dr.Read())
{
    // MessageBox.Show(Convert.ToString(dr[0]+""+dr[1]));
    chart1.Series[0].Points.AddXY(dr[0],dr[1]);
}
dr.Close();

问题是 reader 没有读取所有记录 - 像这样:

enter image description here

因为你在第一次调用 dr.Read() 然后迭代它们。

更正:

SqlDataReader dr = sınıf.DataReader("select Category_NM as 'Kategoriler',AVG(Payment) as 'Ortalamalar' from Islem where Category_Type = 'Gider' group by Category_NM");
chart1.Series[0].IsValueShownAsLabel = true;
while (dr.Read())
{
    // MessageBox.Show(Convert.ToString(dr[0]+""+dr[1]));
    chart1.Series[0].Points.AddXY(dr[0], dr[1]);
}
dr.Close();

Read() 将行指针向前移动。 所以首先 Read() 跳过第一条记录。

如果你需要检查是否有任何记录然后chart1.Series[0].IsValueShownAsLabel = true;使用if (dr.HasRows)就足够了:

if(dr.HasRows)
{
   chart1.Series[0].IsValueShownAsLabel = true;
   //Iterate dr like while(dr.Read()){...}
}

但是你必须知道你的 while 块逻辑总是读取位置 0 的记录并获取 col0col1 的值,如果你需要阅读您可以通过 foreachfor 迭代所有记录,例如:

foreach (DbDataRecord s in dr)
 {
    string kategoriler= s.GetString(0);
    string ortalamalar = s.GetString(1);
 }

while:

while(dr.Read())
{
    var kat = dr["Kategoriler"].ToString();
    var ort = dr["Ortalamalar"].ToString();
}