Search code examples
c#datagridviewvisual-studio-2015sqlconnectionsqlcommand

C# datagrid not populating and no error


My first problem is that i have a method private void FillGeneralLedger(), i put the method in a button on click event to fill a datagridview dgvGeneralLedger my problem is when i run i am not getting an error and the dgv is remaining empty.

My Second problem is i would like to use the same connection but have 5 commands all the same just different account numbers eg in the example below the account below is '8200030' i would like to do the same for '8200031','8200032'

private void FillGeneralLedger()
    {
        SqlConnection conn = new SqlConnection(sConnectionString);
        try
        {
            DataSet dataset = new DataSet();
            SqlCommand command = new SqlCommand("Select Ddate as Date" +
                                                 ", etype" +
                                                 ", Refrence" +
                                                 ", linkacc as ContraAcc" +
                                                 ", Description" +
                                                 ", sum(case when amount > 0 then amount else 0 end) as Debits" +
                                                 ", sum(case when amount < 0 then amount else 0 end) as Credits" +
                                                 ", sum(amount) as Cumulative" +

                                                   " FROM  dbo.vw_LedgerTransactions " +
                                                   " WHERE accnumber = '8200030'" +
                                                   " AND DDate BETWEEN '2016-04-01 00:00:00' AND '2016-04-30 00:00:00'" +
                                                   " AND DataSource = 'PAS11CEDCRE17'" +
                                                   " group by Ddate, etype, Refrence, linkacc, Description, Amount", conn);
            SqlDataAdapter adapter = new SqlDataAdapter(command);
            conn.Open();
            command.ExecuteNonQuery();
            adapter.Fill(dataset);
            if (dataset.Tables[0].Rows.Count != 0)
            {
                lstGeneralLedger = new List<ReportDataClasses.GeneralLedger>();
                foreach (DataRow row in dataset.Tables[0].Rows)
                {
                    ReportDataClasses.GeneralLedger newGeneralLedger = new ReportDataClasses.GeneralLedger();
                    newGeneralLedger.Ddate = row[0].ToString();
                    newGeneralLedger.etype = row[1].ToString();
                    newGeneralLedger.refrence = row[2].ToString();
                    newGeneralLedger.linkacc = row[3].ToString();
                    newGeneralLedger.Description = row[4].ToString();
                    newGeneralLedger.debit = decimal.Parse(row[5].ToString());
                    newGeneralLedger.credit = decimal.Parse(row[6].ToString());
                    newGeneralLedger.cumulative = decimal.Parse(row[7].ToString());

                    lstGeneralLedger.Add(newGeneralLedger);
                }
                dgvGeneralLedger.DataSource = dataset;
                dgvGeneralLedger.Columns[0].Visible = false;
                pdfCreator.AddGeneralLedgerPage(lstGeneralLedger, 1);
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show("Application Error. err:" + ex.ToString());
        }
        finally
        {
            conn.Close();
        }






    }

Solution

  • Why do you use a DataSet when you only need a single DataTable, this doesn't make any sense. Just use one DataTable:

    DataTable dataTableSource = new DataTable();
    adapter.Fill(dataTableSource);
    
    // .. cotinue your code
    
    
    dgvGeneralLedger.DataSource = dataTableSource;
    

    Account Number issue:

    You can use SqlParameter instead of hard-coding the value. Like this:

    command.Parameters.AddWithValue("@acc", "8200030");
    dataTableSource.Load(command.ExecuteReader())
    // .. store results ..
    
    // second account
    command.Parameters["@acc"].Value = "8200031";
    dataTableSource.Load(command.ExecuteReader())
    
    // continue with the rest
    

    But you need to change your query to be like this:

    "... WHERE accnumber = @acc ...."