当前位置:编程学习 > C#/ASP.NET >>

水晶报表PULL,登录窗口以搞定,不料刷新又问题了。。。。[悲勒个剧]

水晶报表新手菜鸟一个。。。在自学和问别人一通之后,总算弄出点道道来了~~~

前几天那个水晶报表的登录窗体,差点把我搞疯了。

今天看了一下水晶报表的sdk才弄明白。。。。

链接没有密码的数据库,很简单。。。Pull一拉就拉过来数据了,刷新正常。

关键就在有密码的数据库!!!

明明自己在设计报表的时候没有设置用户名密码,反而加载报表的时候就要求输入。

崩溃了三四天后,查阅了n多资料,度大爷了无数次。

关键前面也说了,菜鸟,搜问题不明白什么个关键词。。。。

所以就。。。哎。。。也算磨练吧。。。

代码见下面:直接放在form_load里面。
引用using CrystalDecisions.Shared;      //负责解释TableLogOnInfo类 

            TableLogOnInfo LogOnInfo = new TableLogOnInfo();

            LogOnInfo.ConnectionInfo.ServerName = Application.StartupPath;
            LogOnInfo.ConnectionInfo.DatabaseName = "\\Adjustment.accdb";
            LogOnInfo.ConnectionInfo.UserID = "Admin";
            LogOnInfo.ConnectionInfo.Password = "";



这个总算解决了。。

但是当我数据库的数据修改的时候,点击刷新报表却又出来了。。。

难道要我重新水晶报表的刷新类???

这难度太大了吧!

我的开发环境:Win8 64bit + vs2012 + cr for vs2012

链接的是access数据库,07格式.accdb的那种。


我设计思路:

在form_load加载报表,直接PULL过来数据,显示。


这时候一般数据都是新的,但是水晶报表貌似可以缓存上一次的数据???[这句话我不知道说得对不对]


反正数据库变了之后蒙着面还是上一次的样子。


只有在编辑一次水晶报表,在里面重新刷新过。才在我的程序里面显示。

private void Reporting_Load(object sender, EventArgs e)             //窗体启动时加载报表
        {
            TableLogOnInfo LogOnInfo = new TableLogOnInfo();

            LogOnInfo.ConnectionInfo.ServerName = Application.StartupPath;
            LogOnInfo.ConnectionInfo.DatabaseName = "\\Adjustment.accdb";
            LogOnInfo.ConnectionInfo.UserID = "Admin";
            LogOnInfo.ConnectionInfo.Password = "";

            switch (Convert.ToInt32(sLine))
            {
                case 0:
                    {
                        if (File.Exists(Application.StartupPath + "\\Report\\ClosedLeveling.rpt"))
                        {
                            crystalReportViewer1.ReportSource = Application.StartupPath + "\\Report\\ClosedLeveling.rpt";
                        }
                        else MessageBox.Show("加载报表文件失败,请不要单独运行本程序。", "Aurora智能提示");
                    }
                    break;
                case 1:
                    {
                        if (File.Exists(Application.StartupPath + "\\Report\\AnnexedLeveling.rpt"))
                        {
                            crystalReportViewer1.ReportSource = Application.StartupPath + "\\Report\\AnnexedLeveling.rpt";
                        }
                        else MessageBox.Show("加载报表文件失败,请不要单独运行本程序。", "Aurora智能提示");
                    }
                    break;
            }

            //crystalReportViewer1.RefreshReport();              这儿注释掉了,不然让他刷新的话,还会出现登录窗口的。~~~泪奔~~~
        }


求大师指点一二,感激不尽。 --------------------编程问答-------------------- 今天又到捣鼓了一下,发现   crystalReportViewer1.RefreshReport(); 这儿有问题。
不能拉过来最新的数据。

网上好多都是web的资料,我跟着做了一下。还不行。

下面的代码我不用case语句了,就加载一个报表。

刷新还是出问题。我明明把数据库连接的东东都给了

ReportDocument cr = new ReportDocument();
            cr.Load(Application.StartupPath + "\\Report\\ClosedLeveling.rpt");

            TableLogOnInfo LogOnInfo = new TableLogOnInfo();
            LogOnInfo.ConnectionInfo.ServerName = "..\\Adjustment.accdb";
            LogOnInfo.ConnectionInfo.DatabaseName = "";
            LogOnInfo.ConnectionInfo.UserID = "Admin";
            LogOnInfo.ConnectionInfo.Password = "";

            for (int i = 0; i < cr.Database.Tables.Count; i++)
            {
                cr.Database.Tables[0].ApplyLogOnInfo(LogOnInfo);
            }
            
            //建立.rpt文件与crystalreportviewer文件之间的连接 
            crystalReportViewer1.ReportSource = cr;
--------------------编程问答--------------------  cr.Database.Tables[0].ApplyLogOnInfo(LogOnInfo);

这里应该是:

 cr.Database.Tables[i].ApplyLogOnInfo(LogOnInfo); --------------------编程问答--------------------
引用 2 楼 luols 的回复:
 cr.Database.Tables[0].ApplyLogOnInfo(LogOnInfo);

这里应该是:

 cr.Database.Tables[i].ApplyLogOnInfo(LogOnInfo);


哦,对不起,那儿打错了。

但是还是提示登录 --------------------编程问答-------------------- csdn不晓得怎么上传文件

这是原文件http://pan.baidu.com/share/link?shareid=271066560&uk=1645014614


不是我想省事劳烦管理员,只是快两个星期了,还没解决。

我的代码看着没错误,可就是刷新不出来。


希望管理员给查查原因。


代码都写好了。

引用 2 楼 luols 的回复:
 cr.Database.Tables[0].ApplyLogOnInfo(LogOnInfo);

这里应该是:

 cr.Database.Tables[i].ApplyLogOnInfo(LogOnInfo);
--------------------编程问答-------------------- 我这边没有vs2012+cr for 2012环境,只有vs2008及其自带的水晶报表,你先把Load函数改成如下代码试试。。

        private void Reporting_Load(object sender, EventArgs e)             //窗体启动时加载报表
        {
            ReportDocument myReport = new ReportDocument();
            myReport.Load(Application.StartupPath + "\\Report\\ClosedLeveling.rpt");

            ConnectionInfo connectionInfo = new ConnectionInfo();
            connectionInfo.DatabaseName = "";
            connectionInfo.UserID = "Admin";
            connectionInfo.Password = "";
            connectionInfo.ServerName = "..\\Adjustment.accdb";


            Tables tables = myReport.Database.Tables;

            foreach (CrystalDecisions.CrystalReports.Engine.Table table in tables)
            {
                TableLogOnInfo tableLogonInfo = table.LogOnInfo;
                tableLogonInfo.ConnectionInfo = connectionInfo;
                table.ApplyLogOnInfo(tableLogonInfo);
            }

            //建立.rpt文件与crystalreportviewer文件之间的连接 
            crystalReportViewer1.ReportSource = myReport;
        }
--------------------编程问答--------------------
引用 5 楼 luols 的回复:
我这边没有vs2012+cr for 2012环境,只有vs2008及其自带的水晶报表,你先把Load函数改成如下代码试试。。

        private void Reporting_Load(object sender, EventArgs e)             //窗体启动时加载报表
        {
            ReportDocument myReport = new ReportDocument();
            myReport.Load(Application.StartupPath + "\\Report\\ClosedLeveling.rpt");

            ConnectionInfo connectionInfo = new ConnectionInfo();
            connectionInfo.DatabaseName = "";
            connectionInfo.UserID = "Admin";
            connectionInfo.Password = "";
            connectionInfo.ServerName = "..\\Adjustment.accdb";


            Tables tables = myReport.Database.Tables;

            foreach (CrystalDecisions.CrystalReports.Engine.Table table in tables)
            {
                TableLogOnInfo tableLogonInfo = table.LogOnInfo;
                tableLogonInfo.ConnectionInfo = connectionInfo;
                table.ApplyLogOnInfo(tableLogonInfo);
            }

            //建立.rpt文件与crystalreportviewer文件之间的连接 
            crystalReportViewer1.ReportSource = myReport;
        }



这样加载是没问题的,但是数据并不是最新的。

如果我的数据库在程序加载之后改变了,这面就体现不出来。

而且刷新报表,crystalReportViewer1.RefreshReport();

还会出来登录窗口。 --------------------编程问答-------------------- 我不确定刷新报表数据是否可以用RefreshReport,但是可以通过重置ReportSource来达到刷新数据的目的。
把你的代码稍微改造下,将myReport设成全局变量,自定义一个函数SetDataSource如下:

        /// <summary>
        /// 为报表设定数据库连接信息
        /// </summary>
        /// <param name="rd"></param>
        private void SetDataSource(ReportDocument rd)
        {
            ConnectionInfo connectionInfo = new ConnectionInfo();
            connectionInfo.DatabaseName = "";
            connectionInfo.UserID = "Admin";
            connectionInfo.Password = "123";
            connectionInfo.ServerName = "Adjustment.accdb";

            Tables tables = rd.Database.Tables;
            foreach (Table table in tables)
            {
                TableLogOnInfo tableLogonInfo = table.LogOnInfo;
                tableLogonInfo.ConnectionInfo = connectionInfo;
                table.ApplyLogOnInfo(tableLogonInfo);
            }     
            crystalReportViewer1.ReportSource = rd; 
        }


加载和要刷新的地方直接调用这个函数即可。 --------------------编程问答--------------------
引用 7 楼 luols 的回复:
我不确定刷新报表数据是否可以用RefreshReport,但是可以通过重置ReportSource来达到刷新数据的目的。
把你的代码稍微改造下,将myReport设成全局变量,自定义一个函数SetDataSource如下:

        /// <summary>
        /// 为报表设定数据库连接信息
        /// </summary>
        /// <param name="rd"></param>
        private void SetDataSource(ReportDocument rd)
        {
            ConnectionInfo connectionInfo = new ConnectionInfo();
            connectionInfo.DatabaseName = "";
            connectionInfo.UserID = "Admin";
            connectionInfo.Password = "123";
            connectionInfo.ServerName = "Adjustment.accdb";

            Tables tables = rd.Database.Tables;
            foreach (Table table in tables)
            {
                TableLogOnInfo tableLogonInfo = table.LogOnInfo;
                tableLogonInfo.ConnectionInfo = connectionInfo;
                table.ApplyLogOnInfo(tableLogonInfo);
            }     
            crystalReportViewer1.ReportSource = rd; 
        }


加载和要刷新的地方直接调用这个函数即可。




这样还是老样子。。。

随便更改数据库里面的一个数值。。。

重新加载还是不显示新的数据。。。

谢谢版主帮忙,我打算学习一下push模式,虽然有点麻烦,但是我听说不用登陆之类的

哎,真没办法了 --------------------编程问答-------------------- 你的数据库我没法打开,刚刚我自己创建了一个数据库文件Database1.mdb(无密码)
然后用报表向导方式创建一个rpt文件,如图:




代码如下,点刷新按钮即可获得数据库最新数据

        /// <summary>
        /// 窗体加载
        /// </summary>
        /// <param name="e"></param>
        protected override void OnLoad(EventArgs e)
        {
            base.OnLoad(e);

            myReport = new CrystalReport1();
            crystalReportViewer1.ReportSource = myReport;
        }
        /// <summary>
        /// 刷新按钮
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button1_Click(object sender, EventArgs e)
        {
            crystalReportViewer1.RefreshReport();
        }
--------------------编程问答-------------------- 你的数据库没设密码吧?

相对PULL模式,PUSH模式则显得灵活许多。。 --------------------编程问答--------------------
引用 10 楼 luols 的回复:
你的数据库没设密码吧?

相对PULL模式,PUSH模式则显得灵活许多。。



有密码的。

要是没有密码,刷新什么的都没问题。但是加了密码,就不好刷新了。

--------------------编程问答--------------------
引用 10 楼 luols 的回复:
你的数据库没设密码吧?

相对PULL模式,PUSH模式则显得灵活许多。。



我在sap社区咨询了一下。他们这么回复的,说仅支持ODBC连接。

你看看这个http://scn.sap.com/message/14179792#14179792

版主帮忙分析一下设呢吗情况,要建立ODBC连接? --------------------编程问答-------------------- 水晶报表设计界面,报表选项中有个这样的选项:"为提高速度而使用索引或服务器",把这前面的勾去掉,保存后再试下。类似的登录框和刷新问题困扰了我很久,我最后是用此法解决的。当然还不知是不是最好的方法。 --------------------编程问答-------------------- 除 --------------------编程问答--------------------
引用 13 楼 cnjxndlc 的回复:
水晶报表设计界面,报表选项中有个这样的选项:"为提高速度而使用索引或服务器",把这前面的勾去掉,保存后再试下。类似的登录框和刷新问题困扰了我很久,我最后是用此法解决的。当然还不知是不是最好的方法。



你好,我是了你的方法,貌似不管用哦 --------------------编程问答-------------------- 你的问题是不是数据库修改了数据,然后报表的数据不能及时刷新?
这个问题我是通过上述方法解决的 --------------------编程问答--------------------
引用 16 楼 cnjxndlc 的回复:
你的问题是不是数据库修改了数据,然后报表的数据不能及时刷新?
这个问题我是通过上述方法解决的


是的。数据库修改了数据,报表数据在刷新的话,会弹出来一个登陆窗口,要什么用户名,密码,这个我根本没设置,所以不知道怎么办。

我的问题是怎么绕过这个登陆窗体



http://zhidao.baidu.com/question/563605687.html?quesup2&oldq=1
这个事我在百度知道提问的额,到现在也没人回答。 --------------------编程问答-------------------- 我理解错了,以为是数据不能刷新。
登录窗口的问题,.cs文档和web.config文档都要作相应设置
这个论坛我没找到上传附件的地方,你给个邮箱或QQ号,我把我的设置情况通过附件传给你 --------------------编程问答-------------------- .cs文档:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using CrystalDecisions.Shared;//负责解释TableLogOnInfo类
using CrystalDecisions.CrystalReports.Engine;//负责解释ReportDocument类
using System.Configuration;

public partial class Default_tjbb4_累计担保明细 : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        TableLogOnInfo logOnInfo = new TableLogOnInfo();
        //这里必须事先申明一个ReportDocument对象 Report,同时加载数据报表
        ReportDocument oRpt = new ReportDocument();
        //获取.rpt文件真实路径
        string path1;
        path1 = Server.MapPath("~//CrystalReport_tjbb4累计担保.rpt");
        oRpt.Load(path1);
        //从web.config中获取logOnInfo参数信息
        string a, b, c, d;
        //获取ServerName
        a = ConfigurationManager.ConnectionStrings["Data Source"].ConnectionString;
        //获取DatabaseName
        b = ConfigurationManager.ConnectionStrings["Initial Catalog"].ConnectionString;
        //获取UserId
        c = ConfigurationManager.ConnectionStrings["User ID"].ConnectionString;
        //获取password
        d = ConfigurationManager.ConnectionStrings["Password"].ConnectionString;
        //设置logOnInfo参数
        logOnInfo.ConnectionInfo.ServerName = a;
        logOnInfo.ConnectionInfo.DatabaseName = b;
        logOnInfo.ConnectionInfo.UserID = c;
        logOnInfo.ConnectionInfo.Password = d;
        oRpt.Database.Tables[0].ApplyLogOnInfo(logOnInfo);
        //建立.rpt文件与CryStalReportviewer文件之间的连接
        CrystalReportViewer1.ReportSource = oRpt;
    }
}


web.config
<appSettings>
<add key="CrystalImageCleaner-AutoStart" value="true"/>
<add key="CrystalImageCleaner-Sleep" value="60000"/>
<add key="CrystalImageCleaner-Age" value="120000"/>
<add key="ConnectionString" value="server=WWW-xxx6C08329D;database=sq_ljpz2012;UId=sa;password='123456'"/>
</appSettings>

.aspx
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default_tjbb4_累计担保明细.aspx.cs" Inherits="Default_tjbb4_累计担保明细" %>

<%@ Register assembly="CrystalDecisions.Web, Version=13.0.2000.0, Culture=neutral, PublicKeyToken=692fbea5521e1304" namespace="CrystalDecisions.Web" tagprefix="CR" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
    
        
        <asp:Menu ID="Menu1" runat="server">
            <Items>
                <asp:MenuItem NavigateUrl="~/Default.aspx" Text="返回主页" Value="返回主页">
                </asp:MenuItem>
            </Items>
        </asp:Menu>
    
    </div>
    <CR:CrystalReportViewer ID="CrystalReportViewer1" runat="server" 
        AutoDataBind="true" 
        HasRefreshButton="True" />
    </form>
</body>
</html> --------------------编程问答-------------------- 除 --------------------编程问答--------------------
引用 18 楼 cnjxndlc 的回复:
我理解错了,以为是数据不能刷新。
登录窗口的问题,.cs文档和web.config文档都要作相应设置
这个论坛我没找到上传附件的地方,你给个邮箱或QQ号,我把我的设置情况通过附件传给你


灰常感谢啊,兄弟。我的QQ邮箱:376787823@qq.com

我做的是单机版的winfrom,可能只需要设置一下.cs中代码就可以,web.config还用不到的。

等你的资料哦 --------------------编程问答--------------------
引用 20 楼 u012522770 的回复:
水晶报表的编程和发布都比较繁琐,你可以试一下其它的报表;
菁菁报表支持BS和CS报表,支持多数据集、多维度、多度量、多报表节,支持文本、图片、条码、图表,是一款基于微软DotNet框架开发,易用、灵活的报表工具。 

地址: www.qxexpress.com 


谢谢。不过水晶报表我现在研究的就差这个问题了,再换其他的报表要从头开始设计,太麻烦。
除非他们能支持水晶报表导入,这样就不用重新设计报表了 --------------------编程问答--------------------
引用 19 楼 cnjxndlc 的回复:
.cs文档:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using CrystalDecisions.Shared;//负责解释TableLogOnInfo类
using CrystalDecisions.CrystalReports.Engine;//负责解释ReportDocument类
using System.Configuration;

public partial class Default_tjbb4_累计担保明细 : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        TableLogOnInfo logOnInfo = new TableLogOnInfo();
        //这里必须事先申明一个ReportDocument对象 Report,同时加载数据报表
        ReportDocument oRpt = new ReportDocument();
        //获取.rpt文件真实路径
        string path1;
        path1 = Server.MapPath("~//CrystalReport_tjbb4累计担保.rpt");
        oRpt.Load(path1);
        //从web.config中获取logOnInfo参数信息
        string a, b, c, d;
        //获取ServerName
        a = ConfigurationManager.ConnectionStrings["Data Source"].ConnectionString;
        //获取DatabaseName
        b = ConfigurationManager.ConnectionStrings["Initial Catalog"].ConnectionString;
        //获取UserId
        c = ConfigurationManager.ConnectionStrings["User ID"].ConnectionString;
        //获取password
        d = ConfigurationManager.ConnectionStrings["Password"].ConnectionString;
        //设置logOnInfo参数
        logOnInfo.ConnectionInfo.ServerName = a;
        logOnInfo.ConnectionInfo.DatabaseName = b;
        logOnInfo.ConnectionInfo.UserID = c;
        logOnInfo.ConnectionInfo.Password = d;
        oRpt.Database.Tables[0].ApplyLogOnInfo(logOnInfo);
        //建立.rpt文件与CryStalReportviewer文件之间的连接
        CrystalReportViewer1.ReportSource = oRpt;
    }
}


web.config
<appSettings>
<add key="CrystalImageCleaner-AutoStart" value="true"/>
<add key="CrystalImageCleaner-Sleep" value="60000"/>
<add key="CrystalImageCleaner-Age" value="120000"/>
<add key="ConnectionString" value="server=WWW-xxx6C08329D;database=sq_ljpz2012;UId=sa;password='123456'"/>
</appSettings>

.aspx
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default_tjbb4_累计担保明细.aspx.cs" Inherits="Default_tjbb4_累计担保明细" %>

<%@ Register assembly="CrystalDecisions.Web, Version=13.0.2000.0, Culture=neutral, PublicKeyToken=692fbea5521e1304" namespace="CrystalDecisions.Web" tagprefix="CR" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
    
        
        <asp:Menu ID="Menu1" runat="server">
            <Items>
                <asp:MenuItem NavigateUrl="~/Default.aspx" Text="返回主页" Value="返回主页">
                </asp:MenuItem>
            </Items>
        </asp:Menu>
    
    </div>
    <CR:CrystalReportViewer ID="CrystalReportViewer1" runat="server" 
        AutoDataBind="true" 
        HasRefreshButton="True" />
    </form>
</body>
</html>




你的代码是web的,所以web.config对我没多大用。
而.cs里面,那些代码我都试过,还是去不掉登录窗口。
很纠结。
我现在在犹豫到底要不要给我的数据库加密码。
不加密码的话什么问题都没有了,但是这样数据库结构容易暴露,别人容易仿造
加密码又出现这个登录窗体。

--------------------编程问答-------------------- winform的程序我也没做过,抱歉。根据我的web程序推断,你这应该还是连接字符串没起作用的问题。
程序并不认报表设计阶段的数据连接,而是要认.cs文档中的数据库连接

--------------------编程问答--------------------
引用 24 楼 cnjxndlc 的回复:
winform的程序我也没做过,抱歉。根据我的web程序推断,你这应该还是连接字符串没起作用的问题。
程序并不认报表设计阶段的数据连接,而是要认.cs文档中的数据库连接



哦谢谢 --------------------编程问答--------------------
引用 23 楼 hupo376787 的回复:
我现在在犹豫到底要不要给我的数据库加密码。
 不加密码的话什么问题都没有了,但是这样数据库结构容易暴露,别人容易仿造
 加密码又出现这个登录窗体。

Push把,不要Pull。

任何事情都是这样,把核心东西把握在自己手里,以后才好长期使用。而这个核心技术,在这里,就是:用自己的的通用的Push框架,而不用每一次设计报表都写新的Push,更不用Pull方式。 --------------------编程问答--------------------
引用 26 楼 sp1234 的回复:
Quote: 引用 23 楼 hupo376787 的回复:

我现在在犹豫到底要不要给我的数据库加密码。
 不加密码的话什么问题都没有了,但是这样数据库结构容易暴露,别人容易仿造
 加密码又出现这个登录窗体。

Push把,不要Pull。

任何事情都是这样,把核心东西把握在自己手里,以后才好长期使用。而这个核心技术,在这里,就是:用自己的的通用的Push框架,而不用每一次设计报表都写新的Push,更不用Pull方式。


谢谢,有时间学学push --------------------编程问答-------------------- 哥,你是怎么样解决掉登录窗口的问题的啊?
我也遇到了,在开发环境 就正常,换台电脑就死活不行,按网上的办法还是没用。
能不能加我QQ 1276307639,指导我一下? --------------------编程问答--------------------
引用 28 楼 readson 的回复:
哥,你是怎么样解决掉登录窗口的问题的啊?
我也遇到了,在开发环境 就正常,换台电脑就死活不行,按网上的办法还是没用。
能不能加我QQ 1276307639,指导我一下?


这个抱歉啊,我也没解决。。。

网上有人说用push模式,我没学习,你可以看看。

现在只能用没加密的数据库了,没办法。。。
--------------------编程问答-------------------- 除
补充:.NET技术 ,  图表区
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,