版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
第9章圖書維護
9.1圖書維護窗體介紹9.2DataSet對象9.3DataAdapter對象9.4DataTable對象9.5圖書維護窗體的實現(xiàn)9.6水晶報表9.7知識拓展9.8習(xí)題圖書維護窗體實現(xiàn)了對圖書信息的增加、刪除和修改,窗體如圖9-1所示,單擊“增加”按鈕,彈出如圖9-2所示的增加圖書窗體。9.1圖書維護窗體介紹圖9-1圖書維護窗體圖9-2增加圖書窗體
DataSet可以視為一個內(nèi)存數(shù)據(jù)庫,由許多數(shù)據(jù)表、數(shù)據(jù)表聯(lián)系(Relation)、約束(Constraint)、記錄(Row)以及字段(Column)對象的集合所組成。
DataSet的結(jié)構(gòu)與數(shù)據(jù)庫相似,由一個或多個DataTable組成,DataTable相當(dāng)于數(shù)據(jù)庫中的表。其中列DataColumn與行DataRow分別對應(yīng)于數(shù)據(jù)庫的字段與數(shù)據(jù)行。DataSet中的數(shù)據(jù)存放在DataTable中。DataSet、DataTable的結(jié)構(gòu)如圖9-3所示。9.2DataSet對象圖9-3DataSet、DataTable的結(jié)構(gòu)
DataSet對象一個重要的特性是離線操作,即從數(shù)據(jù)庫中取回數(shù)據(jù),存到DataSet對象中后,程序可以馬上斷開與數(shù)據(jù)庫的連接,用戶可以對內(nèi)存中DataSet中的數(shù)據(jù)進行增加、刪除等修改,而當(dāng)需要把改動反映到數(shù)據(jù)庫時,只要重新與數(shù)據(jù)庫建立連接,并利用相應(yīng)的命令實現(xiàn)更新即可。這意味著程序和數(shù)據(jù)庫的連接時間可以盡可能縮短,減少對數(shù)據(jù)庫服務(wù)器資源的占用。由于DataSet對象本身不具備和數(shù)據(jù)源溝通的能力,因此要修改、更新數(shù)據(jù)并返回數(shù)據(jù)源時,需要DataAdapter對象。
DataAdapter提供的是對于數(shù)據(jù)集的填充和對更新的回傳任務(wù),對于DataSet來說,DataAdapter有點像一個搬運工,把數(shù)據(jù)從數(shù)據(jù)庫“搬運”到DataSet中,DataSet中的數(shù)據(jù)有了改動的時候,又可以把這些改動“反映”給數(shù)據(jù)庫。而DataAdapter做這件事情,靠的是它所包含的4個Command對象:9.3DataAdapter對象●?SelectCommand 用于在數(shù)據(jù)源中選擇記錄的SQL命令。
●?InsertCommand 用來在數(shù)據(jù)源中插入新記錄的SQL命令。
●?UpdateCommand用于更新數(shù)據(jù)源中記錄的SQL命令。
●?DeleteCommand 用來從數(shù)據(jù)集刪除記錄的SQL命令。
創(chuàng)建DataAdapter一般用以下方式:
SqlDataAdapterda=newSqlDataAdapter(selectSQL,Connection);其中,selectSQL為返回數(shù)據(jù)集的Select語句,Connection用于指定所用的連接。這種方式等價于另一種常用的DataAdapter創(chuàng)建方式:
SqlDataAdapterda=newSqlDataAdapter(); //創(chuàng)建DataAdapter
SqlCommandcmd=newSqlCommand(selectSQL,conn);//創(chuàng)建Command
da.SelectCommand=cmd; //給DataAdapter的SelectCommand賦值利用DataAdapter對象的Fill方法把數(shù)據(jù)填充到DataSet。DataAdapter使用的Connection對象并不需先用Open方法打開。調(diào)用DataAdapter的Fill方法時,如果Connection沒有打開,DataAdapter會自動調(diào)用Connection的Open方法;DataAdapter對數(shù)據(jù)源的操作完畢后,會自動將Connection關(guān)閉。如果在執(zhí)行Fill方法時Connection已打開,在執(zhí)行完畢后DataAdapter會維持Connection打開狀態(tài)。
DataTable是構(gòu)成DataSet最主要的對象,DataTable對象是由DataColumns集合以及DataRows集合所組成的,DataSet的數(shù)據(jù)就存放在DataTable對象中。DataTable對象的常用屬性見表9-1。9.4DataTable對象表9-1DataTable對象的常用屬性
DataTable對象的常用方法:
●?AcceptChanges 確定DataTable所作的改變。
●?Clear 清除DataTable內(nèi)所有的數(shù)據(jù)。
●?NewRow 增加一筆新的記錄。
DataColumn對象就是字段對象,是組成數(shù)據(jù)表DataTable的基本單位。DataColumn的屬性見表9-2。表9-2DataColumn的屬性
【例9-1】下面的例子把圖書表中的數(shù)據(jù)取到DataSet中,然后把DataSet中的內(nèi)容顯示出來,運行結(jié)果如圖9-4所示。
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Text;
usingSystem.Data;
usingSystem.Data.SqlClient;//引入數(shù)據(jù)庫相關(guān)名稱空間
classProgram
{
staticvoidMain(string[]args)
{
SqlConnectionconn=newSqlConnection("server=PC-20101005APPX;database=BookDB;integratedsecurity=true");
SqlDataAdapterda=newSqlDataAdapter("select*from圖書表",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]["圖書編號"].ToString()+"\t"+ds.Tables[0].Rows[i]["書名"].ToString());
}
}
}圖9-4例9-1運行結(jié)果【例9-2】動態(tài)生成內(nèi)存表DataTable,運行結(jié)果如圖9-5所示。圖9-5例9-2運行結(jié)果
新建一個Windows項目,從工具欄向窗體拖入一個DataGridView控件;雙擊窗體,切換到代碼窗口,為Form1的Load事件編寫如下代碼:
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)生一個行DataRow,該行的結(jié)構(gòu)與DataTable的行結(jié)構(gòu)相同
row["BookID"]="C0008";
row["BookName"]="ASP.NET程序設(shè)計";
table.Rows.Add(row);
row=table.NewRow();
row["BookID"]="C0009";
row["BookName"]="數(shù)據(jù)庫原理";
table.Rows.Add(row); //把DataRow加入到DataTable
dataGridView1.DataSource=table;
}【例9-3】利用DataSet和DataAdapter實現(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圖書表",conn);
DataSetds=newDataSet();da.Fill(ds);
//插入新的一行
DataRowdr1=ds.Tables[0].NewRow();
dr1["圖書編號"]="88";
dr1["書名"]="ASP.NET項目開發(fā)教程";
dr1["作者"]="李四";
ds.Tables[0].Rows.Add(dr1);
//更新第二行
DataRowdr2=ds.Tables[0].Rows[1];
dr2["書名"]="C#經(jīng)典";
//刪除第五行
ds.Tables[0].Rows[2].Delete();
SqlCommandBuildercb=newSqlCommandBuilder(da);
da.Update(ds.Tables[0]);
}
}程序說明:
在上面的程序中,我們調(diào)用DataAdapter的Update方法實現(xiàn)對數(shù)據(jù)庫的更新:
da.Update(ds,“Books”);
在處理數(shù)據(jù)的時候,DataRow對象會自動記錄目前記錄的狀況,只要記錄一有改變便做標(biāo)記。等調(diào)用DataAdapter對象的Update方法時,DataAdapter會根據(jù)DataSet中數(shù)據(jù)的增、刪、改等情況,使用適當(dāng)?shù)腟QL命令將修改更新至數(shù)據(jù)源。Update這個方法會檢查每一個DataRow的狀態(tài),若DataRow是新增加的,該方法就執(zhí)行Insert的SQL命令;若DataRow被修改過,該方法就執(zhí)行Update的SQL命令;若DataRow被刪除,則執(zhí)行Delete的SQL命令。那么,實現(xiàn)更新的Insert、Update、Delete這些SQL從哪來呢?DataAdapter中有四個Command對象屬性,分別是SelectCommand、InsertCommand、UpdateCommand以及DeleteCommand屬性。我們可以預(yù)先準(zhǔn)備好這幾個Command,需要時DataAdapter會自動調(diào)用。但我們并未對DataAdapter的幾個Command賦值,因為要產(chǎn)生這些Command比較麻煩,系統(tǒng)提供了一個簡化的方法,即利用CommandBuilder對象自動構(gòu)建。本例中對應(yīng)的實現(xiàn)語句為:
SqlCommandBuildercb=newSqlCommandBuilder(da);
DataSet中的數(shù)據(jù)必須至少存在一個主鍵列或唯一列,否則,調(diào)用Update()時將產(chǎn)生異常,不會生成自動更新數(shù)據(jù)庫的INSERT、UPDATE或DELETE命令。下面介紹實現(xiàn)圖書維護窗體,效果如圖9-6所示。
圖書維護V1.0的實現(xiàn)步驟如下:
(1)新建一個Windows應(yīng)用程序BookEdit。
(2)添加一個名為FrmBook的窗體。
(3)如圖所示設(shè)計FrmBook的窗體界面。9.5圖書維護窗體的實現(xiàn)圖9-6圖書維護窗體設(shè)計界面(4)編寫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圖書表",conn);
SqlDataAdapterda=newSqlDataAdapter(cmd);
da.Fill(ds);
dataGridView1.DataSource=ds.Tables[0];
}
//單擊“增加”按鈕
privatevoidtsbAdd_Click(objectsender,EventArgse)
{
FrmAddfrm=newFrmAdd();frm.bookNO=dataGridView1.CurrentRow.Cells["圖書編號"].Value.ToString();
frm.Text="增加圖書";
frm.ShowDialog();
bind();
}
//單擊“刪除”按鈕
privatevoidtsbDelete_Click(objectsender,EventArgse)
{
try
{
if(MessageBox.Show("確定要刪除該圖書嗎?","提示",MessageBoxButtons.OKCancel,MessageBoxIcon.Question)==DialogResult.OK){
ExecuteCommand("delete圖書表where圖書編號="+dataGridView1.CurrentRow.Cells["圖書編號"].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="修改圖書";
frm.fill(dataGridView1.CurrentRow.Cells["圖書編號"].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)添加一個名為FrmAdd的窗體,界面如圖9-7所示。圖9-7增加/修改圖書窗體設(shè)計代碼如下:
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圖書表where圖書編號='"+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=="增加圖書")
{
sql="INSERTINTO圖書表(ISBN,書名,作者,價格,出版社,出版日期,庫存數(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=="修改圖書")
{
sql="UPDATE圖書表SETISBN=@isbn,書名=@bookName,作者=@author,價格=@price,出版社=@publisher,出版日期=@pubDate,庫存數(shù)=@qtyWHERE圖書編號=@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ū)動程序?qū)⑦B接到數(shù)據(jù)庫并根據(jù)需要將數(shù)據(jù)“拉”進來。使用這種模式時,與數(shù)據(jù)庫的連接和為了獲取數(shù)據(jù)而執(zhí)行的SQL命令同時由CrystalReports本身處理,不需要開發(fā)人員編寫代碼。
如果在運行時無須編寫任何特殊代碼,則使用拉模式。9.6水晶報表
2.推模式
推模式需要開發(fā)人員編寫代碼以連接到數(shù)據(jù)庫,執(zhí)行SQL命令以創(chuàng)建與報表中的字段匹配的記錄集或數(shù)據(jù)集,并且將該對象傳遞給報表。該方法可以將連接共享置入應(yīng)用程序中,并在CrystalReports收到數(shù)據(jù)之前先將數(shù)據(jù)篩選出來。
相比拉模式,推模式有更大的靈活性,下面僅介紹推模式的報表開發(fā)方式。9.6.2報表設(shè)計
報表設(shè)計界面如圖9-8所示,報表分為若干個報表節(jié),如“報表頁眉”、“頁腳和詳細(xì)資料”,可將對象拖動到某個報表節(jié)上。圖9-8報表設(shè)計界面●“報表頁眉”:放在“報表頁眉”節(jié)中的對象只在報表開頭輸出顯示一次?!皥蟊眄撁肌惫?jié)通常包含報表的標(biāo)題和其他希望只在報表開始位置出現(xiàn)的信息。放在該節(jié)中的公式只在報表開始處進行一次求值。
●“頁眉”:放在“頁眉”節(jié)中的對象輸出顯示在每個新頁的開始位置。“頁眉”節(jié)通常包含希望在每頁頂部出現(xiàn)的信息,它可以包括文本字段(如章節(jié)名、文檔名或其他類似信息),該節(jié)也可以用來包含字段標(biāo)題,在報表中這些字段標(biāo)題將作為標(biāo)簽顯示在字段數(shù)據(jù)列的頂部。圖表或交叉表不能放置在該節(jié)中。放在該節(jié)中的公式在每個新頁的開始進行一次求值。●“詳細(xì)資料”:放在“詳細(xì)資料”部分中的對象隨每條新記錄輸出顯示。“詳細(xì)資料”部分包含報表正文數(shù)據(jù)。當(dāng)報表運行時,“詳細(xì)資料”部分隨每條記錄重復(fù)輸出顯示。例如,如果向“詳細(xì)資料”部分中添加了一個數(shù)據(jù)庫對象,而這個數(shù)據(jù)庫對象包含100條記錄,那么報表在運行時將輸出顯示100個單獨的“詳細(xì)資料”部分。圖表或交叉表不能放置在該節(jié)中。放在該節(jié)中的公式對每條記錄進行一次求值。
●“報表頁腳”:放在“報表頁腳”節(jié)中的對象只在報表的結(jié)束位置輸出顯示一次。該節(jié)可用來包含希望只在報表的末尾出現(xiàn)一次的信息(如總計),放在該節(jié)中的圖表和交叉表包含整個報表的數(shù)據(jù),放在該節(jié)中的公式只在報表的結(jié)束位置進行一次求值?!瘛绊撃_”:放在“頁腳”節(jié)中的對象輸出顯示在每頁的底部。該節(jié)通常包含頁碼和任何其他希望出現(xiàn)在每頁底部的信息。圖表和交叉表不能放置在該節(jié)中。放在該節(jié)中的公式在每個新頁面的結(jié)束位置進行一次求值。
●其他報表節(jié):如果將組、摘要或小計添加到報表中,則會創(chuàng)建另外兩個節(jié):“組頁眉”和“組頁腳”。當(dāng)添加了組、摘要或小計時,“組頁眉”節(jié)出現(xiàn)在“詳細(xì)資料”部分的正上方,而“組頁腳”節(jié)出現(xiàn)在“詳細(xì)資料”部分的正下方。跟原始報表節(jié)一樣,每個新添加的節(jié)也可以包含一個或多個子節(jié)。●“組頁眉”:放在“組頁眉”節(jié)中的對象輸出顯示在每個新組的開始位置。該節(jié)通常保存組名字段,也可以用來顯示包括組特定數(shù)據(jù)的圖表或交叉表?!敖M頁眉”節(jié)在每組的開始位置輸出顯示一次。放在該節(jié)中的圖表和交叉表僅包含本組數(shù)據(jù)。放在該節(jié)中的公式在每組的開始對本組進行一次求值。
●“組頁腳”:放在“組頁腳”節(jié)中的對象輸出顯示在每組的結(jié)束位置。該節(jié)通常保存匯總數(shù)據(jù)(如果有),也可以用來顯示圖表或交叉表?!敖M頁腳”節(jié)在每組的結(jié)束位置輸出顯示一次。放在該節(jié)中的圖表和交叉表僅包含本組數(shù)據(jù)。放在該節(jié)中的公式在每組的結(jié)束位置對本組進行一次求值。9.6.3制作圖書信息的報表
下面介紹制作圖書信息的報表,報表效果如圖9-9所示。圖9-9報表效果圖書維護V2.0的實現(xiàn)步驟如下:
(1)用VS2005打開圖書維護項目。
(2)建立數(shù)據(jù)集。
①單擊菜單“項目”→“添加新項”,彈出“添加新項”窗口,在“模板”列表中選中數(shù)據(jù)集,如圖9-10所示。單擊“添加”按鈕,出現(xiàn)如圖9-11所示DataSet1.xsd設(shè)計界面。圖9-10“添加新項”窗口圖9-11DataSet1.xsd設(shè)計界面②從“工具箱”的“數(shù)據(jù)集”欄拖動一個TableAdapter到DataSet1.xsd設(shè)計頁面,彈出如圖9-12所示的窗口,新建一個連接或選擇好數(shù)據(jù)庫連接,單擊“下一步”按鈕。圖9-12新建連接③彈出如圖9-13所示窗口,選中“使用SQL語句”,單擊“下一步”按鈕。圖9-13選擇“使用SQL語句”④彈出如圖9-14所示的“TableAdapter”窗口,輸入“select*from圖書表”。圖9-14輸入SQL語句⑤單擊“完成”按鈕,DataSet1.xsd中多了一個DataTabe,如圖9-15所示。圖9-15完成的DataSet1.xsd界面
(3)創(chuàng)建報表。
①單擊菜單“項目”→“添加新項”,彈出“添加新項”窗口,在“模板”列表中選中“Crystal報表”,如圖9-16所示;單擊“添加”按鈕,彈出如圖9-17所示的“CrystalReports庫”窗口;單擊“確定”按鈕,彈出“標(biāo)準(zhǔn)報表創(chuàng)建向?qū)А?,如圖9-18所示。圖9-16“添加新項”窗口圖9-17選擇使用“報表向?qū)А眻D9-18“標(biāo)準(zhǔn)報表創(chuàng)建向?qū)А贝翱冖谡归_ADO.NET節(jié)點,選中“圖書表項”,單擊按鈕,把“圖書表”選擇到右邊“選定的表”列表中。單擊“下一步”按鈕,彈出如圖9-19所示的窗口;單擊按鈕,把所有字段添加到右邊“要顯示的字段”列表中;單擊“完成”按鈕,系統(tǒng)界面進入如圖9-20所示的報表設(shè)計界面。圖9-19選擇要顯示的字段圖9-20初始報表設(shè)計界面③取消“頁眉”部分的其他列標(biāo)題的下劃線。
選中“頁眉”部分的所有標(biāo)題字段,在“屬性”窗口展開Font節(jié)點,設(shè)置Undeline屬性為False。
④繪制表格。
在報表設(shè)計界面上右擊鼠標(biāo),在彈出菜單中選擇“插入”→“框”。鼠標(biāo)圖標(biāo)變?yōu)楫嫻P的形狀,拖到鼠標(biāo),畫出一個矩形方框。效果如圖9-21所示。圖9-21繪制表格調(diào)整好報表各元素的大小與位置,如圖9-22所示。圖9-22調(diào)整好報表各元素
在報表設(shè)計界面上右擊鼠標(biāo),在彈出菜單中選擇“插入”→“框”。鼠標(biāo)圖標(biāo)變?yōu)楫嫻P的形狀,在“詳細(xì)資料”欄下方劃一條橫線。如圖9-23所示。圖9-23在“詳細(xì)資料”欄下方劃一條橫線
在報表設(shè)計界面上右擊鼠標(biāo),在彈出菜單中選擇“插入”→“框”。鼠標(biāo)圖標(biāo)變?yōu)楫嫻P的形狀,在圖書編號與ISBN字段間畫豎線,然后對豎線進行復(fù)制、粘貼操作,在其他各字段間插入豎線。如圖9-24所示。圖9-24字段間畫豎線
(4)制作報表窗體。
①向項目添加一個窗體,命名為FrmReport。
②從工具箱的CrystalReports欄向FrmReport窗體拖動一個CrystalReportViewer控件。設(shè)置其DisplayGroupTree屬性為False。
③為FrmReport窗體的Load事件編寫如下代碼:usingSystem.Data.SqlClient;
usingCrystalDecisions.CrystalReports.Engine;
…
privatevoidForm1_Load(objectsender,EventArgse)
{SqlConnectionconn=newSqlConnection(“server=PC-20101005APPX;
database=bookdb;integratedsecurity=true");
DataSetds=newDataSet();
stringsql="select*FROM圖書表";
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文件拷到項目的bin/debug目錄下,運行項目。9.7.1DataView對象
ADO.NET提供了一個可以自定義數(shù)據(jù)外觀的DataView對象,是一種用來幫助設(shè)置DataTable中的數(shù)據(jù)如何顯示的對象,其本身并不包含DataTable中的數(shù)據(jù)。通過DataView對象可以過濾、排序和查找對應(yīng)DataTable中的數(shù)據(jù)。對DataView對象所執(zhí)行的任何操作都會影響原來的DataTable中的數(shù)據(jù)。9.7知識拓展
DataTable提供了一個DefaultView屬性,DefaultView屬性本身就是DataView對象,可以通過設(shè)置DefaultView的屬性來指定DataTable的顯示格式。如果DefaultView這個DataView對象無法滿足需求,還可以建立多個DataView對象來制定數(shù)據(jù)的顯示格式。其聲明語法如下所示:
DataViewdataView=newDataView(數(shù)據(jù)表)
DataView對象的常用屬性及方法見表9-3。表9-3DataView對象的常用屬性及方法排序數(shù)據(jù)時可以使用DataView對象的Sort屬性。Sort屬性以字段作為排序的依據(jù),其基本語法如下:
DataView.Sort="字段ASC|DESC"
篩選記錄可以使用DataView對象的RowFilter屬性以及RowStateFilter屬性。RowFilter屬性可以利用比較運算符?<、>、<=、>=?以及Like來過濾記錄中的數(shù)據(jù),其語法如下所示:
DataView.RowFilter="過濾條件"
例如,查詢Country列等于USA的數(shù)據(jù),可寫成:
DataView.RowFilter="Country='USA'"9.7.2數(shù)據(jù)庫公用類
從軟件工程的角度,代碼要盡可能的實現(xiàn)重用,或者說,同樣的代碼要避免寫兩次。在前面的編程中,可以感覺到數(shù)據(jù)庫操作的代碼有許多重復(fù)的地方。因此,可以把對數(shù)據(jù)庫操作的共同部分提煉出來,封裝到一個類中。以后可以調(diào)用類中的方法,輕松地實現(xiàn)數(shù)據(jù)庫的操作,并把編程的精力集中在實現(xiàn)應(yīng)用的邏輯上。該類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. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年重慶市建筑安全員C證(專職安全員)考試題庫
- 2025陜西省建筑安全員-C證考試題庫
- 愛護環(huán)境中班課程設(shè)計
- 汽車電器電路課程設(shè)計
- 2025山西省安全員B證考試題庫附答案
- 海外產(chǎn)品課程設(shè)計
- 幼兒園法律主題課程設(shè)計
- 2024年軟件技術(shù)支持與服務(wù)外包標(biāo)準(zhǔn)協(xié)議版B版
- 純中文授課教學(xué)課程設(shè)計
- 玩偶之家課程設(shè)計紙
- 2024-2030年撰寫:中國汽車半軸行業(yè)發(fā)展趨勢及競爭調(diào)研分析報告
- 北疆文化全媒體傳播體系的構(gòu)建與實踐
- 低血糖暈厥應(yīng)急演練預(yù)案
- 北京市西城區(qū)2023-2024學(xué)年六年級上學(xué)期數(shù)學(xué)期末試卷(含答案)
- 期末 (試題) -2024-2025學(xué)年人教PEP版英語六年級上冊
- GB/T 44212-2024消費品質(zhì)量分級廚衛(wèi)五金產(chǎn)品
- 上海春季高考英語真題試題word精校版(含答案)
- 科研倫理與學(xué)術(shù)規(guī)范-課后作業(yè)答案
- 自然辯證法概論-第4章(2018新大綱)
- 年產(chǎn)500萬平米電極箔及6.5萬噸凈水劑建設(shè)項目可行性研究報告模板-拿地申請立項
- 頂針PIN清潔、擺放作業(yè)規(guī)范
評論
0/150
提交評論