Sql DataReader和多个对象变量

时间:2015-08-26 22:26:40

标签: asp.net arrays object highcharts sqldatareader

我一直在努力弄清楚这个问题,而且似乎无法得到它。我有一个函数,我正在调用SQL存储过程,使用SQL DataReader我返回一个表。现在这个表有8列,但我在每个行中只使用了5列。我创建了一个名为chartInfo的对象[],希望用第一行中的五个值填充对象并通过行进行交互,并继续遍历填充对象的行,直到我到达结尾。使用下面的代码,它适用于第一次交互,它获取值,将它们放在一个对象数组中,我可以在我的图表中使用它。

SqlDataReader reader = cmd.ExecuteReader();

Object[] chartInfo = new Object[5];
Object[] chartInfo1 = new Object[4];

if (reader.HasRows)
{
    if (reader.Read())
    {
        chartInfo[0] = Convert.ToDouble(reader.GetValue(1));                   
        chartInfo[1] = Convert.ToDouble(reader.GetValue(2));                   
        chartInfo[2] = Convert.ToDouble(reader.GetValue(3));
        chartInfo[3] = Convert.ToDouble(reader.GetValue(4));
        chartInfo[4] = Convert.ToDouble(reader.GetValue(5));

        //chartInfo1[0] = 500;                   
        //chartInfo1[1] = 20000;                   
        //chartInfo1[2] = 45125;
        //chartInfo1[3] = 68954;
    }
}  
else
{
    Console.WriteLine("No rows found.");
}

reader.Close();

// Declare the HighCharts Object
DotNet.Highcharts.Highcharts charts = new DotNet.Highcharts.Highcharts("chart")
    .InitChart(new Chart
    {
        // Inital Loading of the chart, default is line
        DefaultSeriesType = ChartTypes.Line
    })
    .SetPlotOptions(new PlotOptions
    {
        Pie = new PlotOptionsPie
        {
            DataLabels = new PlotOptionsPieDataLabels
            {
                Enabled = true
            }
        }
    })
    .SetTitle(new Title
    {
        Text = "Overall Sales From Previous Years",
        X = -20
    })
    .SetSubtitle(new Subtitle
    {
        Text = "Source: Sales Database",
        X = -20
    })
    .SetXAxis(new XAxis
    {
        Categories = new[] { "2010", "2011", "2012", "2013", "2014" }
    })
    .SetSeries(new[]
    {
        new Series{ Name = "Carbide(total specials)", Data = new Data(chartInfo), Color = ColorTranslator.FromHtml("#FDB813") },
        new Series{ Name = "Test", Data = new Data(chartInfo1) }
    })
    .SetCredits(new Credits
    {
        Enabled = false
    });

ReportChart.Text = charts.ToHtmlString();

所以我的问题是我需要为五行创建5个对象,或者当行数未知时如何使用当前对象数组创建填充,我是否需要提供for循环来计数,我对此非常困惑。我希望我提供了足够的信息。

由于

1 个答案:

答案 0 :(得分:0)

所以看起来你读的每一行都是5个双打,你需要存储在一个数组中。然后你需要保留所有这些行的列表,以便稍后将它们全部传递给图表。

要存储它们,您可以为每一行定义一个专用类,即假设每列具有一定的商业意义。但是,如果只是一个值,比如一个数据点,只需使用双精度数组:

列出chartInfo = new List();

if (reader.HasRows)
{
    if (reader.Read())
    {
        double[] rowData = new double[5];
        rowData[0] = Convert.ToDouble(reader.GetValue(1));
        ...
        rowData[4] = Convert.ToDouble(reader.GetValue(5));
    }
}

...

现在要使用它们,使用Series创建一个chartInfo个对象数组。这可以通过for / foreach循环来完成:

Series[] series = new Series[chartInfo.Length];
for (int i=0; i< chartInfo.Length; i++)
{
    series[i] = new Series { Data = chartInfo[i] };
}

或者使用LINQ:

Series[] series = chartInfo.Select(c => new Series {Data = c}).ToArray();

这将帮助您处理尽可能多的行。但请记住,还有一些东西需要弄清楚,比如如何为不同的行显示不同的文本和不同的颜色。