水晶报表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.Database.Tables[0].ApplyLogOnInfo(LogOnInfo);
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[i].ApplyLogOnInfo(LogOnInfo); --------------------编程问答--------------------
哦,对不起,那儿打错了。
但是还是提示登录 --------------------编程问答-------------------- csdn不晓得怎么上传文件
这是原文件http://pan.baidu.com/share/link?shareid=271066560&uk=1645014614
不是我想省事劳烦管理员,只是快两个星期了,还没解决。
我的代码看着没错误,可就是刷新不出来。
希望管理员给查查原因。
代码都写好了。
--------------------编程问答-------------------- 我这边没有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;
}
加载和要刷新的地方直接调用这个函数即可。 --------------------编程问答--------------------
这样还是老样子。。。
随便更改数据库里面的一个数值。。。
重新加载还是不显示新的数据。。。
谢谢版主帮忙,我打算学习一下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模式则显得灵活许多。。 --------------------编程问答--------------------
有密码的。
要是没有密码,刷新什么的都没问题。但是加了密码,就不好刷新了。
--------------------编程问答--------------------
我在sap社区咨询了一下。他们这么回复的,说仅支持ODBC连接。
你看看这个http://scn.sap.com/message/14179792#14179792
版主帮忙分析一下设呢吗情况,要建立ODBC连接? --------------------编程问答-------------------- 水晶报表设计界面,报表选项中有个这样的选项:"为提高速度而使用索引或服务器",把这前面的勾去掉,保存后再试下。类似的登录框和刷新问题困扰了我很久,我最后是用此法解决的。当然还不知是不是最好的方法。 --------------------编程问答-------------------- 除 --------------------编程问答--------------------
你好,我是了你的方法,貌似不管用哦 --------------------编程问答-------------------- 你的问题是不是数据库修改了数据,然后报表的数据不能及时刷新?
这个问题我是通过上述方法解决的 --------------------编程问答--------------------
是的。数据库修改了数据,报表数据在刷新的话,会弹出来一个登陆窗口,要什么用户名,密码,这个我根本没设置,所以不知道怎么办。
我的问题是怎么绕过这个登陆窗体
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> --------------------编程问答-------------------- 除 --------------------编程问答--------------------
灰常感谢啊,兄弟。我的QQ邮箱:376787823@qq.com
我做的是单机版的winfrom,可能只需要设置一下.cs中代码就可以,web.config还用不到的。
等你的资料哦 --------------------编程问答--------------------
谢谢。不过水晶报表我现在研究的就差这个问题了,再换其他的报表要从头开始设计,太麻烦。
除非他们能支持水晶报表导入,这样就不用重新设计报表了 --------------------编程问答--------------------
你的代码是web的,所以web.config对我没多大用。
而.cs里面,那些代码我都试过,还是去不掉登录窗口。
很纠结。
我现在在犹豫到底要不要给我的数据库加密码。
不加密码的话什么问题都没有了,但是这样数据库结构容易暴露,别人容易仿造
加密码又出现这个登录窗体。
--------------------编程问答-------------------- winform的程序我也没做过,抱歉。根据我的web程序推断,你这应该还是连接字符串没起作用的问题。
程序并不认报表设计阶段的数据连接,而是要认.cs文档中的数据库连接
--------------------编程问答--------------------
哦谢谢 --------------------编程问答--------------------
Push把,不要Pull。
任何事情都是这样,把核心东西把握在自己手里,以后才好长期使用。而这个核心技术,在这里,就是:用自己的的通用的Push框架,而不用每一次设计报表都写新的Push,更不用Pull方式。 --------------------编程问答--------------------
谢谢,有时间学学push --------------------编程问答-------------------- 哥,你是怎么样解决掉登录窗口的问题的啊?
我也遇到了,在开发环境 就正常,换台电脑就死活不行,按网上的办法还是没用。
能不能加我QQ 1276307639,指导我一下? --------------------编程问答--------------------
哥,你是怎么样解决掉登录窗口的问题的啊?
我也遇到了,在开发环境 就正常,换台电脑就死活不行,按网上的办法还是没用。
能不能加我QQ 1276307639,指导我一下?
这个抱歉啊,我也没解决。。。
网上有人说用push模式,我没学习,你可以看看。
现在只能用没加密的数据库了,没办法。。。
--------------------编程问答-------------------- 除
补充:.NET技术 , 图表区