以下內容為程序代碼:
在我們對VSNet中的水晶報表(Crystal Reports)進行研究之前我和我朋友對如何將這個復雜的東東加入我們的Web應用有著非常的好奇心一周以後在閱讀了大量的HOWTO文檔之後我們成功地將一些簡單的報告加入到了我們的程序中並得到了一些小決竅
這篇文章教你如何在Net Web應用中使用水晶報表也可以讓你在學習過程中少走一些彎路為了得到最好的效果讀者最好需要有一些基礎的AspNet訪問數據庫的知識以及使用VSNet的開發經驗
簡介
水晶報表可以由很多的方法得到其中一個就是使用VSNet來創建它提供了非常豐富模型以使我們能夠在運行時操作屬性和方法如果你正在使用VSNet開發Net程序那麼你就不需要再安裝其它軟件了因為他已經內嵌在VSNet中了
優點:
VSNet水晶報表有下面一些主要的優點
快速的報表開發
能夠導出成為復雜的交互性圖表
可以與其它控件一起在WebForm中使用
能夠動態地將報表導出成為pdfdocxlshtmlrtf等多種格式
結構
一些組件組成了水晶報表的二層結構需要的Web應用有
客戶端 :
客戶端僅需要一個可以訪問嵌入aspx頁面報表的游覽器就可以了
服務器 :
水晶報表引擎(Crystal Report Engine (CREnginedll))
通過它可以完成一些任務如在報告文件中合並數據轉換報告為其它格式等也正是因為報告引擎的作用才可以將AspNet中的水晶報表轉換成為普通HTML格式
水晶報表設計器(Crystal Report Designer (CRDesignerdll))
水晶報表就是在設計器中創建的在設計器中你可以設計標題插入數據公式圖表子報表等
rpt報表文件
執行報表中的第一步就是在水晶報表設計器接口創建此報表在默認安裝中微軟已經提供了一些現成的rpt例子
Data Source
rpt文件取得數據庫的方法取決於你方法的選擇你能選擇讓水晶報表自己選擇數據而不使用任何代碼或者也可以選擇手動的組裝DataSet然後再將其傳送到報表文件
水晶報表查看控件(Crystal Report Viewer web form Control (CRWebFormViewerdll))
水晶報表查看控件是一個WebForm控件可以將它看成是一個在aspx頁面中存放報表的容器 注意在一些復雜的操作中報表服務器與Web服務器可能不在同一物理主機上Web服務器將HTTP請求傳送到報表服務器上去水晶報表也可以當做WebService來執行
執行模式
水晶報表取數據可以使用下面的方法實現
Pull 模式:
被請求時水晶報表直接根據指定的驅動連接數據庫然後組裝這些數據
Push 模式 :
此時開發表不得不自己編寫代碼連接數據並組裝DataSet同時將它傳送至報表在些這種情況下通過使用連接共享以及限制記錄集合的大小可以使用報表性能最大化
報表類型
水晶報表設計器能夠直接包含報表至工程也能夠使用獨立的報表對象
Stronglytyped 報表 :
當你將報表文件加入到項目中去時它就變成了一個了 stronglytyped報表在這些情況下你將擁有直接創建報表的對象的權力這將減少一些代碼並且能夠提供一些性能
UnTyped 報表 :
這裡的報表並不直接包含在項目中因此稱為untyped 報表在這種情況下你不得不使用水晶報表的ReportDocuemt對象建立一個實例並且手動地凋用報表
其它注意事項
盡管水晶報表查看器擁有一些很酷的功能如縮放頁面導航等但是他不提供打印功能你不得不調用游覽器的打印功能
VSNet中的水晶報表如果沒有注冊那麼它只能使用次次後保存功能就不能再使用了為了避免這個你不是不在 這裡注冊此產品 (好像不是這樣子的不注冊也好像能用很長的時間只是不能提供支持)
默認安裝的水晶報表只能支持個用戶為了支持更多的用戶你不得不在 中購買許可證
讓我們感受一下----在中使用一個現成的水晶報表文件
) 從WebForm工具欄中拖動水晶報表查看器控件(Crystal Report Viewer)至aspx頁面中
) 調出水晶報表查看器控件的屬性窗口
) 點擊[]按鈕查看Data Binding屬性並彈出了DataBinding窗口
) 從左邊的Bindable屬性區中選擇Report Source
) 選中自定義綁定表達式單選按鈕在右邊的底部的窗口中指定rpt文件的文件名和路徑例如C:\\Program Files\\Microsoft Visual StudioNET\\Crystal Reports\\Samples\\Reports\\General Business\\World Sales Reportrpt然後確定
注意文件World Sales Reportrpt文件是在VSNet安裝時創建的如果你在安裝過程中指定了其它目錄此時你最好確認一下路徑的正確性
上面的步驟中實際上是插入了下面這些代碼至AspNet文件中
以及
id=CrystalReportViewer
runat=server Width=px Height=px
ReportSource=>
注意在飛刀我的VSNet正式版中自動生成的代碼中ReportSource產生的樣式不是這樣子的它是
ReportSource=
這樣是錯誤的會出現錯誤信息有兩處錯誤
必須按照使用本文介紹的格式來手動修改這也算是VSNet的一個Bug吧
) 在Page_Load方法中調用DataBind方法(代碼為VBNet)
Private Sub Page_Load(ByVal sender As SystemObject ByVal e As SystemEventArgs)
DataBind()
End Sub
)保存並編譯你的頁面 現在你就有一個內嵌水晶報表的WebForm頁面了
注意實際開發中一開始會出現無法訪問inetsrv目錄的錯誤解決的辦法是改變其目錄的安全屬性使User用戶有可寫的權限飛刀我發現Net系統自已給出的解決方法是沒有用的也可能是我使用的是WindowsNet操作系統的原因
以下內容為程序代碼:
使用Pull模式
我們將通過下面的這些步驟來通過Pull模式來執行水晶報表
首先創建rpt文件並使用水晶報表設計接口設置一些必須的數據連接
拖放一個 CrystalReportViewer控件至aspx頁面設置它的屬性指定我們上一步創建的rpt文件
在代碼中調用DataBind方法
創建 rpt 文件:
) 在右擊解決方案游覽器在彈出的菜單中選擇添加--添加新項-->Crystal Report
) 在Crystal Report 庫中選擇作為空白報表單選按鈕最後單擊確定
)這裡將彈出水晶報表設計器
) 右擊報表中的詳細資料區選擇數據庫->添加/刪除數據庫
) 在彈出的數據庫專家中擴展OLE DB(ADO)選項此時會彈出另外一個OLE DB(ADO)窗口
) 在 OLE DB (ADO) 彈出窗口中選擇 Microsoft OLE DB Provider for SQL Server 然後 Next
) 指定連接的信息
服務器 : ASPCN (您的機器是什麼名字就寫什麼)
用戶 ID: sa
密碼:
數據庫 : Pubs
) 單擊Next最後單擊Finish按鈕
) 這時你就能在數據庫專家窗口中看到我們選擇的數據庫
) 擴展Pubs數據庫擴展表選擇Stores表並將其加到選定的表區中單擊OK按鈕
) 現在在字段資源浏覽器中就會在左邊數據庫字段區中顯示你選擇的表以及表中的字段
) 拖放需要的字段進入報表的詳細資料區字段名將會自動出現在頁眉區如果你想修改頭部文字則可以右擊頁眉區中的文字選擇編輯文本對象選項並進行編輯
) 保存這樣我們就有了一個水晶報表文件
創建 CrystalReportViewer 控件
) 回到前面的WebForm中拖放一個Crystal Report Viewer控件到頁面中去
) 調出Crystal Report Viewer控件的屬性窗口選擇DataBindings區點擊[]
) Crystal Report Viewer 數據綁定窗口中在右邊的可綁定屬性中選擇ReportSource並選擇右下角的自定義綁定表達式中指定rpt文件路徑
) 此時你能夠從Crystal Report Viewer 控件中看到使用一些虛擬數據組成的報表文件的預覽
注意在上面的例子中CrystalReportViewer可以在設計時直接調用真實的數據因為此時數據已經保存在這種情況下設計時當沒有保存數據時他是不能顯示數據的取而代這的是顯示一些虛擬的數據只有在執行時才會選取真實的數據
Code Behind 程序設計
) 在Page_Load方法中調用DataBind方法
執行你的程序
) 創建並運行你的程序!
您現在就可以直接在Web頁面中使用水晶報表內置的一些功能如頁面導航縮放等
[HTML]我們采用下面的幾步使用Push模式執行水晶報表
設計一個DataSet
創建一個rpt文件同時將其指定給上一步建立的DataSet
在aspx頁面中拖放一個CrystalReportViewer控件同時將其與前面的rpt文件建立聯系
在代碼中訪問數據庫並把數據存入DataSet
調用DataBind方法
設計一個DataSet
) 右擊解決方案浏覽器選擇添加添加新項>數據集
) 從服務器資源管理器中的SQL Server中拖放Stores表(位於PUBS數據庫中)
) 此時在數據集中就會有一個Stores表的結構圖
xsd文件中僅僅包含一個結構圖但是不會有任何數據在裡面
創建 rpt 文件 :
) 使用上面的介紹過的方法創建此文件唯一的不同就是使用數據集來代替前面的直接連接數據
)建立rpt文件之後右擊詳細資料>添加/刪除數據庫
) 在數據庫專家窗口中展開項目數據(代替以前的OleDb)展開ADONet數據集DataSet選擇Stores表
) 將Stores表添加到選定的表中點擊OK
) 使用PULL模式下的方法建立一個WebForm
建立一個Crystal Report Viewer 控件
) 建立一個Crystal Report Viewer 控件並設定其屬性此處與PULL模式下是一致的
Code Behind 代碼:
) 在Page_Load方法中使用下面的子函數
VBNet代碼
Sub BindReport()
Dim myConnection As New SqlClientSqlConnection()
myConnectionConnectionString= server= (local)\NetSDK;database=pubs;Trusted_Connection=yes
Dim MyCommand As New SqlClientSqlCommand()
MyCommandConnection = myConnection
MyCommandCommandText = Select * from Stores
MyCommandCommandType = CommandTypeText
Dim MyDA As New SqlClientSqlDataAdapter()
MyDASelectCommand = MyCommand
Dim myDS As New Dataset()
這就是我們在設計模式上使用的DataSet
MyDAFill(myDS Stores)
你不得不使用與你前面DataSet相同名字
Dim oRpt As New CrystalReport()
水晶報表綁定
oRptSetDataSource(myDS)
設定水晶報表的ReportSource
CrystalReportViewerReportSource = oRpt
End Sub
C#代碼
private void BindReport()
{
string strProvider = Server=(local);DataBase=pubs;UID=sa;PWD=;
CrystalReport oCR = new CrystalReport();
Dataset ds = new Dataset();
SqlConnection MyConn = new SqlConnection(strProvider);
MyConnOpen();
string strSel = Select * from Stores;
SqlDataAdapter MyAdapter = new SqlDataAdapter(strSelMyConn);
MyAdapterFill(dsstores);
oCRSetDataSource(ds);
thisCrystalReportViewerReportSource = oCR;
}
注意在上面的代碼中你得注意一下oRpt是Strongly Typed的報表文件如果你需要使用UnTyped報表你得使用ReportDocument對象然後再調用報表文件
運行你的程序
) 運行你的程序
將報表文件導出成為其它格式
你能夠將報表文件導出成為下列格式
PDF (Portable Document Format)
DOC (MS Word Document)
XLS (MS Excel Spreadsheet)
HTML (Hyper Text Markup Language – or compliant)
RTF (Rich Text Format)
使用Pull模式導出報表
當導出使用Pull模式創建的文件時水晶報表准確地打開所需要的數據下面是執行導出功能的代碼
C#代碼:
VBNet代碼:
Private Sub Button_Click(ByVal sender As SystemObject ByVal e As SystemEventArgs) Handles ButtonClick
Dim myReport As CrystalReport = New CrystalReport()
注意這裡我們建立一個strongtyped的水晶報表實例
Dim DiskOpts As CrystalDecisionsSharedDiskFileDestinationOptions = New CrystalDecisionsSharedDiskFileDestinationOptions()
myReportExportOptionsExportDestinationType = CrystalDecisions[Shared]ExportDestinationTypeDiskFile
導出成為其它文件時也需要這個選項
如Microsoft Exchange MAPI等
myReportExportOptionsExportFormatType = CrystalDecisions [Shared]ExportFormatTypePortableDocFormat
這裡我們導出成為pdf格式文件你也能選擇上面的其它類型文件
DiskOptsDiskFileName = c:\Outputpdf
如果你不指定確切的目錄那麼文件就會保存到[Windows]\System目錄中去了
myReportExportOptionsDestinationOptions = DiskOpts
水晶報表文件不包含直接的FileName屬性因此你不能直接指定保存的文件名
所以你不得不使用DiskFileDestinationOptions對象設置它的DiskFileName屬性
為你想要的路徑最後將水晶報表的DestinationsOptions屬性指定為上面的DiskFileDestinationOption
myReportExport()
上面的代碼將完成導出工作
End Sub
使用PUSH模式導出水晶報表
當導出的報表是由PUSH模式建立的時第一步就是通過編程建立連接並組裝DataSet設置報表的的SetDataSource屬性再下面的步驟就有Pull模式一樣的了
[/HTML]
NET環境下水晶報表使用總結
水晶報表是一個優秀的報表開發工具本人在開發通用管理系統的時候所有報表都使用水晶報表其簡單易用和強大的功能令筆者倍加喜愛現將水晶報表使用手記呈現給大家
一在使用自帶的水晶報表時請注冊否則只能使用次
水晶報表注冊碼
注冊號:
密碼:AAPGKSGDEDS
二使用CrystalReportViewer進行預覽
CrystalReportViewer控件允許在應用程序中查看 Crystal ReportReportSource 屬性用於設置要查看哪個報表該屬性設置之後報表顯示在查看器中報表源可以是ReportDocument報表文件的路徑也可以是強類型報表
打開工具箱並將一個 CrystalReportViewer 拖到窗體上我們命名為rptVew
通過拖放操作將 Windows 窗體查看器調整到希望的大小並將其移動到所需位置
當運行應用程序時報表將顯示在查看器中
三創建新報表
指向添加單擊添加新項
在添加新項對話框中從模板區域選擇 Crystal Report將報表命名為rptClient單擊打開
在 Crystal Report 庫中選擇下列選項之一
· 使用報表專家 — 指導您完成報表的創建過程並將您的選擇添加到 Crystal Report Designer
· 作為空白報表 — 打開 Crystal Report Designer
· 來自於現有的報表 — 創建新報表它與指定的另一報表設計相同
注意 Crystal Report 庫包含許多專家可以指導您完成數個特定類型報表的創建工作您可能希望使用專家來創建最初的報表以確定哪種報表構造方法適合您的需要
單擊確定按鈕
如果選擇使用報表專家便會出現報表專家對話框並帶有數據資源管理器為每個文件夾選擇所需數據完成報表專家選項卡界面上的操作然後單擊完成來訪問 Crystal Report Designer 和您的報表
四是否需要動態設置數據源?
Crystal Reports 通過數據庫驅動程序與數據庫連接每個驅動程序都被編寫為可處理特定數據庫類型或數據庫訪問技術
拉和推模型
為了向開發人員提供最靈活的數據訪問方法Crystal Reports 數據庫驅動程序被設計為可同時提供數據訪問的拉模型和推模型
拉模型
在拉模型中驅動程序將連接到數據庫並根據需要將數據拉進來使用這種模型時與數據庫的連接和為了獲取數據而執行的 SQL 命令都同時由 Crystal Reports 本身處理不需要開發人員編寫代碼如果在運行時無須編寫任何特殊代碼則使用拉模型
推模型
相反推模型需要開發人員編寫代碼以連接到數據庫執行 SQL 命令以創建與報表中的字段匹配的記錄集或數據集並且將該對象傳遞給報表該方法使您可以將連接共享置入應用程序中並在 Crystal Reports 收到數據之前先將數據篩選出來
四從 ADONET 數據集制作報表
從數據庫創建數據集對象
在項目中新建一個架構文件
a 在解決方案資源管理器中右擊項目名指向添加然後單擊添加新項
b 在添加新項對話框的類別區域展開文件夾然後選擇數據
c 在模板區域選擇數據集
d 接受默認名稱 Datasetxsd
這就創建了一個新的架構文件 (Datasetxsd)以後將用它來生成強類型數據集該架構文件將顯示在 ADONET 數據集設計器中
指定數據庫位置
a 在服務器資源管理器中右擊數據連接並選擇添加連接
b 在數據鏈接屬性對話框中單擊提供程序選項卡然後選擇一個提供程序(例如 Microsoft OLE DB Provider for SQL Server)
c 單擊連接選項卡然後指定您的數據庫所在位置在所需位置輸入服務器和登錄信息
d 單擊確定按鈕
此時您的數據庫及其表和字段就出現在服務器資源管理器的數據連接節點下面
在解決方案資源管理器中雙擊 Datasetxsd (如果它尚不是活動視圖)
Datasetxsd 現在應顯示在數據集選項卡中
若要為數據集建立架構請將需要的表從服務器資源管理器中拖動到 Datasetxsd 的數據集選項卡上
單擊保存 Datasetxsd來保存Datasetxsd文件
在生成菜單上單擊生成為項目生成數據集對象
ADONET 數據集對象提供數據的描述從它可以向 Crystal report 添加表使用 Crystal Report Designer 中的數據庫專家從 ADONET 數據集對象添加表
請在使用報表專家創建新報表時調用數據庫專家或者要從一個已經使用 ADONET 建立好的報表中訪問數據庫專家請在 Report Designer 中右擊指向數據庫然後單擊添加/刪除數據庫
將報表連接到 ADONET 數據集對象
在數據庫專家中展開項目數據文件夾
展開ADONET 數據集文件夾
選擇所需數據集對象
例如如果當時使用的是從項目WindowsApplication的架構文件Datasetxsd中生成的數據集對象則應該選擇WindowsApplicationDataset
選擇要向報表中添加的表和使用其他數據源一樣
五動態改變數據源的代碼
Dim dsdataSet As New DataSet()
Dim oRpt As New rptClient() 已建立的報表rptClient
請讀者自行填充數據集dsdataSet
使用報表引擎對象模型將填充的數據集傳遞給報表
oRptSetDataSource(dsdataSetTables())
將帶有數據的報表對象綁定到 Windows 窗體查看器rptVew(CrystalReportViewer控件)
rptVewReportSource = oRpt
注意 FillDataSet 方法可連接到指定的數據庫提取數據然後斷開數據庫連接如果您希望將數據庫中的多個表添加到報表中請使用 SQL JOIN 語句將這些表聯接在一起然後在 FillDataSet 方法中指定一個結果表
六創建主從報表
在報表中有許多報表是主從表結構比如訂單與訂單商品明細訂單是一個表中的一條記錄而分錄是另一個表中的多條記錄兩個表通過一個字段關聯起來這種報表可利用其分組功能實現
新建一個工程
往FORM中添加一個CrystalReportViewer控件
在服務噐資源管理器中連接到SQL SERVER 上的Northwind數據庫
添加一個數據集Dataset將服務器資源管理器中的Orders和 Order Details加入到數據集中
添加一個水晶報表使用報表專家在項目數據中選擇ADONET數據集插入表Orders和 Order Details鏈接中是關聯字段的鏈接在字段中選擇要顯示的主表和明細表的字段組中選擇分組依據為Orders表OrdersID字段總計圖表選擇(可進行篩選)樣式(可設置報表標題)可自行設置設置完後點擊完成
在報表設計器中調整需要顯示的字段的位置寬度等
在窗口中添加代碼
Private Sub Form_Load(ByVal sender As SystemObject ByVal e As SystemEventArgs) Handles MyBaseLoad
Dim oRpt As New CrystalReport()
Dim dsdataSet As New Dataset()
Dim CN As New DataSqlClientSqlConnection(data source=PMSERVER;initial catalog=Northwind;user id=sa;password=sa)
CNOpen()
Dim daOrders As New DataSqlClientSqlDataAdapter(select * from orders CN)
daOrdersFill(dsdataSet orders)
Dim daDetails As New DataSqlClientSqlDataAdapter(select * from [Order Details] CN)
daDetailsFill(dsdataSet Order Details)
使用報表引擎對象模型將填充的數據集傳遞給報表
oRptSetDataSource(dsdataSet)
CrystalReportViewerReportSource = oRpt
End Sub
運行程序
七用程序改變報表中text的文本
代碼如下
Dim GetTextObject As TextObject
按名稱獲取 ReportObject將其轉換為 TextObject並返回此對象
GetTextObject = orptReportDefinitionReportObjectsItem(text)
GetTextObjectText = XXXX系統
總結水晶報表具有非常強大的功能還可進行導出WORDEXCELRTF等文件還可生成復雜漂亮圖表是進行WEB和WINDOWS報表開發的利器
(此文部分資料來自MSDN)
Author:李洪根
EMAIL:
本人有如下設想
通過連接查詢獲得SQL數據庫相關數據
置放在DataSet裡
調用水晶報表(線形或柱形模板)生成報表
輸出生成EXCEL文檔
請教各位大俠如何實現以上思路?(如有范例就更好了)
非常感謝!
在你的工程中添加新項目DataSet連結數據庫將需要的數據表或預存程序
拖入此DataSet中編譯DataSet
使用自帶的Crystal Report以DataSet為數據源建立報表
在程序中將數據推入此報表中
Crystal Report 有輸出為Excel的選項通過程序也可以實現
Dim conn As SqlConnection
Dim da As SqlDataAdapter
Dim strSQL As String
conn = New SqlConnection()
connConnectionString = User ID=sa; PWD=;Data Source=xxxx; Initial Catalog =xxxxx
connOpen()
strSQL = Select * from TableName
da = New SqlDataAdapter(strSQL conn)
Dim ds As New DataSet()
daFill(ds TableName)
Dim RptDoc As New ReportName()
RptDocSetDataSource(ds)
給RptDoc 指定數據
CrystalViewReportSource = RptDoc 給CrystalView指定數據
CrystalViewDataBind()
connClose()
如果需要顯示的為多表關聯的字段最好以存儲過程建立DataSet
請參考如下代碼:
string strconn=連接串;
SqlConnection myconn=new SqlConnection(strconn);
string strcmd=@select語句;
SqlCommand mycmd=new SqlCommand(strcmdmyconn);
SqlDataAdapter myda=new SqlDataAdapter(strcmdmyconn);
DataSet myds=new DataSet();
myconnOpen();
mydaFill(myds報表名);
報表名 myrpt =new 報表名();
myrptSetDataSource(myds);
thisCrystalReportViewerReportSource=myrpt;
導出到EXCEL:
myrptExportOptionsExportDestinationType=CrystalDecisionsSharedExportDestinationTypeDiskFile;
myrptExportOptionsExportFormatType=CrystalDecisionsSharedExportFormatTypeExcel;
CrystalDecisionsSharedDiskFileDestinationOptions opt=new CrystalDecisionsSharedDiskFileDestinationOptions();
optDiskFileName=@文件名;
myrptExportOptionsDestinationOptions =opt;
myrptExport();
水晶報表的中文幫助 下載
x
Crystal Reports for Visual Studio NET
PictureObject 成員請參見
PictureObject 類 ¦ CrystalDecisionsCrystalReportsEngine 命名空間
公共實例屬性
Border(從 ReportObject 中繼承而來) Border獲取 Border 對象
Height(從 ReportObject 中繼承而來) Int獲取或設置以缇為單位的對象高度
Kind(從 ReportObject 中繼承而來) ReportObjectKind獲取報表對象的類型
Left(從 ReportObject 中繼承而來) Int獲取或設置以缇為單位的對象左上角位置
Name(從 ReportObject 中繼承而來) 字符串獲取對象名
ObjectFormat(從 ReportObject 中繼承而來) ObjectFormat獲取 ObjectFormat 對象
Top(從 ReportObject 中繼承而來) Int獲取或設置以缇為單位的對象頂部位置
Width(從 ReportObject 中繼承而來) Int獲取或設置以缇為單位的對象寬度
請參見
PictureObject 類
Imports CrystalDecisionsCrystalReportsEngine
Dim picObject As PictureObject
picObject = oRptReportDefinitionReportObjectsItem(picture)
來自
大家在基於webform中使用水晶報表時如果簡單的按照網上阿刀的做法肯定會提示你登陸失敗
對於這個問題斑竹我花了整整一天的時間研究水晶報表的幫助文件終於得到解決方案
我不是一個保守的人我相信有很多的網友正和我一樣在花費精力在研究這個問題我不願意大家再和我一樣白白的花費精力
下面是我實現該方案的幾個步驟大家不要著急慢慢的看下去會對你有很大的幫助
步驟一看示例文件
水晶報表自帶一個示例文件數據庫是access(不帶密碼的)我首先運行示例文件(基於webform和winform)結果顯示了正確的報表正如飛刀的示例
於是我自己建立了一個報表文件和aspx文件結果顯示登陸失敗!可是我把報表文件換成示例的報表文件不再出錯
問題出在什麼地方?難道是報表格式文件有關於登陸權限的設置?通過跟蹤調試我對比分析我的報表文件和示例報表文件沒有發現任何的不同看來問題不在報表文件
是數據庫的問題?我建立一個access結果還是登陸失敗!
不是數據庫的問題(我自己的數據庫是未帶密碼的access幫助中的數據庫也是如此)?也不是報表格式文件的問題(我仔細分析了兩者的原代碼是相同的)?
那麼問題出現在什麼地方?我白思不得其解!
步驟二找幫助文件
於是我再次求助於幫助我翻遍了水晶報表的幫助終於找到 訪問安全數據庫 [C#]字樣發現這裡有下面的一段話
通過 Crystal Reports for Visual Studio NET 訪問安全數據庫的過程在 Web 窗體和 Windows 窗體之間有所不同在 Windows 窗體中對話框自動提示用戶輸入用戶名和密碼(測試很容易成功)而在 Web 窗體中您需要設計一個表單以從用戶獲取該信息對於這兩種情況均可使用代碼來指定用戶名和密碼從而為應用程序的所有用戶提供相同的安全等級
於是我對同樣的數據庫(先是用幫助示例中的access數據庫後來用自己建立的access數據庫)發現對於同一個報表文件對於winform能顯示成功而對於webform則仍然顯示登陸失敗!於是我有點明白上面的意思!
看來問題是出在權限的設置上
步驟三研究幫助終於成功!
在幫助裡我找到設置數據庫登錄參數字樣裡面提供了一些後來發現是非常有用的信息
下列示例說明如何將登錄參數傳遞到報表的表中該示例使用到某個安全的 SQL Server 數據庫的連接
啟動一個新項目
向窗體添加一個按鈕和四個文本框控件
將文本框控件分別命名為serverNameTxtdbNameTxtuserNameTxt 和 passwordTxt
雙擊按鈕控件以指定 Click 事件的代碼根據所用語言插入適當的代碼
[C#]
// 聲明所需變量
TableLogOnInfo logOnInfo = new TableLogOnInfo ();
int i = ;
// 對報表中的每個表依次循環
for (i=;i == ReportDatabaseTablesCount ;i++)
{
// 設置當前表的連接信息
logOnInfoConnectionInfoServerName = serverNameTxtText;
logOnInfoConnectionInfoDatabaseName = dbNameTxtText;
logOnInfoConnectionInfoUserID = userNameTxtText;
logOnInfoConnectionInfoPassword = passwordTxtText;
ReportDatabaseTables [i]ApplyLogOnInfo (logOnInfo);
}
注意 受密碼保護的 Microsoft Access 和 Paradox 等 PC 數據庫也使用該方法但 LogOnInfoServerName 和 LogOnInfoDatabaseName 要保留為空
於是我仿照這個樣子嘗試了一下出錯提示沒有發現TableLogOnInfo 和Report
後來我發現TableLogOnInfo 是屬於CrystalDecisionsShared 命名空間的成員於是我添加引用
using CrystalDecisionsShared ;
這次問題出現在Report
Report?這是個什麼東西我查遍了所有的幫助並沒有這個函數或類!
[說真的!這個問題難到了我很長的時間!一直在查找Report到底是個什麼東西!水景報表公司也真是的幫助也不寫得詳細一點!該打!!!]
最終我終於發現Report只是一個用戶定義的對象不是系統本身的對象
在我困惑的時候突然我想為什麼不看看Report後面的DataBase這是個什麼東西終於問題解決了在幫助裡找到如下信息
ReportDocument oRpt = new ReportDocument()
Report屬於DocumentCrystalDecisionsCrystalReports Engine 類的成員
修改代碼並添加引用
using CrystalDecisionsShared ;//負責解釋TableLogOnInfo類
using CrystalDecisionsCrystalReports Engine ;//負責解釋ReportDocument類private void Page_Load(object sender SystemEventArgs e)
{
TableLogOnInfo logOnInfo = new TableLogOnInfo ();
//這裡必須事先申明一個ReportDocument對象 Report同時加載數據報表
ReportDocument oRpt = new ReportDocument();
oRptLoad(c:\\inetpub\\wwwroot\\exer\\pagelet\\crystal\\crrpt);//修改為你自//己的正確位置
//建立安全信息
//受密碼保護的 Microsoft Access 和 Paradox 等 PC 數據庫也使用該方法但 LogOnInfoServerName //和 LogOnInfoDatabaseName 要保留為空
logOnInfoConnectionInfoServerName = www;
logOnInfoConnectionInfoDatabaseName = archives;
logOnInfoConnectionInfoUserID = sa;
logOnInfoConnectionInfoPassword = ;
oRptDatabase Tables []ApplyLogOnInfo (logOnInfo);
//建立rpt文件與CryStalReportviewer文件之間的連接
CrystalReportViewerReportSource = oRpt;
}
報表文件終於出現!
哇我好高興禁不住站起來伸了個懶腰!
步驟四最終的完整版的代碼
上面的代碼不具有系統可擴充和靈活性缺點有二
()數據報表格式文件是采用絕對路徑
()數據庫訪問權限的設置一旦設定在最終發布是無法修改的特別是客戶的SQL SERVER服務器不可能和你調試的程序環境是一樣的
基於這個考慮引進兩個比較好的東西
()ServerMappath函數
()讀取nfig(本示例同時告訴你如何操作nfig配置文件)
最終修改如下(完整代碼)數據庫為sql server
using CrystalDecisionsShared ;//負責解釋TableLogOnInfo類
using CrystalDecisionsCrystalReports Engine ;//負責解釋ReportDocument類
private void Page_Load(object sender SystemEventArgs e)
{
TableLogOnInfo logOnInfo = new TableLogOnInfo ();
//這裡必須事先申明一個ReportDocument對象 Report同時加載數據報表
ReportDocument oRpt = new ReportDocument();
//獲取rpt文件真實路徑
string pathpath;
path=ServerMapPath (\\exer\\pagelet);
path=path+\\crystal\\crrpt;
//oRptLoad(c:\\inetpub\\wwwroot\\exer\\pagelet\\crystal\\crrpt);
oRptLoad (path);
//從nfig中獲取logOnInfo參數信息
string abcd;
//獲取ServerName
a=SystemConfiguration ConfigurationSettings AppSettings [servername];
//獲取DatabaseName
b=SystemConfiguration ConfigurationSettings AppSettings [database];
//獲取UserId
c=SystemConfiguration ConfigurationSettings AppSettings [userid];
//獲取password
d=SystemConfiguration ConfigurationSettings AppSettings [pass];
//設置logOnInfo參數
logOnInfoConnectionInfoServerName = a;
logOnInfoConnectionInfoDatabaseName = b;
logOnInfoConnectionInfoUserID = c;
logOnInfoConnectionInfoPassword = d;
oRptDatabase Tables []ApplyLogOnInfo (logOnInfo);
//建立rpt文件與CryStalReportviewer文件之間的連接
CrystalReportViewerReportSource = oRpt;
}
整個演示的操作過程說明
在解決方案資源管理器裡你需要存放報表文件處添加新項CrystalReport報表起名為crrpt
在隨後出現的報表專家中選擇數據源時請務必選擇OLE DB然後根據你的數據庫的要求選擇響應的驅動引擎
SQL SERVERMicrosoft OLE DB Provider for SQL server
AccessMicrosoft Jet
輸入正確的數據庫連接這一步大家一般的情況下不會出錯!
建立數據報表並保存crrpt文件
打開webformaspx添加crystalreportviewer控件名稱為CrystalReportViewer
在webformaspxcs中的page_load事件中添加上面的代碼
(注意引用千萬不要忘了!)
*****************************************************
下面是nfig中與本內容有關的細節
<appSettings>
<add key=servername value=www/>
<add key=database value=archives/>
<add key=userid value=admin/>
<add key=pass value=/>
</appSettings>
***注意這裡的<add key=pass value=/>是pass所以他必須與
//獲取password
d=SystemConfiguration ConfigurationSettings AppSettings [pass];這裡
的AppSettings[pass] 中的pass保持一致 當然名字是可以隨便起但必須一致
From:http://tw.wingwit.com/Article/program/net/201311/13203.html