【问题标题】:C# datagrid not populating and no errorC# 数据网格未填充且没有错误
【发布时间】:2016-12-01 14:25:46
【问题描述】:

我的第一个问题是我有一个方法 private void FillGeneralLedger(),我将该方法放在单击事件的按钮中以填充 datagridview dgvGeneralLedger 我的问题是当我运行时,我没有收到错误,并且 dgv 仍然是空的。

我的第二个问题是我想使用相同的连接但有 5 个命令所有相同只是不同的帐号 例如在下面的示例中,下面的帐户是 '8200030' 我想做'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();
        }






    }

【问题讨论】:

  • 代码是否通过dataset.Tables[0].Rows.Count != 0?否则,这意味着您不会从 SQL 命令中得到任何结果。
  • 您需要将数据访问(数据库查询)与演示文稿(数据网格视图)分开。它们不应该在同一个类中,更不用说同一个方法了。
  • 您正在执行 NON 查询,因此它不会给您返回数据,同时,您可能会省略整个 command.executenonquery 作为分配给适配器的命令,只需填写它,它应该运行它.. 但你可能会混淆它。
  • PS 它不像“作为日期”之类的东西......所以它可能试图给你无声的错误。

标签: c# datagridview visual-studio-2015 sqlconnection sqlcommand


【解决方案1】:

当您只需要一个DataTable 时,为什么还要使用DataSet,这没有任何意义。只需使用一个 DataTable:

DataTable dataTableSource = new DataTable();
adapter.Fill(dataTableSource);

// .. cotinue your code


dgvGeneralLedger.DataSource = dataTableSource;

帐号问题:

您可以使用SqlParameter 而不是对值进行硬编码。像这样:

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

但是您需要将查询更改为如下:

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

【讨论】:

  • 你好,我让它工作了,但我有第二种方法,同样的问题。我迷失了困惑尝试了不同的东西
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-17
  • 1970-01-01
相关资源
最近更新 更多