《Visual C# NET案例教程》課件第9章_第1頁
《Visual C# NET案例教程》課件第9章_第2頁
《Visual C# NET案例教程》課件第9章_第3頁
《Visual C# NET案例教程》課件第9章_第4頁
《Visual C# NET案例教程》課件第9章_第5頁
已閱讀5頁,還剩82頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

第9章圖書維護(hù)

9.1圖書維護(hù)窗體介紹9.2DataSet對(duì)象9.3DataAdapter對(duì)象9.4DataTable對(duì)象9.5圖書維護(hù)窗體的實(shí)現(xiàn)9.6水晶報(bào)表9.7知識(shí)拓展9.8習(xí)題圖書維護(hù)窗體實(shí)現(xiàn)了對(duì)圖書信息的增加、刪除和修改,窗體如圖9-1所示,單擊“增加”按鈕,彈出如圖9-2所示的增加圖書窗體。9.1圖書維護(hù)窗體介紹圖9-1圖書維護(hù)窗體圖9-2增加圖書窗體

DataSet可以視為一個(gè)內(nèi)存數(shù)據(jù)庫,由許多數(shù)據(jù)表、數(shù)據(jù)表聯(lián)系(Relation)、約束(Constraint)、記錄(Row)以及字段(Column)對(duì)象的集合所組成。

DataSet的結(jié)構(gòu)與數(shù)據(jù)庫相似,由一個(gè)或多個(gè)DataTable組成,DataTable相當(dāng)于數(shù)據(jù)庫中的表。其中列DataColumn與行DataRow分別對(duì)應(yīng)于數(shù)據(jù)庫的字段與數(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ù)庫中取回?cái)?shù)據(jù),存到DataSet對(duì)象中后,程序可以馬上斷開與數(shù)據(jù)庫的連接,用戶可以對(duì)內(nèi)存中DataSet中的數(shù)據(jù)進(jìn)行增加、刪除等修改,而當(dāng)需要把改動(dòng)反映到數(shù)據(jù)庫時(shí),只要重新與數(shù)據(jù)庫建立連接,并利用相應(yīng)的命令實(shí)現(xiàn)更新即可。這意味著程序和數(shù)據(jù)庫的連接時(shí)間可以盡可能縮短,減少對(duì)數(shù)據(jù)庫服務(wù)器資源的占用。由于DataSet對(duì)象本身不具備和數(shù)據(jù)源溝通的能力,因此要修改、更新數(shù)據(jù)并返回?cái)?shù)據(jù)源時(shí),需要DataAdapter對(duì)象。

DataAdapter提供的是對(duì)于數(shù)據(jù)集的填充和對(duì)更新的回傳任務(wù),對(duì)于DataSet來說,DataAdapter有點(diǎn)像一個(gè)搬運(yùn)工,把數(shù)據(jù)從數(shù)據(jù)庫“搬運(yùn)”到DataSet中,DataSet中的數(shù)據(jù)有了改動(dòng)的時(shí)候,又可以把這些改動(dòng)“反映”給數(shù)據(jù)庫。而DataAdapter做這件事情,靠的是它所包含的4個(gè)Command對(duì)象:9.3DataAdapter對(duì)象●?SelectCommand 用于在數(shù)據(jù)源中選擇記錄的SQL命令。

●?InsertCommand 用來在數(shù)據(jù)源中插入新記錄的SQL命令。

●?UpdateCommand用于更新數(shù)據(jù)源中記錄的SQL命令。

●?DeleteCommand 用來從數(shù)據(jù)集刪除記錄的SQL命令。

創(chuàng)建DataAdapter一般用以下方式:

SqlDataAdapterda=newSqlDataAdapter(selectSQL,Connection);其中,selectSQL為返回?cái)?shù)據(jù)集的Select語句,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方法打開。調(diào)用DataAdapter的Fill方法時(shí),如果Connection沒有打開,DataAdapter會(huì)自動(dòng)調(diào)用Connection的Open方法;DataAdapter對(duì)數(shù)據(jù)源的操作完畢后,會(huì)自動(dòng)將Connection關(guān)閉。如果在執(zhí)行Fill方法時(shí)Connection已打開,在執(zhí)行完畢后DataAdapter會(huì)維持Connection打開狀態(tài)。

DataTable是構(gòu)成DataSet最主要的對(duì)象,DataTable對(duì)象是由DataColumns集合以及DataRows集合所組成的,DataSet的數(shù)據(jù)就存放在DataTable對(duì)象中。DataTable對(duì)象的常用屬性見表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的屬性見表9-2。表9-2DataColumn的屬性

【例9-1】下面的例子把圖書表中的數(shù)據(jù)取到DataSet中,然后把DataSet中的內(nèi)容顯示出來,運(yùn)行結(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]["圖書編號(hào)"].ToString()+"\t"+ds.Tables[0].Rows[i]["書名"].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事件編寫如下代碼:

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ù)庫原理";

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圖書表",conn);

DataSetds=newDataSet();da.Fill(ds);

//插入新的一行

DataRowdr1=ds.Tables[0].NewRow();

dr1["圖書編號(hào)"]="88";

dr1["書名"]="ASP.NET項(xiàng)目開發(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方法實(shí)現(xiàn)對(duì)數(shù)據(jù)庫的更新:

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被修改過,該方法就執(zhí)行Update的SQL命令;若DataRow被刪除,則執(zhí)行Delete的SQL命令。那么,實(shí)現(xiàn)更新的Insert、Update、Delete這些SQL從哪來呢?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è)簡化的方法,即利用CommandBuilder對(duì)象自動(dòng)構(gòu)建。本例中對(duì)應(yīng)的實(shí)現(xiàn)語句為:

SqlCommandBuildercb=newSqlCommandBuilder(da);

DataSet中的數(shù)據(jù)必須至少存在一個(gè)主鍵列或唯一列,否則,調(diào)用Update()時(shí)將產(chǎn)生異常,不會(huì)生成自動(dòng)更新數(shù)據(jù)庫的INSERT、UPDATE或DELETE命令。下面介紹實(shí)現(xiàn)圖書維護(hù)窗體,效果如圖9-6所示。

圖書維護(hù)V1.0的實(shí)現(xiàn)步驟如下:

(1)新建一個(gè)Windows應(yīng)用程序BookEdit。

(2)添加一個(gè)名為FrmBook的窗體。

(3)如圖所示設(shè)計(jì)FrmBook的窗體界面。9.5圖書維護(hù)窗體的實(shí)現(xiàn)圖9-6圖書維護(hù)窗體設(shè)計(jì)界面(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["圖書編號(hào)"].Value.ToString();

frm.Text="增加圖書";

frm.ShowDialog();

bind();

}

//單擊“刪除”按鈕

privatevoidtsbDelete_Click(objectsender,EventArgse)

{

try

{

if(MessageBox.Show("確定要?jiǎng)h除該圖書嗎?","提示",MessageBoxButtons.OKCancel,MessageBoxIcon.Question)==DialogResult.OK){

ExecuteCommand("delete圖書表where圖書編號(hào)="+dataGridView1.CurrentRow.Cells["圖書編號(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="修改圖書";

frm.fill(dataGridView1.CurrentRow.Cells["圖書編號(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è)計(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圖書表where圖書編號(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=="增加圖書")

{

sql="INSERTINTO圖書表(ISBN,書名,作者,價(jià)格,出版社,出版日期,庫存數(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,價(jià)格=@price,出版社=@publisher,出版日期=@pubDate,庫存數(shù)=@qtyWHERE圖書編號(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ù)庫并根據(jù)需要將數(shù)據(jù)“拉”進(jìn)來。使用這種模式時(shí),與數(shù)據(jù)庫的連接和為了獲取數(shù)據(jù)而執(zhí)行的SQL命令同時(shí)由CrystalReports本身處理,不需要開發(fā)人員編寫代碼。

如果在運(yùn)行時(shí)無須編寫任何特殊代碼,則使用拉模式。9.6水晶報(bào)表

2.推模式

推模式需要開發(fā)人員編寫代碼以連接到數(shù)據(jù)庫,執(zhí)行SQL命令以創(chuàng)建與報(bào)表中的字段匹配的記錄集或數(shù)據(jù)集,并且將該對(duì)象傳遞給報(bào)表。該方法可以將連接共享置入應(yīng)用程序中,并在CrystalReports收到數(shù)據(jù)之前先將數(shù)據(jù)篩選出來。

相比拉模式,推模式有更大的靈活性,下面僅介紹推模式的報(bào)表開發(fā)方式。9.6.2報(bào)表設(shè)計(jì)

報(bào)表設(shè)計(jì)界面如圖9-8所示,報(bào)表分為若干個(gè)報(bào)表節(jié),如“報(bào)表頁眉”、“頁腳和詳細(xì)資料”,可將對(duì)象拖動(dòng)到某個(gè)報(bào)表節(jié)上。圖9-8報(bào)表設(shè)計(jì)界面●“報(bào)表頁眉”:放在“報(bào)表頁眉”節(jié)中的對(duì)象只在報(bào)表開頭輸出顯示一次?!皥?bào)表頁眉”節(jié)通常包含報(bào)表的標(biāo)題和其他希望只在報(bào)表開始位置出現(xiàn)的信息。放在該節(jié)中的公式只在報(bào)表開始處進(jìn)行一次求值。

●“頁眉”:放在“頁眉”節(jié)中的對(duì)象輸出顯示在每個(gè)新頁的開始位置?!绊撁肌惫?jié)通常包含希望在每頁頂部出現(xiàn)的信息,它可以包括文本字段(如章節(jié)名、文檔名或其他類似信息),該節(jié)也可以用來包含字段標(biāo)題,在報(bào)表中這些字段標(biāo)題將作為標(biāo)簽顯示在字段數(shù)據(jù)列的頂部。圖表或交叉表不能放置在該節(jié)中。放在該節(jié)中的公式在每個(gè)新頁的開始進(jìn)行一次求值。●“詳細(xì)資料”:放在“詳細(xì)資料”部分中的對(duì)象隨每條新記錄輸出顯示?!霸敿?xì)資料”部分包含報(bào)表正文數(shù)據(jù)。當(dāng)報(bào)表運(yùn)行時(shí),“詳細(xì)資料”部分隨每條記錄重復(fù)輸出顯示。例如,如果向“詳細(xì)資料”部分中添加了一個(gè)數(shù)據(jù)庫對(duì)象,而這個(gè)數(shù)據(jù)庫對(duì)象包含100條記錄,那么報(bào)表在運(yùn)行時(shí)將輸出顯示100個(gè)單獨(dú)的“詳細(xì)資料”部分。圖表或交叉表不能放置在該節(jié)中。放在該節(jié)中的公式對(duì)每條記錄進(jìn)行一次求值。

●“報(bào)表頁腳”:放在“報(bào)表頁腳”節(jié)中的對(duì)象只在報(bào)表的結(jié)束位置輸出顯示一次。該節(jié)可用來包含希望只在報(bào)表的末尾出現(xiàn)一次的信息(如總計(jì)),放在該節(jié)中的圖表和交叉表包含整個(gè)報(bào)表的數(shù)據(jù),放在該節(jié)中的公式只在報(bào)表的結(jié)束位置進(jìn)行一次求值?!瘛绊撃_”:放在“頁腳”節(jié)中的對(duì)象輸出顯示在每頁的底部。該節(jié)通常包含頁碼和任何其他希望出現(xiàn)在每頁底部的信息。圖表和交叉表不能放置在該節(jié)中。放在該節(jié)中的公式在每個(gè)新頁面的結(jié)束位置進(jìn)行一次求值。

●其他報(bào)表節(jié):如果將組、摘要或小計(jì)添加到報(bào)表中,則會(huì)創(chuàng)建另外兩個(gè)節(jié):“組頁眉”和“組頁腳”。當(dāng)添加了組、摘要或小計(jì)時(shí),“組頁眉”節(jié)出現(xiàn)在“詳細(xì)資料”部分的正上方,而“組頁腳”節(jié)出現(xiàn)在“詳細(xì)資料”部分的正下方。跟原始報(bào)表節(jié)一樣,每個(gè)新添加的節(jié)也可以包含一個(gè)或多個(gè)子節(jié)?!瘛敖M頁眉”:放在“組頁眉”節(jié)中的對(duì)象輸出顯示在每個(gè)新組的開始位置。該節(jié)通常保存組名字段,也可以用來顯示包括組特定數(shù)據(jù)的圖表或交叉表?!敖M頁眉”節(jié)在每組的開始位置輸出顯示一次。放在該節(jié)中的圖表和交叉表僅包含本組數(shù)據(jù)。放在該節(jié)中的公式在每組的開始對(duì)本組進(jìn)行一次求值。

●“組頁腳”:放在“組頁腳”節(jié)中的對(duì)象輸出顯示在每組的結(jié)束位置。該節(jié)通常保存匯總數(shù)據(jù)(如果有),也可以用來顯示圖表或交叉表。“組頁腳”節(jié)在每組的結(jié)束位置輸出顯示一次。放在該節(jié)中的圖表和交叉表僅包含本組數(shù)據(jù)。放在該節(jié)中的公式在每組的結(jié)束位置對(duì)本組進(jìn)行一次求值。9.6.3制作圖書信息的報(bào)表

下面介紹制作圖書信息的報(bào)表,報(bào)表效果如圖9-9所示。圖9-9報(bào)表效果圖書維護(hù)V2.0的實(shí)現(xiàn)步驟如下:

(1)用VS2005打開圖書維護(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ì)頁面,彈出如圖9-12所示的窗口,新建一個(gè)連接或選擇好數(shù)據(jù)庫連接,單擊“下一步”按鈕。圖9-12新建連接③彈出如圖9-13所示窗口,選中“使用SQL語句”,單擊“下一步”按鈕。圖9-13選擇“使用SQL語句”④彈出如圖9-14所示的“TableAdapter”窗口,輸入“select*from圖書表”。圖9-14輸入SQL語句⑤單擊“完成”按鈕,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庫”窗口;單擊“確定”按鈕,彈出“標(biāo)準(zhǔn)報(bào)表創(chuàng)建向?qū)А?,如圖9-18所示。圖9-16“添加新項(xiàng)”窗口圖9-17選擇使用“報(bào)表向?qū)А眻D9-18“標(biāo)準(zhǔn)報(bào)表創(chuàng)建向?qū)А贝翱冖谡归_ADO.NET節(jié)點(diǎn),選中“圖書表項(xiàng)”,單擊按鈕,把“圖書表”選擇到右邊“選定的表”列表中。單擊“下一步”按鈕,彈出如圖9-19所示的窗口;單擊按鈕,把所有字段添加到右邊“要顯示的字段”列表中;單擊“完成”按鈕,系統(tǒng)界面進(jìn)入如圖9-20所示的報(bào)表設(shè)計(jì)界面。圖9-19選擇要顯示的字段圖9-20初始報(bào)表設(shè)計(jì)界面③取消“頁眉”部分的其他列標(biāo)題的下劃線。

選中“頁眉”部分的所有標(biāo)題字段,在“屬性”窗口展開Font節(jié)點(diǎn),設(shè)置Undeline屬性為False。

④繪制表格。

在報(bào)表設(shè)計(jì)界面上右擊鼠標(biāo),在彈出菜單中選擇“插入”→“框”。鼠標(biāo)圖標(biāo)變?yōu)楫嫻P的形狀,拖到鼠標(biāo),畫出一個(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)楫嫻P的形狀,在“詳細(xì)資料”欄下方劃一條橫線。如圖9-23所示。圖9-23在“詳細(xì)資料”欄下方劃一條橫線

在報(bào)表設(shè)計(jì)界面上右擊鼠標(biāo),在彈出菜單中選擇“插入”→“框”。鼠標(biāo)圖標(biāo)變?yōu)楫嫻P的形狀,在圖書編號(hào)與ISBN字段間畫豎線,然后對(duì)豎線進(jìn)行復(fù)制、粘貼操作,在其他各字段間插入豎線。如圖9-24所示。圖9-24字段間畫豎線

(4)制作報(bào)表窗體。

①向項(xiàng)目添加一個(gè)窗體,命名為FrmReport。

②從工具箱的CrystalReports欄向FrmReport窗體拖動(dòng)一個(gè)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文件拷到項(xiàng)目的bin/debug目錄下,運(yùn)行項(xiàng)目。9.7.1DataView對(duì)象

ADO.NET提供了一個(gè)可以自定義數(shù)據(jù)外觀的DataView對(duì)象,是一種用來幫助設(shè)置DataTable中的數(shù)據(jù)如何顯示的對(duì)象,其本身并不包含DataTable中的數(shù)據(jù)。通過DataView對(duì)象可以過濾、排序和查找對(duì)應(yīng)DataTable中的數(shù)據(jù)。對(duì)DataView對(duì)象所執(zhí)行的任何操作都會(huì)影響原來的DataTable中的數(shù)據(jù)。9.7知識(shí)拓展

DataTable提供了一個(gè)DefaultView屬性,DefaultView屬性本身就是DataView對(duì)象,可以通過設(shè)置DefaultView的屬性來指定DataTable的顯示格式。如果DefaultView這個(gè)DataView對(duì)象無法滿足需求,還可以建立多個(gè)DataView對(duì)象來制定數(shù)據(jù)的顯示格式。其聲明語法如下所示:

DataViewdataView=newDataView(數(shù)據(jù)表)

DataView對(duì)象的常用屬性及方法見表9-3。表9-3DataView對(duì)象的常用屬性及方法排序數(shù)據(jù)時(shí)可以使用DataView對(duì)象的Sort屬性。Sort屬性以字段作為排序的依據(jù),其基本語法如下:

DataView.Sort="字段ASC|DESC"

篩選記錄可以使用DataView對(duì)象的RowFilter屬性以及RowStateFilter屬性。RowFilter屬性可以利用比較運(yùn)算符?<、>、<=、>=?以及Like來過濾記錄中的數(shù)據(jù),其語法如下所示:

DataView.RowFilter="過濾條件"

例如,查詢Country列等于USA的數(shù)據(jù),可寫成:

DataView.RowFilter="Country='USA'"9.7.2數(shù)據(jù)庫公用類

從軟件工程的角度,代碼要盡可能的實(shí)現(xiàn)重用,或者說,同樣的代碼要避免寫兩次。在前面的編程中,可以感覺到數(shù)據(jù)庫操作的代碼有許多重復(fù)的地方。因此,可以把對(duì)數(shù)據(jù)庫操作的共同部分提煉出來,封裝到一個(gè)類中。以后可以調(diào)用類中的方法,輕松地實(shí)現(xiàn)數(shù)據(jù)庫的操作,并把編程的精力集中在實(shí)現(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等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論