【问题标题】:Print tickets in Crystal Reports, SQL Query Optimization, c# [closed]在 Crystal Reports、SQL 查询优化、c# 中打印票证 [关闭]
【发布时间】:2016-09-27 03:35:39
【问题描述】:

我正在使用水晶报表根据数据库中的唯一 ID 生成一些票证。然而,我现在面临的挑战是在要打印的水晶报告中每英亩生成 2 张票。

下面我有应该发送查询并填写水晶报表查看器的代码。对于超过 9000 条独特的记录和超过 74000 英亩的土地,这是行不通的。任何人都可以帮助或帮助更好的方法来做到这一点。

此代码运行 sql server 2008 r2 内存不足:

private void button1_Click(object sender, EventArgs e)
{
    try{
        SqlConnection con = new SqlConnection("Data Source=localhost\\DEV;Initial Catalog=db;Integrated Security=True");
        var f_id = textBox2.Text;  //Unique ID Not used to generate all tickets
        var n_copies = textBox1.Text; //Number of copies default 1
        var t_per_acre = textBox3.Text; //Set default at 2 Tickets per acre
        string sql = "Select * From dbo.CParcel";
        SqlDataAdapter sda = new SqlDataAdapter(sql, con);
        DataSet ds = new DataSet();
        sda.Fill(ds, "CParcel");
        foreach (DataRow theRow in ds.Tables["CParcel"].Rows)
        {
            decimal get_acreage = System.Convert.ToDecimal(theRow["ACREAGE"]);
            int acr = (int)(get_acreage + 0.5m);
            int t_t_per_acr = acr * System.Convert.ToInt32(t_per_acre);
            int t_t_per_acr_per_copy = t_t_per_acr * System.Convert.ToInt32(n_copies);
            for (int i = 1; i < t_t_per_acr_per_copy; i++)
            {
                sql = sql + " Union All SELECT * FROM dbo.CParcel";
            }
        }
        SqlDataAdapter tsda = new SqlDataAdapter(sql, con);
        DataSet ds2 = new DataSet();
        tsda.Fill(ds2, "CParcel");
        crystal.SetDataSource(ds2);
        crystal.SetDatabaseLogon("sa", "password");
        crystalReportViewer1.ReportSource = crystal;

    }
    catch (Exception ex)
    {
        // Print error message
        MessageBox.Show(ex.Message);
    }
}

【问题讨论】:

  • 你有什么版本的sql server。意思是,这是 Microsoft SqlServer,不是 mysql。对吗?
  • 你是正确的它的 sql server 2008 r2
  • 我可以花点时间在上面。如果您来到Campaigns 聊天室怎么样,我们会收集一些信息,并在需要时为每个人更好地记录问题。
  • 好的。我有几个会议。给我几分钟
  • 在您不在的情况下,我只是在下面的答案中提出了一些想法。我不能走得更远。

标签: c# sql dataset sqlconnection datarow


【解决方案1】:

考虑以下非常小的修改,只是尝试收集一些计数器。

private void button1_Click(object sender, EventArgs e)
{
    int i_xyz = 0, j_xyz = 0;   // Drew added
    try
    {
        SqlConnection con = new SqlConnection("Data Source=localhost\\DEV;Initial Catalog=db;Integrated Security=True");
        var f_id = textBox2.Text;  //Unique ID Not used to generate all tickets
        var n_copies = textBox1.Text; //Number of copies default 1
        var t_per_acre = textBox3.Text; //Set default at 2 Tickets per acre
        string sql = "Select * From dbo.CParcel";   // STARTING POINT A
        SqlDataAdapter sda = new SqlDataAdapter(sql, con);
        DataSet ds = new DataSet();
        sda.Fill(ds, "CParcel");
        foreach (DataRow theRow in ds.Tables["CParcel"].Rows)
        {
            i_xyz++;    // Drew added
            decimal get_acreage = System.Convert.ToDecimal(theRow["ACREAGE"]);
            int acr = (int)(get_acreage + 0.5m);
            int t_t_per_acr = acr * System.Convert.ToInt32(t_per_acre);
            int t_t_per_acr_per_copy = t_t_per_acr * System.Convert.ToInt32(n_copies);
            for (int i = 1; i < t_t_per_acr_per_copy; i++)
            {
                j_xyz++;    // Drew added
                sql = sql + " Union All SELECT * FROM dbo.CParcel";
            }
        }
        // POINT B <------------------

        // STOP !!
        // RIGHT HERE what is the value of i_xyz and j_xyz ?? In particular j_xyz
        // also flush sql out to a text file and get a good look at it

        //SqlDataAdapter tsda = new SqlDataAdapter(sql, con);
        //DataSet ds2 = new DataSet();
        //tsda.Fill(ds2, "CParcel");
        //crystal.SetDataSource(ds2);
        //crystal.SetDatabaseLogon("sa", "password");
        //crystalReportViewer1.ReportSource = crystal;

    }
    catch (Exception ex)
    {
        // Print error message
        MessageBox.Show(ex.Message);
    }
}

POINT B 之后,您会知道j_xyz 有多少次将UNION ALL 添加到您的sql 字符串上。我可以理解您的联合是否添加了一些其他有意义(和不同)数据子集的粒度,例如here(尽管是不同的数据库引擎)。但是,在诸如不同数据之类的情况下,可以认为联合是有用的,并且在没有联合的情况下很难获得它。

但在您的情况下,您只是每次都使用相同的数据执行union all select *。并可能在此过程中创建一个巨大的 sql 语句来执行此操作。 j_xyz 变量会告诉您添加的次数。

其他想法包括不要指定select *,而只指定您的报告需要的列。并且还通过使用Dispose 来遵循内存管理的最佳实践,设置为null,或者我会做什么,正如Adam 向here 展示的那样,“使用资源”。 Using.

因此,总而言之,使用您要连接的 sql 字符串,难怪例程会失败。

【讨论】:

  • 我想要的是为每条记录检查一个面积值。如果有 3 英亩,则每英亩打印 2 张票。或重复查询。有超过20000条记录。我如何检查记录中的值,将其乘以 2 并在报告中打印票证。即如果值为 20,则打印 40 张票或在水晶报告中显示同一张票 40 次,然后显示其余的或记录。基本上我需要检查数据库中的所有值并重新打印每英亩的门票。
  • 我正在回答您的原始问题,而不是设计一个特殊的循环和每英亩 2 张门票或任何爵士乐。我已经描述了,在我看来,你有一个 sql 字符串,它可能从 for 循环中出来。因为您正在执行 select * from dbparcel 没有 where 子句,然后执行 union and union 和 union and union 等。而且您还没有显示我放在那里的变量。
猜你喜欢
  • 2012-04-26
  • 2019-03-20
  • 1970-01-01
  • 2014-09-28
  • 1970-01-01
  • 1970-01-01
  • 2022-08-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多