博主是個還在上大學的新手,如果有什么說錯的地方請務必幫我指出來,謝謝!
想要完成一個能夠動態改變其中數據的水晶報表,可以通過創建一個 數據的中轉站來存儲和輸出數據的方式。
借由這個中轉站,我們可以通過為它動態輸入數據,然后再將數據導出到水晶報表,來達到得到有動態數據的水晶報表的目的。
僅在vs2008中,很多它自帶的應用也可以達到中轉站的作用,比如數組,數據集等。
博主最近剛在學SQL所以嘗試了用VS連接數據庫來做水晶報表。
1.首先,博主在SQL中創建了名為xxs的數據庫,然后再在數據庫xxs中創建了一張名為xxs_1的表格,同時在其中建立了名為ques的列。
2.然后回到vs2008,創建windows窗體應用程序(博主是為了給數據庫錄入數據才用窗體的,網友有其他方法就隨意了。)
為程序寫入代碼:
1 SqlConnection conn2 = new SqlConnection(); 2 conn2.ConnectionString = "server=.;database=xxs;uid=sa;pwd=123"; 3 conn2.Open(); 4 SqlCommand cmd2 = new SqlCommand(); 5 cmd2.Connection = conn2; 6 cmd2.CommandType = CommandType.Text; 7 string sql2 = "insert into xxs_1(ques) values(@ques)"; 8 SqlParameter[] parameters2 = new SqlParameter[] 9 { 10 new SqlParameter("@ques", f) 11 12 }; 13 cmd2.CommandText = sql2; 14 cmd2.Parameters.AddRange(parameters2); 15 cmd2.ExecuteNonQuery(); 16 conn2.Close(); 17 cmd2.Dispose();
其中conn2.ConnectionString是SQL數據庫的路徑,字符串sql2是將要在SQL中執行的SQL語句,字符串f是要為 “列ques”添加的數據。
為了給列添加足夠多的數據,博主用了循環語句,在這里就不細說了,畢竟只是對以上語句進行循環,為f反復賦值,再寫入列而已。
3.完成了對數據的錄入以后,我們就可以建立水晶報表了。
就如上所說,博主為了給數據庫xxs錄入數據,所以用了form窗體。
在窗體中博主應用了如下兩個button組件。
其中“生成題庫”就是應用第2步中的代碼為數據庫輸入數據,而“預覽報表”就是我們現在要講的建立水晶報表了。
在寫代碼之前,博主先做了一些准備工作。
(1)連接數據庫。
點擊菜單欄的數據按鈕/在打開的菜單中點擊添加新的數據源/在彈出的數據源配置向導中選擇從“數據庫”獲取數據源,點擊下一步/點擊新建連接/在彈出的添加連接窗口中寫入服務器名(一般都是.(對,就是個“點”)),選擇用SQL SEVER 身份驗證,輸入用戶名和密碼,然后就可以在“選擇或輸入一個數據庫名”中寫入數據庫名了,然后點擊確定,點擊下一步/進入"選擇數據庫對象",選擇你需要在水晶報表中顯示的表和列,點擊完成。
(2)創建水晶報表。
右鍵解決方案資源管理器下的第一個項目/在彈出的菜單欄中選擇添加,點擊新建項。/在彈出的添加新項中選擇Reporting中的Crysal報表(如下)。/
/然后會彈出Crystal report庫窗體,選擇使用“報表向導“和”標准“,選擇確定。/在標准報表創建向導中打開項目數據,打開ADO.NET數據集選擇需要的數據庫中的表,將它添加到右側。點擊下一步/選擇需要的列,將它添加到右側,點擊下一步。/分組和記錄選定我沒用到,所以直接點擊了下一步,樣式我選擇了表,點擊完成。
至此,我們已經完成了對水晶報表的創建。
4,為水晶報表添加數據。
為了使”預覽報表“功能可以完善一些,博主又在項目中添加了一個窗體應用程序Form2(如下)。
Form2中只添加一個CrystalReportViewer控件。
然后雙擊Form2窗體,寫入代碼:
1 CrystalReport1 cry = new CrystalReport1(); 2 SqlConnection conn = new SqlConnection(); 3 conn.ConnectionString = "server=.;database=xxs;uid=sa;pwd=123"; 4 conn.Open(); 5 SqlCommand cmd = new SqlCommand(); 6 cmd.Connection = conn; 7 cmd.CommandType = CommandType.Text; 8 string sql = "select ques from xxs_1 "; 9 cmd.CommandText = sql; 10 DataSet ds = new DataSet();//新建一個臨時數據庫 11 SqlDataAdapter adt = new SqlDataAdapter(); 12 adt.SelectCommand = cmd; 13 adt.Fill(ds, "inf");//將數據導入到ds中 14 DataTable dt = ds.Tables["inf"];//只是為了后面引用時方便點,直接寫ds.Tables["inf"]也是可以的。
用以上代碼取出數據庫 xxs 中表 xxs_1 中的列 ques 中的數據。
最后再寫入代碼:
1 cry.SetDataSource(dt);
2 this.crystalReportViewer1.ReportSource = cry;
就可以將數據寫入到水晶報表中去了。
5.當然,為了能夠反復輸入數據到SQL,再導出數據到水晶報表,我們需要在建立水晶報表后清空SQL數據庫中數據,所以在結束了以上的一切后還要在最后寫入代碼:
1 SqlConnection conn1 = new SqlConnection(); 2 conn1.ConnectionString = "server=.;database=xxs;uid=sa;pwd=123"; 3 conn1.Open(); 4 SqlCommand cmd1 = new SqlCommand(); 5 cmd1.Connection = conn1; 6 cmd1.CommandType = CommandType.Text; 7 string sql1 = "truncate table xxs_1"; 8 cmd1.CommandText = sql1; 9 cmd1.ExecuteNonQuery(); 10 conn1.Close();
這樣就完成了一張用SQL數據庫作為數據中轉站的動態數據水晶報表。
下面是效果演示:
當我運行程序按下“生成題庫”是,程序會往數據庫中添加數據,比如我要生成40道運算題,就可以得到這樣的表
再當我按下”預覽報表“時,便得到了這樣的水晶報表: