版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第9章圖書(shū)維護(hù)
9.1圖書(shū)維護(hù)窗體介紹9.2DataSet對(duì)象9.3DataAdapter對(duì)象9.4DataTable對(duì)象9.5圖書(shū)維護(hù)窗體的實(shí)現(xiàn)9.6水晶報(bào)表9.7知識(shí)拓展9.8習(xí)題圖書(shū)維護(hù)窗體實(shí)現(xiàn)了對(duì)圖書(shū)信息的增加、刪除和修改,窗體如圖9-1所示,單擊“增加”按鈕,彈出如圖9-2所示的增加圖書(shū)窗體。9.1圖書(shū)維護(hù)窗體介紹圖9-1圖書(shū)維護(hù)窗體圖9-2增加圖書(shū)窗體
DataSet可以視為一個(gè)內(nèi)存數(shù)據(jù)庫(kù),由許多數(shù)據(jù)表、數(shù)據(jù)表聯(lián)系(Relation)、約束(Constraint)、記錄(Row)以及字段(Column)對(duì)象的集合所組成。
DataSet的結(jié)構(gòu)與數(shù)據(jù)庫(kù)相似,由一個(gè)或多個(gè)DataTable組成,DataTable相當(dāng)于數(shù)據(jù)庫(kù)中的表。其中列DataColumn與行DataRow分別對(duì)應(yīng)于數(shù)據(jù)庫(kù)的字段與數(shù)據(jù)行。DataSet中的數(shù)據(jù)存放在DataTable中。DataSet、DataTable的結(jié)構(gòu)如圖9-3所示。9.2DataSet對(duì)象圖9-3DataSet、DataTable的結(jié)構(gòu)
DataSet對(duì)象一個(gè)重要的特性是離線操作,即從數(shù)據(jù)庫(kù)中取回?cái)?shù)據(jù),存到DataSet對(duì)象中后,程序可以馬上斷開(kāi)與數(shù)據(jù)庫(kù)的連接,用戶(hù)可以對(duì)內(nèi)存中DataSet中的數(shù)據(jù)進(jìn)行增加、刪除等修改,而當(dāng)需要把改動(dòng)反映到數(shù)據(jù)庫(kù)時(shí),只要重新與數(shù)據(jù)庫(kù)建立連接,并利用相應(yīng)的命令實(shí)現(xiàn)更新即可。這意味著程序和數(shù)據(jù)庫(kù)的連接時(shí)間可以盡可能縮短,減少對(duì)數(shù)據(jù)庫(kù)服務(wù)器資源的占用。由于DataSet對(duì)象本身不具備和數(shù)據(jù)源溝通的能力,因此要修改、更新數(shù)據(jù)并返回?cái)?shù)據(jù)源時(shí),需要DataAdapter對(duì)象。
DataAdapter提供的是對(duì)于數(shù)據(jù)集的填充和對(duì)更新的回傳任務(wù),對(duì)于DataSet來(lái)說(shuō),DataAdapter有點(diǎn)像一個(gè)搬運(yùn)工,把數(shù)據(jù)從數(shù)據(jù)庫(kù)“搬運(yùn)”到DataSet中,DataSet中的數(shù)據(jù)有了改動(dòng)的時(shí)候,又可以把這些改動(dòng)“反映”給數(shù)據(jù)庫(kù)。而DataAdapter做這件事情,靠的是它所包含的4個(gè)Command對(duì)象:9.3DataAdapter對(duì)象●?SelectCommand 用于在數(shù)據(jù)源中選擇記錄的SQL命令。
●?InsertCommand 用來(lái)在數(shù)據(jù)源中插入新記錄的SQL命令。
●?UpdateCommand用于更新數(shù)據(jù)源中記錄的SQL命令。
●?DeleteCommand 用來(lái)從數(shù)據(jù)集刪除記錄的SQL命令。
創(chuàng)建DataAdapter一般用以下方式:
SqlDataAdapterda=newSqlDataAdapter(selectSQL,Connection);其中,selectSQL為返回?cái)?shù)據(jù)集的Select語(yǔ)句,Connection用于指定所用的連接。這種方式等價(jià)于另一種常用的DataAdapter創(chuàng)建方式:
SqlDataAdapterda=newSqlDataAdapter(); //創(chuàng)建DataAdapter
SqlCommandcmd=newSqlCommand(selectSQL,conn);//創(chuàng)建Command
da.SelectCommand=cmd; //給DataAdapter的SelectCommand賦值利用DataAdapter對(duì)象的Fill方法把數(shù)據(jù)填充到DataSet。DataAdapter使用的Connection對(duì)象并不需先用Open方法打開(kāi)。調(diào)用DataAdapter的Fill方法時(shí),如果Connection沒(méi)有打開(kāi),DataAdapter會(huì)自動(dòng)調(diào)用Connection的Open方法;DataAdapter對(duì)數(shù)據(jù)源的操作完畢后,會(huì)自動(dòng)將Connection關(guān)閉。如果在執(zhí)行Fill方法時(shí)Connection已打開(kāi),在執(zhí)行完畢后DataAdapter會(huì)維持Connection打開(kāi)狀態(tài)。
DataTable是構(gòu)成DataSet最主要的對(duì)象,DataTable對(duì)象是由DataColumns集合以及DataRows集合所組成的,DataSet的數(shù)據(jù)就存放在DataTable對(duì)象中。DataTable對(duì)象的常用屬性見(jiàn)表9-1。9.4DataTable對(duì)象表9-1DataTable對(duì)象的常用屬性
DataTable對(duì)象的常用方法:
●?AcceptChanges 確定DataTable所作的改變。
●?Clear 清除DataTable內(nèi)所有的數(shù)據(jù)。
●?NewRow 增加一筆新的記錄。
DataColumn對(duì)象就是字段對(duì)象,是組成數(shù)據(jù)表DataTable的基本單位。DataColumn的屬性見(jiàn)表9-2。表9-2DataColumn的屬性
【例9-1】下面的例子把圖書(shū)表中的數(shù)據(jù)取到DataSet中,然后把DataSet中的內(nèi)容顯示出來(lái),運(yùn)行結(jié)果如圖9-4所示。
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Text;
usingSystem.Data;
usingSystem.Data.SqlClient;//引入數(shù)據(jù)庫(kù)相關(guān)名稱(chēng)空間
classProgram
{
staticvoidMain(string[]args)
{
SqlConnectionconn=newSqlConnection("server=PC-20101005APPX;database=BookDB;integratedsecurity=true");
SqlDataAdapterda=newSqlDataAdapter("select*from圖書(shū)表",conn);
DataSetds=newDataSet();
da.Fill(ds);//填充數(shù)據(jù)到ds
for(inti=0;i<ds.Tables[0].Rows.Count;i++)
{
Console.WriteLine(ds.Tables[0].Rows[i]["圖書(shū)編號(hào)"].ToString()+"\t"+ds.Tables[0].Rows[i]["書(shū)名"].ToString());
}
}
}圖9-4例9-1運(yùn)行結(jié)果【例9-2】動(dòng)態(tài)生成內(nèi)存表DataTable,運(yùn)行結(jié)果如圖9-5所示。圖9-5例9-2運(yùn)行結(jié)果
新建一個(gè)Windows項(xiàng)目,從工具欄向窗體拖入一個(gè)DataGridView控件;雙擊窗體,切換到代碼窗口,為Form1的Load事件編寫(xiě)如下代碼:
privatevoidForm1_Load(objectsender,EventArgse)
{
//創(chuàng)建內(nèi)存表DataTable
DataTabletable=newDataTable("book");
table.Columns.Add("BookID"); //增加Index列
table.Columns.Add("BookName"); //增加BookName列
DataRowrow=table.NewRow(); //產(chǎn)生一個(gè)行DataRow,該行的結(jié)構(gòu)與DataTable的行結(jié)構(gòu)相同
row["BookID"]="C0008";
row["BookName"]="ASP.NET程序設(shè)計(jì)";
table.Rows.Add(row);
row=table.NewRow();
row["BookID"]="C0009";
row["BookName"]="數(shù)據(jù)庫(kù)原理";
table.Rows.Add(row); //把DataRow加入到DataTable
dataGridView1.DataSource=table;
}【例9-3】利用DataSet和DataAdapter實(shí)現(xiàn)數(shù)據(jù)的增、刪、改。
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Text;
usingSystem.Data;
usingSystem.Data.SqlClient;
classProgram
{
staticvoidMain(string[]args)
{
stringconnStr="server=PC-20101005APPX;database=bookdb;integratedsecurity=true";
SqlConnectionconn=newSqlConnection(connStr);
SqlDataAdapterda=newSqlDataAdapter("select*from圖書(shū)表",conn);
DataSetds=newDataSet();da.Fill(ds);
//插入新的一行
DataRowdr1=ds.Tables[0].NewRow();
dr1["圖書(shū)編號(hào)"]="88";
dr1["書(shū)名"]="ASP.NET項(xiàng)目開(kāi)發(fā)教程";
dr1["作者"]="李四";
ds.Tables[0].Rows.Add(dr1);
//更新第二行
DataRowdr2=ds.Tables[0].Rows[1];
dr2["書(shū)名"]="C#經(jīng)典";
//刪除第五行
ds.Tables[0].Rows[2].Delete();
SqlCommandBuildercb=newSqlCommandBuilder(da);
da.Update(ds.Tables[0]);
}
}程序說(shuō)明:
在上面的程序中,我們調(diào)用DataAdapter的Update方法實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)的更新:
da.Update(ds,“Books”);
在處理數(shù)據(jù)的時(shí)候,DataRow對(duì)象會(huì)自動(dòng)記錄目前記錄的狀況,只要記錄一有改變便做標(biāo)記。等調(diào)用DataAdapter對(duì)象的Update方法時(shí),DataAdapter會(huì)根據(jù)DataSet中數(shù)據(jù)的增、刪、改等情況,使用適當(dāng)?shù)腟QL命令將修改更新至數(shù)據(jù)源。Update這個(gè)方法會(huì)檢查每一個(gè)DataRow的狀態(tài),若DataRow是新增加的,該方法就執(zhí)行Insert的SQL命令;若DataRow被修改過(guò),該方法就執(zhí)行Update的SQL命令;若DataRow被刪除,則執(zhí)行Delete的SQL命令。那么,實(shí)現(xiàn)更新的Insert、Update、Delete這些SQL從哪來(lái)呢?DataAdapter中有四個(gè)Command對(duì)象屬性,分別是SelectCommand、InsertCommand、UpdateCommand以及DeleteCommand屬性。我們可以預(yù)先準(zhǔn)備好這幾個(gè)Command,需要時(shí)DataAdapter會(huì)自動(dòng)調(diào)用。但我們并未對(duì)DataAdapter的幾個(gè)Command賦值,因?yàn)橐a(chǎn)生這些Command比較麻煩,系統(tǒng)提供了一個(gè)簡(jiǎn)化的方法,即利用CommandBuilder對(duì)象自動(dòng)構(gòu)建。本例中對(duì)應(yīng)的實(shí)現(xiàn)語(yǔ)句為:
SqlCommandBuildercb=newSqlCommandBuilder(da);
DataSet中的數(shù)據(jù)必須至少存在一個(gè)主鍵列或唯一列,否則,調(diào)用Update()時(shí)將產(chǎn)生異常,不會(huì)生成自動(dòng)更新數(shù)據(jù)庫(kù)的INSERT、UPDATE或DELETE命令。下面介紹實(shí)現(xiàn)圖書(shū)維護(hù)窗體,效果如圖9-6所示。
圖書(shū)維護(hù)V1.0的實(shí)現(xiàn)步驟如下:
(1)新建一個(gè)Windows應(yīng)用程序BookEdit。
(2)添加一個(gè)名為FrmBook的窗體。
(3)如圖所示設(shè)計(jì)FrmBook的窗體界面。9.5圖書(shū)維護(hù)窗體的實(shí)現(xiàn)圖9-6圖書(shū)維護(hù)窗體設(shè)計(jì)界面(4)編寫(xiě)FrmBook窗體的代碼。
usingSystem;
usingSystem.Collections.Generic;
usingSystem.ComponentModel;
usingSystem.Data;
usingSystem.Data.SqlClient;
usingSystem.Drawing;
usingSystem.Text;
usingSystem.Windows.Forms;
namespaceBook
{
publicpartialclassFrmBook:Form
{publicstaticSqlConnectionconn=newSqlConnection("server=PC-20101005APPX;database=bookdb;integratedsecurity=true");
publicFrmBook()
{
InitializeComponent();
}
//加載數(shù)據(jù)
privatevoidFrmBook_Load(objectsender,EventArgse)
{
dataGridView1.AutoGenerateColumns=true;
panel3.BringToFront();
bind();
}//綁定數(shù)據(jù)
voidbind()
{
DataSetds=newDataSet();
SqlCommandcmd=newSqlCommand("select*from圖書(shū)表",conn);
SqlDataAdapterda=newSqlDataAdapter(cmd);
da.Fill(ds);
dataGridView1.DataSource=ds.Tables[0];
}
//單擊“增加”按鈕
privatevoidtsbAdd_Click(objectsender,EventArgse)
{
FrmAddfrm=newFrmAdd();frm.bookNO=dataGridView1.CurrentRow.Cells["圖書(shū)編號(hào)"].Value.ToString();
frm.Text="增加圖書(shū)";
frm.ShowDialog();
bind();
}
//單擊“刪除”按鈕
privatevoidtsbDelete_Click(objectsender,EventArgse)
{
try
{
if(MessageBox.Show("確定要?jiǎng)h除該圖書(shū)嗎?","提示",MessageBoxButtons.OKCancel,MessageBoxIcon.Question)==DialogResult.OK){
ExecuteCommand("delete圖書(shū)表where圖書(shū)編號(hào)="+dataGridView1.CurrentRow.Cells["圖書(shū)編號(hào)"].Value.ToString());
bind();
MessageBox.Show("刪除數(shù)據(jù)成功!","提示",MessageBoxButtons.OK,MessageBoxIcon.Information);
}
}
catch(Exceptionex)
{
MessageBox.Show(ex.Message,"提示",MessageBoxButtons.OKCancel,MessageBoxIcon.Information);
}
}//單擊“編輯”按鈕
privatevoidtsbEdit_Click(objectsender,EventArgse)
{
FrmAddfrm=newFrmAdd();
frm.Text="修改圖書(shū)";
frm.fill(dataGridView1.CurrentRow.Cells["圖書(shū)編號(hào)"].Value.ToString());
frm.ShowDialog();
bind();
}
//單擊“關(guān)閉”按鈕
privatevoidtsbClose_Click(objectsender,EventArgse)
{
Close();
}
//執(zhí)行并返回影響行數(shù)
publicstaticintExecuteCommand(stringsql,paramsSqlParameter[]values)
{
SqlCommandcmd=newSqlCommand(sql,conn);
cmd.Parameters.AddRange(values);
conn.Open();
intresult=cmd.ExecuteNonQuery();
conn.Close();
returnresult;
}
//雙擊單元格
privatevoiddataGridView1_CellDoubleClick(objectsender,DataGridViewCellEventArgse)
{
tsbEdit_Click(null,null);
}
}
}(5)添加一個(gè)名為FrmAdd的窗體,界面如圖9-7所示。圖9-7增加/修改圖書(shū)窗體設(shè)計(jì)代碼如下:
usingSystem;
usingSystem.Collections.Generic;
usingSystem.ComponentModel;
usingSystem.Data;
usingSystem.Drawing;
usingSystem.Text;
usingSystem.Windows.Forms;
usingSystem.Data.SqlClient;
namespaceBook
{
publicpartialclassFrmAdd:Form
{
publicstringbookNO;publicFrmAdd()
{
InitializeComponent();
}
publicvoidfill(stringbookNO)
{
SqlConnectionconn=newSqlConnection("server=PC-20101005APPX;database=bookdb;integratedsecurity=true");
DataSetds=newDataSet();
SqlCommandcmd=newSqlCommand("select*from圖書(shū)表where圖書(shū)編號(hào)='"+bookNO+"'",conn);
SqlDataAdapterda=newSqlDataAdapter(cmd);
da.Fill(ds);
txtISBN.Text=ds.Tables[0].Rows[0][1].ToString();txtBookName.Text=ds.Tables[0].Rows[0][2].ToString();
txtAuthor.Text=ds.Tables[0].Rows[0][3].ToString();
txtPrice.Text=ds.Tables[0].Rows[0][4].ToString();
txtPublisher.Text=ds.Tables[0].Rows[0][5].ToString();
datePublisher.Value=Convert.ToDateTime(ds.Tables[0].Rows[0][6]);
txtQty.Text=ds.Tables[0].Rows[0][7].ToString();
this.bookNO=bookNO;
}
privatevoidbutton1_Click(objectsender,EventArgse)
{
stringsql;
if(this.Text=="增加圖書(shū)")
{
sql="INSERTINTO圖書(shū)表(ISBN,書(shū)名,作者,價(jià)格,出版社,出版日期,庫(kù)存數(shù))VALUES(@isbn,@bookName,@author,@price,@publisher,@pubDate,@qty)";
SqlParameter[]param=newSqlParameter[]{
newSqlParameter("isbn",txtISBN.Text),
newSqlParameter("bookName",txtBookName.Text),
newSqlParameter("author",txtAuthor.Text),
newSqlParameter("price",txtPrice.Text),
newSqlParameter("publisher",txtPublisher.Text),
newSqlParameter("pubDate",datePublisher.Value),
newSqlParameter("qty",txtQty.Text)
};
FrmBook.ExecuteCommand(sql,param);
MessageBox.Show("成功增加一條記錄");
}
elseif(this.Text=="修改圖書(shū)")
{
sql="UPDATE圖書(shū)表SETISBN=@isbn,書(shū)名=@bookName,作者=@author,價(jià)格=@price,出版社=@publisher,出版日期=@pubDate,庫(kù)存數(shù)=@qtyWHERE圖書(shū)編號(hào)=@bookNO";
SqlParameter[]param=newSqlParameter[]{
newSqlParameter("isbn",txtISBN.Text),
newSqlParameter("bookName",txtBookName.Text),
newSqlParameter("author",txtAuthor.Text),
newSqlParameter("price",txtPrice.Text),
newSqlParameter("publisher",txtPublisher.Text),
newSqlParameter("pubDate",datePublisher.Value),
newSqlParameter("qty",txtQty.Text),
newSqlParameter("bookNO",bookNO)
};
FrmBook.ExecuteCommand(sql,param);
MessageBox.Show("記錄修改成功!");
}
}
}
}9.6.1拉模式與推模式
1.拉模式
在拉模式中,驅(qū)動(dòng)程序?qū)⑦B接到數(shù)據(jù)庫(kù)并根據(jù)需要將數(shù)據(jù)“拉”進(jìn)來(lái)。使用這種模式時(shí),與數(shù)據(jù)庫(kù)的連接和為了獲取數(shù)據(jù)而執(zhí)行的SQL命令同時(shí)由CrystalReports本身處理,不需要開(kāi)發(fā)人員編寫(xiě)代碼。
如果在運(yùn)行時(shí)無(wú)須編寫(xiě)任何特殊代碼,則使用拉模式。9.6水晶報(bào)表
2.推模式
推模式需要開(kāi)發(fā)人員編寫(xiě)代碼以連接到數(shù)據(jù)庫(kù),執(zhí)行SQL命令以創(chuàng)建與報(bào)表中的字段匹配的記錄集或數(shù)據(jù)集,并且將該對(duì)象傳遞給報(bào)表。該方法可以將連接共享置入應(yīng)用程序中,并在CrystalReports收到數(shù)據(jù)之前先將數(shù)據(jù)篩選出來(lái)。
相比拉模式,推模式有更大的靈活性,下面僅介紹推模式的報(bào)表開(kāi)發(fā)方式。9.6.2報(bào)表設(shè)計(jì)
報(bào)表設(shè)計(jì)界面如圖9-8所示,報(bào)表分為若干個(gè)報(bào)表節(jié),如“報(bào)表頁(yè)眉”、“頁(yè)腳和詳細(xì)資料”,可將對(duì)象拖動(dòng)到某個(gè)報(bào)表節(jié)上。圖9-8報(bào)表設(shè)計(jì)界面●“報(bào)表頁(yè)眉”:放在“報(bào)表頁(yè)眉”節(jié)中的對(duì)象只在報(bào)表開(kāi)頭輸出顯示一次。“報(bào)表頁(yè)眉”節(jié)通常包含報(bào)表的標(biāo)題和其他希望只在報(bào)表開(kāi)始位置出現(xiàn)的信息。放在該節(jié)中的公式只在報(bào)表開(kāi)始處進(jìn)行一次求值。
●“頁(yè)眉”:放在“頁(yè)眉”節(jié)中的對(duì)象輸出顯示在每個(gè)新頁(yè)的開(kāi)始位置。“頁(yè)眉”節(jié)通常包含希望在每頁(yè)頂部出現(xiàn)的信息,它可以包括文本字段(如章節(jié)名、文檔名或其他類(lèi)似信息),該節(jié)也可以用來(lái)包含字段標(biāo)題,在報(bào)表中這些字段標(biāo)題將作為標(biāo)簽顯示在字段數(shù)據(jù)列的頂部。圖表或交叉表不能放置在該節(jié)中。放在該節(jié)中的公式在每個(gè)新頁(yè)的開(kāi)始進(jìn)行一次求值。●“詳細(xì)資料”:放在“詳細(xì)資料”部分中的對(duì)象隨每條新記錄輸出顯示?!霸敿?xì)資料”部分包含報(bào)表正文數(shù)據(jù)。當(dāng)報(bào)表運(yùn)行時(shí),“詳細(xì)資料”部分隨每條記錄重復(fù)輸出顯示。例如,如果向“詳細(xì)資料”部分中添加了一個(gè)數(shù)據(jù)庫(kù)對(duì)象,而這個(gè)數(shù)據(jù)庫(kù)對(duì)象包含100條記錄,那么報(bào)表在運(yùn)行時(shí)將輸出顯示100個(gè)單獨(dú)的“詳細(xì)資料”部分。圖表或交叉表不能放置在該節(jié)中。放在該節(jié)中的公式對(duì)每條記錄進(jìn)行一次求值。
●“報(bào)表頁(yè)腳”:放在“報(bào)表頁(yè)腳”節(jié)中的對(duì)象只在報(bào)表的結(jié)束位置輸出顯示一次。該節(jié)可用來(lái)包含希望只在報(bào)表的末尾出現(xiàn)一次的信息(如總計(jì)),放在該節(jié)中的圖表和交叉表包含整個(gè)報(bào)表的數(shù)據(jù),放在該節(jié)中的公式只在報(bào)表的結(jié)束位置進(jìn)行一次求值?!瘛绊?yè)腳”:放在“頁(yè)腳”節(jié)中的對(duì)象輸出顯示在每頁(yè)的底部。該節(jié)通常包含頁(yè)碼和任何其他希望出現(xiàn)在每頁(yè)底部的信息。圖表和交叉表不能放置在該節(jié)中。放在該節(jié)中的公式在每個(gè)新頁(yè)面的結(jié)束位置進(jìn)行一次求值。
●其他報(bào)表節(jié):如果將組、摘要或小計(jì)添加到報(bào)表中,則會(huì)創(chuàng)建另外兩個(gè)節(jié):“組頁(yè)眉”和“組頁(yè)腳”。當(dāng)添加了組、摘要或小計(jì)時(shí),“組頁(yè)眉”節(jié)出現(xiàn)在“詳細(xì)資料”部分的正上方,而“組頁(yè)腳”節(jié)出現(xiàn)在“詳細(xì)資料”部分的正下方。跟原始報(bào)表節(jié)一樣,每個(gè)新添加的節(jié)也可以包含一個(gè)或多個(gè)子節(jié)?!瘛敖M頁(yè)眉”:放在“組頁(yè)眉”節(jié)中的對(duì)象輸出顯示在每個(gè)新組的開(kāi)始位置。該節(jié)通常保存組名字段,也可以用來(lái)顯示包括組特定數(shù)據(jù)的圖表或交叉表?!敖M頁(yè)眉”節(jié)在每組的開(kāi)始位置輸出顯示一次。放在該節(jié)中的圖表和交叉表僅包含本組數(shù)據(jù)。放在該節(jié)中的公式在每組的開(kāi)始對(duì)本組進(jìn)行一次求值。
●“組頁(yè)腳”:放在“組頁(yè)腳”節(jié)中的對(duì)象輸出顯示在每組的結(jié)束位置。該節(jié)通常保存匯總數(shù)據(jù)(如果有),也可以用來(lái)顯示圖表或交叉表。“組頁(yè)腳”節(jié)在每組的結(jié)束位置輸出顯示一次。放在該節(jié)中的圖表和交叉表僅包含本組數(shù)據(jù)。放在該節(jié)中的公式在每組的結(jié)束位置對(duì)本組進(jìn)行一次求值。9.6.3制作圖書(shū)信息的報(bào)表
下面介紹制作圖書(shū)信息的報(bào)表,報(bào)表效果如圖9-9所示。圖9-9報(bào)表效果圖書(shū)維護(hù)V2.0的實(shí)現(xiàn)步驟如下:
(1)用VS2005打開(kāi)圖書(shū)維護(hù)項(xiàng)目。
(2)建立數(shù)據(jù)集。
①單擊菜單“項(xiàng)目”→“添加新項(xiàng)”,彈出“添加新項(xiàng)”窗口,在“模板”列表中選中數(shù)據(jù)集,如圖9-10所示。單擊“添加”按鈕,出現(xiàn)如圖9-11所示DataSet1.xsd設(shè)計(jì)界面。圖9-10“添加新項(xiàng)”窗口圖9-11DataSet1.xsd設(shè)計(jì)界面②從“工具箱”的“數(shù)據(jù)集”欄拖動(dòng)一個(gè)TableAdapter到DataSet1.xsd設(shè)計(jì)頁(yè)面,彈出如圖9-12所示的窗口,新建一個(gè)連接或選擇好數(shù)據(jù)庫(kù)連接,單擊“下一步”按鈕。圖9-12新建連接③彈出如圖9-13所示窗口,選中“使用SQL語(yǔ)句”,單擊“下一步”按鈕。圖9-13選擇“使用SQL語(yǔ)句”④彈出如圖9-14所示的“TableAdapter”窗口,輸入“select*from圖書(shū)表”。圖9-14輸入SQL語(yǔ)句⑤單擊“完成”按鈕,DataSet1.xsd中多了一個(gè)DataTabe,如圖9-15所示。圖9-15完成的DataSet1.xsd界面
(3)創(chuàng)建報(bào)表。
①單擊菜單“項(xiàng)目”→“添加新項(xiàng)”,彈出“添加新項(xiàng)”窗口,在“模板”列表中選中“Crystal報(bào)表”,如圖9-16所示;單擊“添加”按鈕,彈出如圖9-17所示的“CrystalReports庫(kù)”窗口;單擊“確定”按鈕,彈出“標(biāo)準(zhǔn)報(bào)表創(chuàng)建向?qū)А保鐖D9-18所示。圖9-16“添加新項(xiàng)”窗口圖9-17選擇使用“報(bào)表向?qū)А眻D9-18“標(biāo)準(zhǔn)報(bào)表創(chuàng)建向?qū)А贝翱冖谡归_(kāi)ADO.NET節(jié)點(diǎn),選中“圖書(shū)表項(xiàng)”,單擊按鈕,把“圖書(shū)表”選擇到右邊“選定的表”列表中。單擊“下一步”按鈕,彈出如圖9-19所示的窗口;單擊按鈕,把所有字段添加到右邊“要顯示的字段”列表中;單擊“完成”按鈕,系統(tǒng)界面進(jìn)入如圖9-20所示的報(bào)表設(shè)計(jì)界面。圖9-19選擇要顯示的字段圖9-20初始報(bào)表設(shè)計(jì)界面③取消“頁(yè)眉”部分的其他列標(biāo)題的下劃線。
選中“頁(yè)眉”部分的所有標(biāo)題字段,在“屬性”窗口展開(kāi)Font節(jié)點(diǎn),設(shè)置Undeline屬性為False。
④繪制表格。
在報(bào)表設(shè)計(jì)界面上右擊鼠標(biāo),在彈出菜單中選擇“插入”→“框”。鼠標(biāo)圖標(biāo)變?yōu)楫?huà)筆的形狀,拖到鼠標(biāo),畫(huà)出一個(gè)矩形方框。效果如圖9-21所示。圖9-21繪制表格調(diào)整好報(bào)表各元素的大小與位置,如圖9-22所示。圖9-22調(diào)整好報(bào)表各元素
在報(bào)表設(shè)計(jì)界面上右擊鼠標(biāo),在彈出菜單中選擇“插入”→“框”。鼠標(biāo)圖標(biāo)變?yōu)楫?huà)筆的形狀,在“詳細(xì)資料”欄下方劃一條橫線。如圖9-23所示。圖9-23在“詳細(xì)資料”欄下方劃一條橫線
在報(bào)表設(shè)計(jì)界面上右擊鼠標(biāo),在彈出菜單中選擇“插入”→“框”。鼠標(biāo)圖標(biāo)變?yōu)楫?huà)筆的形狀,在圖書(shū)編號(hào)與ISBN字段間畫(huà)豎線,然后對(duì)豎線進(jìn)行復(fù)制、粘貼操作,在其他各字段間插入豎線。如圖9-24所示。圖9-24字段間畫(huà)豎線
(4)制作報(bào)表窗體。
①向項(xiàng)目添加一個(gè)窗體,命名為FrmReport。
②從工具箱的CrystalReports欄向FrmReport窗體拖動(dòng)一個(gè)CrystalReportViewer控件。設(shè)置其DisplayGroupTree屬性為False。
③為FrmReport窗體的Load事件編寫(xiě)如下代碼:usingSystem.Data.SqlClient;
usingCrystalDecisions.CrystalReports.Engine;
…
privatevoidForm1_Load(objectsender,EventArgse)
{SqlConnectionconn=newSqlConnection(“server=PC-20101005APPX;
database=bookdb;integratedsecurity=true");
DataSetds=newDataSet();
stringsql="select*FROM圖書(shū)表";
SqlCommandcmd=newSqlCommand(sql,conn);
SqlDataAdapterda=newSqlDataAdapter(cmd);
da.Fill(ds);
ReportDocumentreportDocument=newReportDocument();
reportDocument.Load(Application.StartupPath+“\\CrystalReport1.rpt”);
reportDocument.SetDataSource(ds.Tables[0]);
crystalReportViewer1.ReportSource=reportDocument;
}
(5)把CrystalReport1.rpt文件拷到項(xiàng)目的bin/debug目錄下,運(yùn)行項(xiàng)目。9.7.1DataView對(duì)象
ADO.NET提供了一個(gè)可以自定義數(shù)據(jù)外觀的DataView對(duì)象,是一種用來(lái)幫助設(shè)置DataTable中的數(shù)據(jù)如何顯示的對(duì)象,其本身并不包含DataTable中的數(shù)據(jù)。通過(guò)DataView對(duì)象可以過(guò)濾、排序和查找對(duì)應(yīng)DataTable中的數(shù)據(jù)。對(duì)DataView對(duì)象所執(zhí)行的任何操作都會(huì)影響原來(lái)的DataTable中的數(shù)據(jù)。9.7知識(shí)拓展
DataTable提供了一個(gè)DefaultView屬性,DefaultView屬性本身就是DataView對(duì)象,可以通過(guò)設(shè)置DefaultView的屬性來(lái)指定DataTable的顯示格式。如果DefaultView這個(gè)DataView對(duì)象無(wú)法滿(mǎn)足需求,還可以建立多個(gè)DataView對(duì)象來(lái)制定數(shù)據(jù)的顯示格式。其聲明語(yǔ)法如下所示:
DataViewdataView=newDataView(數(shù)據(jù)表)
DataView對(duì)象的常用屬性及方法見(jiàn)表9-3。表9-3DataView對(duì)象的常用屬性及方法排序數(shù)據(jù)時(shí)可以使用DataView對(duì)象的Sort屬性。Sort屬性以字段作為排序的依據(jù),其基本語(yǔ)法如下:
DataView.Sort="字段ASC|DESC"
篩選記錄可以使用DataView對(duì)象的RowFilter屬性以及RowStateFilter屬性。RowFilter屬性可以利用比較運(yùn)算符?<、>、<=、>=?以及Like來(lái)過(guò)濾記錄中的數(shù)據(jù),其語(yǔ)法如下所示:
DataView.RowFilter="過(guò)濾條件"
例如,查詢(xún)Country列等于USA的數(shù)據(jù),可寫(xiě)成:
DataView.RowFilter="Country='USA'"9.7.2數(shù)據(jù)庫(kù)公用類(lèi)
從軟件工程的角度,代碼要盡可能的實(shí)現(xiàn)重用,或者說(shuō),同樣的代碼要避免寫(xiě)兩次。在前面的編程中,可以感覺(jué)到數(shù)據(jù)庫(kù)操作的代碼有許多重復(fù)的地方。因此,可以把對(duì)數(shù)據(jù)庫(kù)操作的共同部分提煉出來(lái),封裝到一個(gè)類(lèi)中。以后可以調(diào)用類(lèi)中的方法,輕松地實(shí)現(xiàn)數(shù)據(jù)庫(kù)的操作,并把編程的精力集中在實(shí)現(xiàn)應(yīng)用的邏輯上。該類(lèi)DbHelper.cs的內(nèi)容如下:
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Text;
usingSystem.Data;
usingSystem.Data.SqlClient;
classDBHelp
{
privateSqlConnectionconn;
publicDBHelp()
{
conn=newSqlConnection(“server=PC-20101005APPX;database=
bookdb;integratedsecurity=true");
}//執(zhí)行并返回影響行數(shù)
publicintExecuteCommand(stringsql)
{
SqlCommandcmd=newSqlCommand(sql,conn);
OpenConn();
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 冬季施工暖棚搭設(shè)方案
- 人教版九年級(jí)化學(xué)上冊(cè)自制第六單元課題4實(shí)驗(yàn)活動(dòng)2-二氧化碳實(shí)驗(yàn)室制取與性質(zhì)(34張)
- 2019-2020學(xué)年高中數(shù)學(xué)第2章解析幾何初步2-3空間直角坐標(biāo)系課件北師大版必修2
- 接待禮儀-素材-培訓(xùn)講學(xué)
- 教育學(xué)原理04-近現(xiàn)代高等教育發(fā)展、教師
- 2024年泰州職業(yè)技術(shù)學(xué)院高職單招數(shù)學(xué)歷年參考題庫(kù)含答案解析
- 2024年陽(yáng)江市衛(wèi)校附屬醫(yī)院高層次衛(wèi)技人才招聘筆試歷年參考題庫(kù)頻考點(diǎn)附帶答案
- 二零二五年離婚房產(chǎn)分割與贍養(yǎng)義務(wù)協(xié)議3篇
- 二零二五版“汽車(chē)零部件銷(xiāo)售協(xié)議”英文翻譯
- 2024年江西醫(yī)學(xué)高等專(zhuān)科學(xué)校高職單招職業(yè)技能測(cè)驗(yàn)歷年參考題庫(kù)(頻考版)含答案解析
- 2024年建筑施工安全工作計(jì)劃(3篇)
- 2024屆九省聯(lián)考英語(yǔ)試題(含答案解析、MP3及錄音稿)
- 倉(cāng)庫(kù)消防知識(shí)安全培訓(xùn)
- 從事專(zhuān)業(yè)與所學(xué)專(zhuān)業(yè)不一致專(zhuān)業(yè)技術(shù)人員申報(bào)職稱(chēng)崗位任職合格證明附件6
- 我國(guó)房屋建筑模板技術(shù)的研究綜述
- 人教版小學(xué)三年級(jí)上冊(cè)數(shù)學(xué)豎式筆算練習(xí)題
- 航天科工集團(tuán)在線測(cè)評(píng)題
- 山東省濰坊新2025屆高三語(yǔ)文第一學(xué)期期末經(jīng)典試題含解析
- (新版)吉林一級(jí)健康管理師高頻核心題庫(kù)300題(含答案)
- JT-T-1344-2020純電動(dòng)汽車(chē)維護(hù)、檢測(cè)、診斷技術(shù)規(guī)范
- 2024年湖北省武漢市中考語(yǔ)文試卷真題(含答案)
評(píng)論
0/150
提交評(píng)論