如何访问循环外的数组字符串? C#

时间:2015-10-29 01:54:17

标签: c# arrays

我正在尝试总计我的产品的每月销售总额(Limonade)。我在循环外的代码遇到问题。我的所有12个数组字符串都具有相同的值,即最后一个数组字符串(monthLimonade[11])的值。

我的数据库查询准确地将月销售额总计为(monthlyLimonade)。我验证了我的数组在循环内部工作。

我哪里错了?

String[] monthLimonade = new String[12];

try
{
//CONNECTION STRING INFO...
cnn.Open();
MySqlDataReader reader = cmd.ExecuteReader();

while (reader.Read())
{

    Label lblmonthLimonade = new Label();

    for (int i = 0; i < 12; i++)
    {
        monthLimonade[i] = reader.GetString("monthlyLimonade");
        lblmonthLimonade.Text = monthLimonade[i];
    }
        //This label inside the reader loop gives correct output
        flowLayoutPanel1.Controls.Add(lblmonthLimonade);
}
cnn.Close();
}
catch (MySql.Data.MySqlClient.MySqlException ex)
{
    System.Windows.Forms.MessageBox.Show(ex.Message, "MySql, no connection!");
}

    int m1l = Int32.Parse(monthLimonade[0]);
    int m2l = Int32.Parse(monthLimonade[1]);
    int m3l = Int32.Parse(monthLimonade[2]);
    int m4l = Int32.Parse(monthLimonade[3]);
    int m5l = Int32.Parse(monthLimonade[4]);
    int m6l = Int32.Parse(monthLimonade[5]);
    int m7l = Int32.Parse(monthLimonade[6]);
    int m8l = Int32.Parse(monthLimonade[7]);
    int m9l = Int32.Parse(monthLimonade[8]);
    int m10l = Int32.Parse(monthLimonade[9]);
    int m11l = Int32.Parse(monthLimonade[10]);
    int m12l = Int32.Parse(monthLimonade[11]);

    // Here in my chart I get all the same values for every month "10516"

    this.chart1.Series["Limonade"].Points.AddXY("January", m1l);
    this.chart1.Series["Limonade"].Points.AddXY("February", m2l);
    this.chart1.Series["Limonade"].Points.AddXY("March", m3l);
    this.chart1.Series["Limonade"].Points.AddXY("April", m4l);
    this.chart1.Series["Limonade"].Points.AddXY("May", m5l);
    this.chart1.Series["Limonade"].Points.AddXY("June", m6l);
    this.chart1.Series["Limonade"].Points.AddXY("July", m7l);
    this.chart1.Series["Limonade"].Points.AddXY("August", m8l);
    this.chart1.Series["Limonade"].Points.AddXY("September", m9l);
    this.chart1.Series["Limonade"].Points.AddXY("October", m10l);
    this.chart1.Series["Limonade"].Points.AddXY("November", m11l);
    this.chart1.Series["Limonade"].Points.AddXY("December", m12l);
    flowLayoutPanel1.Controls.Add(chart1);

3 个答案:

答案 0 :(得分:1)

修改

原始答案是基于原始问题而且可以用来解决编辑问题的问题,但编辑问题的问题仍然存在,我试着更清楚地描述它:

在第01行中,reader.Read()读取结果集的每一行,并在第06行的循环语句中将数组的每个元素设置为当前行的monthlyLimonade列的相同值,因此由于reader.Read(),这将重复下一行,最后,数组的所有元素都将包含结果集中最后一行的monthlyLimonade值。

01: while (reader.Read())
02: {
03:     Label lblmonthLimonade = new Label();
04:     for (int i = 0; i < 12; i++)
05:     {
06:         monthLimonade[i] = reader.GetString("monthlyLimonade");
07:         lblmonthLimonade.Text = monthLimonade[i];
08:     }
09:     //This label inside the reader loop gives correct output
10:     flowLayoutPanel1.Controls.Add(lblmonthLimonade);
11: }

原始答案

显然,数组的所有元素都将包含相同的值reader.GetString("monthlyLimonade"),它是结果集第一条记录的monthlyLimonade列的值。

我认为你需要:

for (int i=0; i<12; i++)
{
    reader.Read();
    monthLimonade[i] = reader.GetString("monthlyLimonade");
}

但是为什么要使用这样的数组和变量呢?作为更好的选择,我建议使用DataTable代替:

var dataTable = new DataTable();
var connection = @"your connection string";
var command = "your command";
var dataAdapter = new System.Data.SqlClient.SqlDataAdapter(command, connection);

//Get data
dataAdapter.Fill(dataTable);

然后,您可以使用Rows的{​​{1}}集合。

答案 1 :(得分:0)

monthLimonade[i] = reader.GetString("monthlyLimonade");

向数组插入相同的值。这就是为什么你有相同价值的问题。

答案 2 :(得分:-1)

既然你在循环中得到了正确的结果,也许你可以尝试从循环中解析和求和它自己?

String[] monthLimonade = new String[12];
int mlSum = 0;

for (int i = 0; i < 12; i++)
    {
         monthLimonade[i] = reader.GetString("monthlyLimonade");
         mlSum += Int32.Parse(monthLimonade[i]);
    }

因此,在循环的每次迭代中,您都会得到:

monthLimonade[0] = 2294.4
monthLimonade[1] = 3212.16
monthLimonade[2] = 4550.56
monthLimonade[3] = 5124
monthLimonade[4] = 7581
monthLimonade[5] = 6883
monthLimonade[6] = 10516
monthLimonade[7] = 6692
monthLimonade[8] = 8604
monthLimonade[9] = 10516
monthLimonade[10] = 0
monthLimonade[11] = 0 

这应该归结为:

mlSum = 65973.12

这也应该允许您通过在循环中放置断点并查看Int.Parse每次是否正在解析reader.GetString("monthlyLimonade")结果来更深入地调试。