VS2008+WIN2003+ORACLE9i webform水晶报表加载本地图片和数据库图片!!

ivanho 2010-03-26 08:53:08
WIN2003+VS2008+ORACLE9i webform水晶报表加载本地图片和数据库图片

麻烦各位大侠们,教教小弟,水晶报表加载这两种图片的方法,最好有详细的教程或代码实例.

另:

数据库图片分两种,一种只存路径,一种是二进制流.

...全文
349 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
ivanho 2010-03-28
  • 打赏
  • 举报
回复
protected void Page_Load(object sender, EventArgs e)
{
DateTime d = DateTime.Now ;
string L = d.Year.ToString () + (d.Day + 1).ToString () + d.Month.ToString();

DataSet ds = new DataSet();
OracleConnection Con = new OracleConnection(Con_str);
string OraCmd = "select * from bfc_zlpic";
OracleCommand CmdObj = new OracleCommand(OraCmd, Con);
OracleDataAdapter da = new OracleDataAdapter(OraCmd, Con);
OracleCommandBuilder bd = new OracleCommandBuilder(da);
da.Fill(ds);

for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
{
DataSet ds1 = new DataSet();
if (ds.Tables[0].Rows[i]["tplj"] != DBNull.Value)
{

string path = Server.MapPath(ds.Tables[0].Rows[i]["tplj"].ToString());
if (File.Exists(path))
{
ds1.Tables.Add("myTable");
FileStream fs = new FileStream(path, FileMode.Open);
BinaryReader br = new BinaryReader(fs);
addrow(ds, ds1, i, br);
fillimg(ds1);
}
}
}


}

public void addrow(DataSet dssafe, DataSet ds, int i, BinaryReader br)
{
ds.Tables[0].Columns.Add("ywid", typeof(System.String));
ds.Tables[0].Columns.Add("tpzl", typeof(System.Int32));
ds.Tables[0].Columns.Add("cphm", typeof(System.String));
ds.Tables[0].Columns.Add("hpzl", typeof(System.String));
ds.Tables[0].Columns.Add("tplj", typeof(System.Byte[]));
DataRow row = ds.Tables[0].NewRow();
row["ywid"] = dssafe.Tables[0].Rows[i]["ywid"].ToString();
row["tpzl"] = dssafe.Tables[0].Rows[i]["tpzl"].ToString();
row["cphm"] = dssafe.Tables[0].Rows[i]["cphm"].ToString();
row["hpzl"] = dssafe.Tables[0].Rows[i]["hpzl"].ToString();
row["tplj"] = br.ReadBytes((int)br.BaseStream.Length);
ds.Tables[0].Rows.Add(row);

}
public void fillimg(DataSet ds)
{
if (Cache["dataset"] == null)
{
ds.ReadXmlSchema(Server.MapPath("~/App_Code/DataSet1.xsd"));
Cache["dataset"] = ds;
ReportDocument rp = new ReportDocument();
rp.Load(Server.MapPath("CrystalReport1.rpt"));
rp.SetDataSource(ds.Tables[0]);
CrystalReportViewer1.ReportSource = rp;

}
else
{
ds = (DataSet)Cache["dataset"];
ReportDocument rp = new ReportDocument();
rp.Load(Server.MapPath("CrystalReport1.rpt"));
rp.SetDataSource(ds.Tables[0]);
CrystalReportViewer1.ReportSource = rp;
}

}

现在我是这么写的,却报错:

登录失败。详细资料: crdb_adoplus : 未将对象引用设置到对象的实例。文件 C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\CrystalReport1 {805D4B2B-37E4-4EEA-AB2C-C03FF2E8C6F7}.rpt 内出错:无法连接:错误的登录参数。
ivanho 2010-03-28
  • 打赏
  • 举报
回复
谢...各位,问题都解决了...

阿双2009 2010-03-28
  • 打赏
  • 举报
回复
if (Session["myRpt"] != null)

这里的Session改成Cache.
Sorry!
阿双2009 2010-03-28
  • 打赏
  • 举报
回复
你的代码比较杂,我把它整理如下,你再试试看:


protected void Page_Init(object sender, EventArgs e)
{
DataSet ds = new DataSet();
OracleConnection Con = new OracleConnection(Con_str);
string strSQL = "select * from bfc_zlpic";
OracleDataAdapter da = new OracleDataAdapter(strSQL, Con);
da.Fill(ds);

DataSet1 myDataSet = new Dataset1();
FileStream fs;
BinaryReader br;

for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
{
string _ywid = Convert.ToString(ds.Tables[0].Rows[i]["ywid"]);
int _tpzl = Convert.ToInt32(ds.Tables[0].Rows[i]["tpzl"]);
string _cphm = Convert.ToString(ds.Tables[0].Rows[i]["cphm"]);
string _hpzl = Convert.ToString(ds.Tables[0].Rows[i]["hpzl"]);
string _tplj = Convert.ToString(ds.Tables[0].Rows[i]["tplj"]);

if (_tplj.Length != 0)
{
fs = new FileStream(_tplj, FileMode.Open);
br = new BinaryReader(fs);
byte[] pictureData = br.ReadBytes((int)br.BaseStream.Length);
AddOneRow(myDataSet, _ywid, _tpzl, _cphm, _hpzl, pictureData);
}
else
{
AddOneRow(myDataSet, _ywid, _tpzl, _cphm, _hpzl, null);
}
}

if (Session["myRpt"] != null)
{
CrystalReportViewer1.ReportSource = (ReportDocument)Cache["myRpt"];
}
else
{
ReportDocument myReport = new ReportDocument();
myReport.Load(Server.MapPath("CrystalReport1.rpt"));
myReport.SetDataSource(myDataSet);
CrystalReportViewer1.ReportSource = myReport;

Cache["myRpt"] = myReport;
}
}

public void AddOneRow(DataSet1 ds,string ywid,int tpzl,string cphm,string hpzl,byte[] tplj)
{
ds.myTable.AddmyTableRow(ywid, tpzl, cphm, hpzl, tpzl);
}


要注意的是,因为你是在vs2008的环境下,所以代码应放在Page_Init,而不应该放在Page_Load;还有应确保你构造的数据集DataSet1的数据结构(名称和类型)要和数据库的字段结构保持一致。
阿泰 2010-03-27
  • 打赏
  • 举报
回复
二进制流的话建议使用PULL模式,参考本文。
照着做一下找找感觉吧,你的思路应该是还没理顺
【水晶报表内功心法】--PULL模式样板招式
阿双2009 2010-03-27
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 ivanho 的回复:]
上边那个报错搞定了,原来是参数的类型没设好,应为:System.Byte[]

现在能显示二进制流的图片,但有点缺陷,不知为何只显一个图片...


新问题是:若数据库保存的是图片路径,怎么把图片显示出来.
[/Quote]

这样还是用push吧
[Quote]
自己构造一个DataSet,把本地图片读成二进制流写进去
然后将这个DataSet推给报表就行了
[/Quote]
即使是二进制流的话,也可(byte[])这样转化下写进DataSet,再推送给报表。
阿双2009 2010-03-27
  • 打赏
  • 举报
回复
你这样并没指定数据源啊,
ivanho 2010-03-27
  • 打赏
  • 举报
回复
添加了一个.XSD.然后我就运行了,运行后就报错了.
ivanho 2010-03-27
  • 打赏
  • 举报
回复
后台那边没有
ivanho 2010-03-27
  • 打赏
  • 举报
回复
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>

<%@ Register assembly="CrystalDecisions.Web, Version=10.5.3700.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>

<CR:CrystalReportViewer ID="CrystalReportViewer1" runat="server"
AutoDataBind="True" DisplayGroupTree="False" EnableDatabaseLogonPrompt="False"
EnableParameterPrompt="False" Height="1123px"
ReportSourceID="CrystalReportSource1" Width="773px" />
<CR:CrystalReportSource ID="CrystalReportSource1" runat="server">
<Report FileName="CrystalReport1.rpt">
</Report>
</CR:CrystalReportSource>

</div>
</form>
</body>
</html>
阿双2009 2010-03-27
  • 打赏
  • 举报
回复
那是你数据库配置不正确了。。你怎么设置报表数据源的,能否把代码贴出来看看?
ivanho 2010-03-27
  • 打赏
  • 举报
回复
报的都是这个错:

登录失败。详细资料: crdb_adoplus : 未将对象引用设置到对象的实例。文件 C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\CrystalReport1 {B2C6C6D1-E199-4ACE-B4C0-D47DE15694DE}.rpt 内出错:无法连接:错误的登录参数。
阿双2009 2010-03-27
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 ivanho 的回复:]
我刚才试过,但就是不显示图片,就像一般的字段一样拉到报表内,就是不显示
[/Quote]

一般的普通字段(非图片字段)都不显示?你是pull还是push模式?
ivanho 2010-03-27
  • 打赏
  • 举报
回复
我刚才试过,但就是不显示图片,就像一般的字段一样拉到报表内,就是不显示
阿双2009 2010-03-27
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 ivanho 的回复:]
这个...我看过几次了,不过这是一个VB的例子,况且只提供了一种参考,就是数据库保存图片路径那种.

我还想知道的是保存二进制流的那种.

至于本地图片,相信和数据库图片路径那种相像.
[/Quote]

我想泰哥的文章已经写的很详尽了呃,标题就已写明
水晶报表中如何动态加载图片(图片文件版本及数据库版本)
况且如果你是用c#,也没什么两样。。
阿泰 2010-03-27
  • 打赏
  • 举报
回复
数据库二进制流,不需要任何代码,把字段拖到报表中就能显示。
前提是水晶报表能支持该格式的图片。
ivanho 2010-03-27
  • 打赏
  • 举报
回复
这个...我看过几次了,不过这是一个VB的例子,况且只提供了一种参考,就是数据库保存图片路径那种.

我还想知道的是保存二进制流的那种.

至于本地图片,相信和数据库图片路径那种相像.
阿双2009 2010-03-27
  • 打赏
  • 举报
回复
http://www.cnblogs.com/babyt/articles/142789.html

这篇文章正是你所需要的 :)
不过提醒一下,GIF的图片不支持。
ivanho 2010-03-27
  • 打赏
  • 举报
回复
上边那个报错搞定了,原来是参数的类型没设好,应为:System.Byte[]

现在能显示二进制流的图片,但有点缺陷,不知为何只显一个图片...


新问题是:若数据库保存的是图片路径,怎么把图片显示出来.
ivanho 2010-03-27
  • 打赏
  • 举报
回复
跟步骤直了一个流程:

数据库的文字字段是可以显示了,但一量把BLOB字段一放进去,就报这个:


打开行集失败。详细资料: ADO 错误代码: 0x 源: Microsoft OLE DB Provider for Oracle 说明: 未指定的错误打开行集失败。详细资料: ADO 错误代码: 0x 源: Microsoft OLE DB Provider for Oracle 说明: 发生了一个 Oracle 错误,但无法从 Oracle 中检索错误信息。打开行集失败。详细资料: ADO 错误代码: 0x 源: Microsoft OLE DB Provider for Oracle 说明: 数据类型不被支持。打开行集失败。文件 C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\CrystalReport1 {4352660C-5659-4A06-8B0C-3202A18621B3}.rpt内出错:未能打开行集。

4,816

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 图表区
社区管理员
  • 图表区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧