SQL數(shù)據(jù)庫操作步驟及代碼_第1頁
SQL數(shù)據(jù)庫操作步驟及代碼_第2頁
SQL數(shù)據(jù)庫操作步驟及代碼_第3頁
SQL數(shù)據(jù)庫操作步驟及代碼_第4頁
SQL數(shù)據(jù)庫操作步驟及代碼_第5頁
已閱讀5頁,還剩25頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、第2章 數(shù)據(jù)庫高級(jí)編程ADO.NET是為.NET框架而創(chuàng)建的,是對(duì)ADO(ActiveX Data Objects)對(duì)象模型的擴(kuò)充。ADO.NET提供了一組數(shù)據(jù)訪問服務(wù)的類,可用于對(duì)Microsoft SQL Server、Oracle等數(shù)據(jù)源的一致訪問。ADO.NET模型分為.NET Data Provider(數(shù)據(jù)提供程序)和DataSet數(shù)據(jù)集(數(shù)據(jù)處理的核心)兩大主要部分。.NET數(shù)據(jù)提供程序提供了四個(gè)核心對(duì)象,分別是Connection、Command、DataReader和DataAdapter對(duì)象。功能如表2-1所示。表2-1 ADO.NET核心對(duì)象對(duì)象功能Connection提

2、供和數(shù)據(jù)源的連接功能Command提供訪問數(shù)據(jù)庫命令,執(zhí)行查詢數(shù)據(jù)或修改數(shù)據(jù)的功能,例如運(yùn)行SQL命令和存儲(chǔ)過程等DataReader從數(shù)據(jù)源中讀取只向前的且只讀的數(shù)據(jù)流DataAdapter是DataSet對(duì)象和數(shù)據(jù)源間的橋梁。DataAdapter使用4個(gè)Command對(duì)象來運(yùn)行查詢、新建、修改、刪除的SQL命令,把數(shù)據(jù)加載到DataSet,或者把DataSet內(nèi)的數(shù)據(jù)送回?cái)?shù)據(jù)源2.1 SQL Server相關(guān)配置在使用C#訪問數(shù)據(jù)庫之前,首先創(chuàng)建一個(gè)名為“chap2”的數(shù)據(jù)庫,此數(shù)據(jù)庫作為2.1節(jié)及2.2節(jié)中例題操作的默認(rèn)數(shù)據(jù)庫。然后創(chuàng)建數(shù)據(jù)表Products,表結(jié)構(gòu)如表2-2所示。創(chuàng)建

3、完畢后可錄入初始化數(shù)據(jù)若干條。表2-2 Products表表結(jié)構(gòu)序號(hào)列名字段說明數(shù)據(jù)類型長度主鍵允許空1ProductID商品編號(hào)char4主鍵否2ProductName商品名稱nvarcharnvava40否3SupplierName供應(yīng)商名稱nvarchar40否4CategoryName商品類別名稱nvarchar40否5UnitPrice單價(jià)money否6UnitsInStock庫存量smallint否7Discount是否折扣char1否下面首先介紹幾個(gè)SQL Server 2012的常用操作。這些操作都是初學(xué)者在實(shí)踐環(huán)節(jié)及上機(jī)課的操作中出現(xiàn)問題較多的地方。1身份驗(yàn)證方式SQL Se

4、rver 2012在安裝時(shí)默認(rèn)是使用Windows驗(yàn)證方式的,但是安裝過后用戶可隨時(shí)修改身份驗(yàn)證方式。啟動(dòng)SQL Server 2012 Management Studio,在“連接到服務(wù)器”對(duì)話框中選擇“Windows身份驗(yàn)證”連接服務(wù)器,連接成功后,在窗體左側(cè)的“對(duì)象資源管理器”中右鍵單擊服務(wù)器實(shí)例節(jié)點(diǎn),并在彈出的快捷菜單中選擇“屬性”菜單項(xiàng),系統(tǒng)將彈出“服務(wù)器屬性”窗體,切換至“安全性”選項(xiàng)卡,如圖2-1所示。圖2-1 “服務(wù)器屬性”對(duì)話框-“安全性”選項(xiàng)卡在“服務(wù)器身份驗(yàn)證”部分選擇“SQL Server和Windows身份驗(yàn)證模式”選項(xiàng),并單擊【確定】按鈕。系統(tǒng)將提示需要重新啟動(dòng)SQ

5、L Server以使配置生效,如圖2-2所示。圖2-2 系統(tǒng)提示框右鍵單擊“對(duì)象資源管理器”的服務(wù)器實(shí)例節(jié)點(diǎn),在彈出的快捷菜單中選擇“重新啟動(dòng)”菜單項(xiàng),SQL Server將重新啟動(dòng)服務(wù),重啟成功后即可使用混合驗(yàn)證方式登錄SQL Server服務(wù)器。2添加登錄賬戶大部分初學(xué)者都習(xí)慣于使用SQL Server的系統(tǒng)管理員賬號(hào)“sa”來登錄數(shù)據(jù)庫服務(wù)器,而在實(shí)際工作環(huán)境中使用sa賬號(hào)登錄服務(wù)器是不合理的。因?yàn)楹芏嗲闆r下系統(tǒng)的數(shù)據(jù)庫是部署在租用的數(shù)據(jù)庫服務(wù)器上的,此時(shí)數(shù)據(jù)庫設(shè)計(jì)人員或編程人員都不可能具有sa賬號(hào)的使用權(quán)限,因此在將身份驗(yàn)證方式修改為SQL Server和Windows混合驗(yàn)證后,需要

6、為某應(yīng)用程序創(chuàng)建一個(gè)專用的登錄賬戶。其操作步驟描述如下。(1)使用Windows身份驗(yàn)證登錄SQL Server,在對(duì)象資源管理器中點(diǎn)擊“安全性”節(jié)點(diǎn)前面的加號(hào)“+”,在展開后的“登錄名”子節(jié)點(diǎn)上單擊右鍵,如圖2-3所示,并在彈出的快捷菜單中選擇“新建登錄名”選項(xiàng)。圖2-3 登錄名節(jié)點(diǎn)的右鍵菜單(2)系統(tǒng)彈出“登錄名新建”對(duì)話框中,如圖2-4所示。首先在登錄名輸入框中填寫需要?jiǎng)?chuàng)建的用戶名,此處以“zd”為例;將身份驗(yàn)證方式選為“SQL Server 身份驗(yàn)證”,為新建賬戶設(shè)置密碼為“123”,同時(shí)去除“強(qiáng)制實(shí)施密碼策略”和“用戶在下次登錄時(shí)必須更改密碼”選項(xiàng);最后為賬戶選擇默認(rèn)數(shù)據(jù)庫“chap

7、2”。圖2-4 “登錄名-新建”對(duì)話框“常規(guī)”選項(xiàng)卡(3)服務(wù)器角色節(jié)點(diǎn)不予配置。有關(guān)SQL Server服務(wù)器角色請(qǐng)參考相關(guān)資料,此處不再詳細(xì)介紹。(4)在對(duì)話框左側(cè)選項(xiàng)卡中選擇“用戶映射”節(jié)點(diǎn),如圖2-5所示,在“映射到此登錄名的用戶”列表中,勾選此前創(chuàng)建好的數(shù)據(jù)庫“chap2”,在窗體右下方的“數(shù)據(jù)庫角色成員身份”框里選擇“db_Owner”,即數(shù)據(jù)庫擁有者。圖2-5 “登錄名-新建”對(duì)話框“用戶映射”選項(xiàng)卡(5)安全對(duì)象節(jié)點(diǎn)一般不予配置。(6)在對(duì)話框左側(cè)選項(xiàng)卡中選擇“狀態(tài)”節(jié)點(diǎn),如圖2-6所示,將“是否允許連接到數(shù)據(jù)庫引擎”選項(xiàng)設(shè)為“授予”,同時(shí)將“登錄”選項(xiàng)設(shè)為“啟用”。以上各節(jié)點(diǎn)

8、配置完成后單擊【確定】按鈕,即完成了對(duì)賬戶的創(chuàng)建工作。圖2-6 “登錄名-新建”對(duì)話框“狀態(tài)配置”選項(xiàng)卡(7)新建賬戶完成后,重新連接SQL Server,如圖2-7所示,選擇SQL Server身份驗(yàn)證方式,輸入前面設(shè)置的登錄名“zd”及密碼“123”,點(diǎn)擊【連接】按鈕,即可完成登錄。登錄成功后在對(duì)象資源管理器中可看到服務(wù)器實(shí)例名后面顯示的登錄用戶名,如圖2-8所示。圖2-7 “連接到服務(wù)器”對(duì)話框 圖2-8 對(duì)象資源管理器2.2 使用ADO.NET訪問數(shù)據(jù)庫2.2.1 連接數(shù)據(jù)庫在對(duì)數(shù)據(jù)源進(jìn)行操作之前,首先需建立到數(shù)據(jù)源的連接,可使用Connection對(duì)象顯式創(chuàng)建到數(shù)據(jù)源的連接。【例2-

9、1】 設(shè)計(jì)一個(gè)Windows應(yīng)用程序,能通過“Windows驗(yàn)證“和“Windows和SQL Server混合驗(yàn)證”兩種方式建立到數(shù)據(jù)庫的連接。圖2-9 “連接數(shù)據(jù)庫”窗體控件Tab順序?qū)崿F(xiàn)過程如下。(1)新建一Windows應(yīng)用程序,命名為connection,將創(chuàng)建的默認(rèn)窗體名更名為frmConnect,窗體的Text屬性設(shè)置為“連接數(shù)據(jù)庫”,界面設(shè)計(jì)如圖2-9所示。frmConnect窗體中的主要控件,按Tab鍵順序,描述如表2-3所示。表2-3 “連接數(shù)據(jù)庫”窗體控件及說明Tab順序控件類型控件名稱說 明主要屬性屬性名屬性值0ButtonbtnConnect1Windows身份驗(yàn)證方式

10、連接數(shù)據(jù)庫TextWindows驗(yàn)證1btnConnect2混合驗(yàn)證方式連接數(shù)據(jù)庫Text混合驗(yàn)證(2)主要程序代碼說明: 本節(jié)內(nèi)所有例題代碼均需引用System.Data.SqlClient命名空間,代碼如下:using System.Data.SqlClient; /添加對(duì)SQL Server數(shù)據(jù)訪問對(duì)象的引用后續(xù)例題不再逐一說明。 由于篇幅所限,本節(jié)中所有例題的異常捕獲代碼都省略了,讀者需自行添加獲取控件輸入及訪問數(shù)據(jù)庫等處的異常捕獲代碼。雙擊【W(wǎng)indows驗(yàn)證】按鈕,進(jìn)入其Click事件處理函數(shù),代碼如下: /Windows方式連接數(shù)據(jù)庫 private void btnConnec

11、t1_Click(object sender, EventArgs e) string strConn = "server=XP-4;database=chap2;integrated security=true" /連接字符串 SqlConnection conn = new SqlConnection(strConn); /創(chuàng)建連接對(duì)象 conn.Open(); /打開連接 /如連接成功則彈出消息框提示 MessageBox.Show("數(shù)據(jù)庫已通過集成驗(yàn)證方式連接成功", "連接狀態(tài)對(duì)話框"); conn.Close(); /使

12、用完畢后關(guān)閉數(shù)據(jù)庫連接 雙擊【混合驗(yàn)證】按鈕,進(jìn)入其Click事件處理函數(shù),填寫代碼如下。 /SQL Server + Windows方式連接數(shù)據(jù)庫 private void btnConnect2_Click(object sender, EventArgs e) string strConn = "server=XP-4.;database=chap2;uid=zd;pwd=123" /連接字符串 SqlConnection conn = new SqlConnection(strConn); /創(chuàng)建連接對(duì)象 conn.Open(); /打開連接 /如連接成功則彈出消息

13、框提示 MessageBox.Show("數(shù)據(jù)庫已通過混合驗(yàn)證方式連接成功", "連接狀態(tài)對(duì)話框"); conn.Close(); /使用完畢后關(guān)閉數(shù)據(jù)庫連接 數(shù)據(jù)庫連接字符串包含要連接的數(shù)據(jù)庫的信息,如server屬性指定數(shù)據(jù)庫服務(wù)器名稱,database屬性指定數(shù)據(jù)庫名稱,使用Windows身份驗(yàn)證方式只需要給出server和database兩個(gè)屬性的值,并使用“integrated security=true”指定身份驗(yàn)證方式為Windows驗(yàn)證;當(dāng)使用混合驗(yàn)證時(shí)則需要使用uid屬性指定數(shù)據(jù)庫賬戶、pwd屬性指定該賬號(hào)的密碼。說明:上例中的連接字符

14、串中的用戶名“zd”和密碼“123”,是以本節(jié)“添加登錄賬戶”的方式創(chuàng)建的,讀者可自行修改為自己計(jì)算機(jī)的SQLServer登錄名及密碼。運(yùn)行程序,分別單擊【W(wǎng)indows驗(yàn)證】和【混合驗(yàn)證】兩個(gè)按鈕,如連接成功,將分別彈出不同的連接狀態(tài)對(duì)話框,如圖2-10所示。 圖2-10 連接狀態(tài)對(duì)話框2.2.2 對(duì)數(shù)據(jù)庫進(jìn)行添加、修改及刪除操作在創(chuàng)建好到數(shù)據(jù)庫的連接之后,可以使用Command對(duì)象對(duì)數(shù)據(jù)庫進(jìn)行更新操作。【例2-2】設(shè)計(jì)一個(gè)Windows應(yīng)用程序,能實(shí)現(xiàn)對(duì)數(shù)據(jù)庫表的添加、修改及刪除操作。實(shí)現(xiàn)過程:(1)新建一Windows應(yīng)用程序,命名為operateData,將創(chuàng)建的默認(rèn)窗體名更名為frm

15、Command,窗體的Text屬性設(shè)置為“對(duì)數(shù)據(jù)庫執(zhí)行添加、修改及刪除操作”,界面設(shè)計(jì)如圖2-11所示。frmCommand窗體中的主要控件,按Tab鍵順序,描述如表2-4所示。圖2-11 “對(duì)數(shù)據(jù)庫進(jìn)行添加、修改及刪除操作”窗體Tab順序視圖表2-4 “對(duì)數(shù)據(jù)庫執(zhí)行添加、修改及刪除操作”窗體控件及說明Tab順序控件類型控件名稱說 明主要屬性屬性名屬性值0ButtonbtnInsert向數(shù)據(jù)庫表添加一條記錄Text添加1btnUpdate修改數(shù)據(jù)庫表中的記錄Text修改2btnDelete刪除數(shù)據(jù)庫表中的記錄Text刪除(2)主要程序代碼 雙擊【添加】按鈕,進(jìn)入其Click事件處理函數(shù),代碼如

16、下。 /【添加】按鈕單擊事件處理函數(shù) private void btnInsert_Click(object sender, EventArgs e) string strConn = "server=XP-4;database=chap2;integrated security=true" /連接字符串 SqlConnection conn = new SqlConnection(strConn); /聲明并創(chuàng)建連接對(duì)象 conn.Open(); /打開數(shù)據(jù)庫連接 /向商品表插入一條新記錄 string strSql="insert into Products

17、values('0012','雙層蒸鍋','蘇泊爾集團(tuán)','廚具',129.9,100,'false')" SqlCommand comm = new SqlCommand(strSql, conn); /聲明并創(chuàng)建命令對(duì)象 int row = comm.ExecuteNonQuery(); /執(zhí)行SQL語句,并獲取受影響的行數(shù) if (row > 0) /如果記錄插入成功,則彈出消息框提示 MessageBox.Show("插入數(shù)據(jù)成功", "操作狀態(tài)對(duì)話框"

18、;); conn.Close(); /關(guān)閉數(shù)據(jù)庫連接 雙擊【修改】按鈕,進(jìn)入其Click事件處理函數(shù),代碼如下。 /【修改】按鈕單擊事件處理函數(shù) private void btnUpdate_Click(object sender, EventArgs e) string strConn = "server=XP-4;database=chap2;integrated security=true" SqlConnection conn = new SqlConnection(strConn); conn.Open(); /修改商品表中的一條記錄 string strSql

19、= "update Products set UnitsInStock=500 where ProductID='0012'" SqlCommand comm = new SqlCommand(strSql, conn); int row = comm.ExecuteNonQuery(); if (row > 0) MessageBox.Show("修改數(shù)據(jù)成功", "操作狀態(tài)對(duì)話框"); conn.Close(); 雙擊【刪除】按鈕,進(jìn)入其Click事件處理函數(shù),代碼如下。 /【刪除】按鈕單擊事件處理函數(shù) pr

20、ivate void btnDelete_Click(object sender, EventArgs e) string strConn = "server=XP-4;database=chap2;integrated security=true" SqlConnection conn = new SqlConnection(strConn); conn.Open(); /刪除商品表中的一條記錄 string strSql = "delete from Products where ProductID='0012'" SqlComman

21、d comm = new SqlCommand(strSql, conn); int row = comm.ExecuteNonQuery(); if (row > 0) MessageBox.Show("刪除數(shù)據(jù)成功", "操作狀態(tài)對(duì)話框"); conn.Close(); 運(yùn)行程序,分別單擊【添加】、【修改】和【刪除】按鈕,如操作成功,將分別彈出不同的操作狀態(tài)對(duì)話框,如圖2-12所示。對(duì)于數(shù)據(jù)庫記錄的修改情況,讀者可同時(shí)從SQL Server管理控制臺(tái)訪問數(shù)據(jù)庫chap2的Products表進(jìn)行驗(yàn)證。 圖2-12 操作狀態(tài)對(duì)話框2.2.3 查詢數(shù)

22、據(jù)庫中的數(shù)據(jù)【例2-3】設(shè)計(jì)一個(gè)Windows應(yīng)用程序,使用DataReader查詢數(shù)據(jù)庫中的信息并加載到ComboBox控件的選項(xiàng)中。實(shí)現(xiàn)過程:(1)新建一Windows應(yīng)用程序,命名為testDataReader,將創(chuàng)建的默認(rèn)窗體名更名為frmProducts,窗體的Text屬性設(shè)置為“商品類別及名稱”,界面設(shè)計(jì)如圖2-13所示。frmProducts窗體中的主要控件,按Tab鍵順序,描述如表2-5所示。圖2-13 “商品類別及名稱”窗體Tab鍵順序視圖表2-5 “商品類別及名稱”窗體控件及說明Tab順序控件類型控件名稱說 明主要屬性屬性名屬性值0ComboBoxcomboCategory

23、所有商品類別名稱DropDownStyleDropDownList1comboProducts某商品類別下的商品名稱DropDownStyleDropDownList說明:界面中不參與編程的Label控件不再進(jìn)行說明,以下各例題均同樣處理。(2)主要程序代碼 雙擊窗體標(biāo)題欄,進(jìn)入Load事件處理函數(shù),訪問數(shù)據(jù)庫,為“商品類別”下拉框加載數(shù)據(jù),代碼如下。 /窗體加載事件處理函數(shù),為“商品類別”組合框加載所有的商品類別數(shù)據(jù) private void frmProducts_Load(object sender, EventArgs e) string strConn = "server=

24、XP-4;database=chap2;integrated security=true"/連接字符串 SqlConnection conn = new SqlConnection(strConn); /聲明并創(chuàng)建連接對(duì)象 conn.Open(); /打開數(shù)據(jù)庫連接 string strSql = "select distinct CategoryName from Products" /查詢 SqlCommand comm = new SqlCommand(strSql, conn); SqlDataReader dr = comm.ExecuteReader(

25、); while (dr.Read() comboCategory.Items.Add(dr0); /依次加載數(shù)據(jù)項(xiàng)至ComboBox dr.Close(); conn.Close(); 雙擊商品類別下拉框,進(jìn)入其SelectedIndexChanged事件處理函數(shù),根據(jù)其選項(xiàng)為“商品名稱”下拉框加載數(shù)據(jù),代碼如下。 /“商品類別”下拉框選項(xiàng)索引變化事件處理函數(shù), /根據(jù)商品類別下拉框中的選項(xiàng)加載該類別下的所有的商品名稱 private void comboCategory_SelectedIndexChanged(object sender, EventArgs e) comboProduc

26、ts.Items.Clear(); string strConn = "server=XP-4;database=chap2;integrated security=true" SqlConnection conn = new SqlConnection(strConn); conn.Open(); string strSql = "select ProductName from Products where CategoryName='"+comboCategory.Text+"'" SqlCommand comm

27、= new SqlCommand(strSql, conn); SqlDataReader dr = comm.ExecuteReader(); while (dr.Read() comboProducts.Items.Add(dr0); dr.Close(); conn.Close(); 【例2-4】 使用DataAdaper和DataSet對(duì)象查詢數(shù)據(jù)庫中的信息并加載到ComboBox控件的選項(xiàng)中。實(shí)現(xiàn)過程:(1)新建一Windows應(yīng)用程序,命名為dataSet,將創(chuàng)建的默認(rèn)窗體名更名為frmProducts,窗體及各主要控件的屬性設(shè)置同例2-3。(2)主要程序代碼 雙擊窗體標(biāo)題欄,進(jìn)入

28、其Load事件處理函數(shù),訪問數(shù)據(jù)庫,為“商品類別”下拉框加載數(shù)據(jù),代碼如下。 /窗體加載事件處理函數(shù),為“商品類別”組合框加載所有的商品分類數(shù)據(jù)。 private void frmProducts_Load(object sender, EventArgs e) string strConn = "server=XP-4;database=chap2;integrated security=true" /連接字符串 SqlConnection conn = new SqlConnection(strConn); /聲明并創(chuàng)建連接對(duì)象 string strSql = &quo

29、t;select distinct CategoryName from Products" /查詢不重復(fù)的商品類別名稱 SqlDataAdapter da = new SqlDataAdapter(strSql, conn); /聲明并創(chuàng)建數(shù)據(jù)適配器對(duì)象 DataSet ds = new DataSet(); /聲明并創(chuàng)建數(shù)據(jù)集對(duì)象 da.Fill(ds); /使用數(shù)據(jù)適配器填充數(shù)據(jù)集 comboCatagory.DataSource = ds.Tables0; /設(shè)置商品類別下拉框數(shù)據(jù)源 comboCatagory.DisplayMember = "CategoryNam

30、e" /設(shè)置商品類別下拉框的顯示屬性 雙擊“商品類別”下拉框,進(jìn)入其SelectedIndexChanged事件處理函數(shù),根據(jù)其選中項(xiàng)為“商品名稱”下拉框加載數(shù)據(jù),代碼如下。 /“商品類別”下拉框選項(xiàng)索引變化事件處理函數(shù), /根據(jù)商品類別下拉框中的選項(xiàng)加載該類別下的所有的商品名稱 private void comboCatagory_SelectedIndexChanged(object sender, EventArgs e) string strConn = "server=XP-4;database=chap2;integrated security=true&quo

31、t; SqlConnection conn = new SqlConnection(strConn); /根據(jù)“商品類別”下拉框中的選項(xiàng)查詢商品名稱 string strSql="select ProductName from Products where CategoryName='"+comboCategory.Text+"'" SqlDataAdapter da = new SqlDataAdapter(strSql, conn); DataSet ds = new DataSet(); da.Fill(ds); comboProd

32、ucts.DataSource = ds.Tables0; /設(shè)置商品名稱下拉框的數(shù)據(jù)源 comboProducts.DisplayMember = "ProductName" /設(shè)置商品名稱下拉框的顯示屬性 思考:細(xì)心的同學(xué)會(huì)發(fā)現(xiàn),例2-3和例2-4雖然運(yùn)行界面完全相同,但是窗體加載之后列表框中選項(xiàng)的情況是有區(qū)別的。那么,區(qū)別在哪呢?原因又是什么呢?2.2.4 數(shù)據(jù)綁定控件【例2-5】 設(shè)計(jì)一個(gè)Windows應(yīng)用程序,能實(shí)現(xiàn)商品信息的維護(hù)。本例題中,程序要讀取數(shù)據(jù)庫中的數(shù)據(jù),加載數(shù)據(jù)至ListBox和ComboBox控件,并根據(jù)用戶在ListBox控件中選擇的數(shù)據(jù)項(xiàng)再次訪

33、問數(shù)據(jù)庫,獲取相關(guān)記錄。另外,本例題還實(shí)現(xiàn)了對(duì)商品表Products的增加、修改及刪除操作。圖2-14 “商品信息管理”窗體Tab鍵順序視圖實(shí)現(xiàn)過程:(1)新建一Windows應(yīng)用程序,命名為products,將創(chuàng)建的默認(rèn)窗體名更名為frmProducts,窗體的Text屬性設(shè)置為“商品信息管理”,界面設(shè)計(jì)如圖2-14所示。frmProducts窗體中的主要控件,按Tab鍵順序,描述如表2-6所示。表2-6 “商品信息管理”窗體控件及說明Tab順序控件類型控件名稱說 明主要屬性屬性名屬性值0TextBoxtxtID輸入和顯示商品編號(hào)ReadonlyTrue1txtName輸入和顯示商品名稱Re

34、adonlyTrue2txtSupplier輸入和顯示供應(yīng)商名稱ReadonlyTrue3ComboBoxcomboCategory輸入和顯示商品類別EnabledFalse4TextBoxtxtUnitPrice輸入和顯示商品單價(jià)ReadonlyTrue5txtUnitsInStock輸入和顯示庫存數(shù)量ReadonlyTrue6CheckBoxchkDisc輸入和顯示是否打折EnabledFalse7ButtonbtnInsert添加商品EnabledTrue8btnUpdate修改商品EnabledTrue9btnSave保存數(shù)據(jù)EnabledFalse10btnCancle取消編輯Ena

35、bledFalse11btnDelete刪除數(shù)據(jù)EnabledTrue12ListBoxlstProducts商品名稱列表EnabledTrue(2)主要程序代碼 首先要為該程序添加兩個(gè)成員變量,代碼如下: string strConn = "server=XP-4;database=chap2;integrated security=true" /連接字符串 string insertORupdate = "" /標(biāo)識(shí)變量,用來記錄要保存的是添加還是修改操作 自定義方法DataLoad(),訪問數(shù)據(jù)庫,加載商品類別列表及商品名稱列表,代碼如下。 / &

36、lt;summary> / 訪問數(shù)據(jù)庫,加載商品類別列表及商品名稱列表 / </summary> void DataLoad() /以下代碼使用DataReader訪問數(shù)據(jù)庫 SqlConnection conn = new SqlConnection(strConn); /創(chuàng)建連接對(duì)象 conn.Open(); /打開連接 string strSql = "select distinct CategoryName from Products" /查詢不重復(fù)的商品類別名 SqlCommand comm = new SqlCommand(strSql, co

37、nn); /聲明并創(chuàng)建命令對(duì)象 SqlDataReader dr = comm.ExecuteReader(); /執(zhí)行查詢,用DataReader存放數(shù)據(jù) while (dr.Read() /如果查詢到數(shù)據(jù) comboCategory.Items.Add(dr0); /逐項(xiàng)加載商品類別名至ComboBox dr.Close(); /關(guān)閉dataReader /以下代碼使用DataAdapter和DataSet訪問數(shù)據(jù)庫 strSql = "select ProductName,ProductID from Products" /查詢商品名稱及商品編號(hào) SqlDataAda

38、pter da = new SqlDataAdapter(strSql, conn); /聲明并創(chuàng)建數(shù)據(jù)適配器對(duì)象 DataSet ds = new DataSet(); /聲明并創(chuàng)建數(shù)據(jù)集對(duì)象 da.Fill(ds); /填充數(shù)據(jù)集 lstProducts.DataSource = ds.Tables0; /設(shè)置商品名稱列表的數(shù)據(jù)源 lstProducts.DisplayMember = "ProductName" /設(shè)置顯示值屬性 lstProducts.ValueMember = "ProductID" /設(shè)置實(shí)際值屬性 conn.Close();

39、 /關(guān)閉連接 lstProducts.SelectedIndex = -1; /使商品名稱列表沒有選中項(xiàng) 商品管理窗體的Load事件處理函數(shù),就是調(diào)用DataLoad()方法,代碼如下。 /窗體加載事件處理函數(shù) private void frmProducts _Load(object sender, EventArgs e) DataLoad(); 聲明自定義方法controlEnabled(),控制各輸入控件在“查看”和“編輯”操作時(shí)的可用性,代碼如下。/自定義方法,控制控件的可用性,將控件可用性分為“查看”和“編輯”兩種狀態(tài) public void controlEnabled(stri

40、ng status) if (status = "show") /當(dāng)前為查看數(shù)據(jù)狀態(tài),控件都不可編輯 btnInsert.Enabled = true; btnUpdate.Enabled = true; btnSave.Enabled = false; btnCancle.Enabled = false; btnDelete.Enabled = true; chkDisc.Enabled = false; comboCategory.Enabled = false; foreach (Control c in this.Controls) if (c is TextBox

41、) TextBox txtb = (TextBox)c); txtb.ReadOnly = true; else /當(dāng)前為編輯數(shù)據(jù)狀態(tài),控件可用 btnInsert.Enabled = false; btnUpdate.Enabled = false; btnSave.Enabled = true; btnCancle.Enabled = true; btnDelete.Enabled = false; chkDisc.Enabled = true; comboCategory.Enabled = true; foreach (Control c in this.Controls) if (c

42、 is TextBox) TextBox txtb = (TextBox)c); txtb.ReadOnly = false; 雙擊lstProducts控件,進(jìn)入其選項(xiàng)索引變化事件處理函數(shù),根據(jù)選擇的商品,查詢?cè)撋唐菲渌畔?,并為界面其他控件賦值,代碼如下。 /商品名稱列表選項(xiàng)索引變化事件,根據(jù)選擇的商品名稱加載商品其他信息 private void lstProducts_SelectedIndexChanged(object sender, EventArgs e) /用來判斷用戶是否選中了有效的選項(xiàng),且保證是數(shù)據(jù)加載后用戶進(jìn)行的操作 if (lstProducts.SelectedIn

43、dex != -1)&&(lstProducts.SelectedValue.ToString()!="System.Data.DataRowView") string proId = lstProducts.SelectedValue.ToString(); /獲取當(dāng)前選中商品的商品編號(hào) SqlConnection conn=new SqlConnection(strConn); /聲明并創(chuàng)建連接對(duì)象 conn.Open(); /打開數(shù)據(jù)庫連接 string strSql="select * from Products where Product

44、Id='"+proId+"'" /由商品編號(hào)查詢?cè)撋唐菲渌畔?SqlCommand comm=new SqlCommand(strSql,conn); /聲明并創(chuàng)建命令對(duì)象 SqlDataReader dr = comm.ExecuteReader(); /使用DataReader獲取查詢結(jié)果 if (dr.Read() /如果查詢到數(shù)據(jù),就將該商品各字段的值賦予窗體各控件用以顯示 txtID.Text = dr"ProductID".ToString(); txtName.Text=dr"ProductName&q

45、uot;.ToString(); txtSupplier.Text=dr"SupplierName".ToString(); comboCategory.Text = dr"CategoryName".ToString(); txtUnitPrice.Text=dr"UnitPrice".ToString(); txtUnitsInStock.Text=dr"UnitsInStock".ToString(); chkDisc.Checked = (dr"Discount".ToString()=

46、"True"?true:false; dr.Close(); /關(guān)閉DataReader conn.Close(); /關(guān)閉連接 controlEnabled("show"); /將控件設(shè)置為查看狀態(tài) 說明:由于為ListBox控件加載選項(xiàng)時(shí)會(huì)觸發(fā)SelectedIndexChanged事件,此時(shí)獲取到的ListBox.SelectedValue.ToString()值為“System.Data.DataRowView”,而不是經(jīng)用戶選擇過的商品編號(hào),程序需過濾掉這種情況。只有完成ListBox控件的選項(xiàng)加載后,經(jīng)用戶選擇某條商品數(shù)據(jù)時(shí),程序才進(jìn)行后續(xù)操

47、作,如下代碼即可實(shí)現(xiàn)這種過濾功能。 if (lstProducts.SelectedIndex != -1)&&(lstProducts.SelectedValue.ToString()!="System.Data.DataRowView") 雙擊btnInsert按鈕,進(jìn)入其Click事件處理函數(shù),清空所有輸入控件并使其為可編輯狀態(tài),設(shè)置編輯狀態(tài)為insert,真正的插入操作在btnSave的Click事件處理函數(shù)中進(jìn)行。代碼如下。/【添加】按鈕單擊事件處理函數(shù)private void btnInsert_Click(object sender, Even

48、tArgs e) insertORupdate = "insert" /設(shè)置標(biāo)識(shí)變量為添加操作 controlEnabled("edit"); /將控件設(shè)置為編輯狀態(tài) /清空所有控件 foreach (Control c in this.Controls) if (c is TextBox) TextBox txtb = (TextBox)c); txtb.Text = "" comboCategory.SelectedIndex = -1; chkDisc.Checked = false; 雙擊btnUpdate按鈕,進(jìn)入其Clic

49、k事件處理函數(shù),使各輸入控件為可編輯狀態(tài),設(shè)置編輯狀態(tài)為update,真正的修改操作在btnSave的Click事件處理函數(shù)中進(jìn)行。代碼如下。/【修改】按鈕單擊事件處理函數(shù)private void btnUpdate_Click(object sender, EventArgs e) controlEnabled("edit"); txtID.ReadOnly = true; /商品編號(hào)不能修改 insertORupdate = "update" /設(shè)置標(biāo)志變量為修改操作 雙擊btnSave按鈕,進(jìn)入其Click事件處理函數(shù),根據(jù)編輯狀態(tài)對(duì)數(shù)據(jù)庫進(jìn)行in

50、sert或update操作,代碼如下。/【保存】按鈕單擊事件處理函數(shù),完成添加和修改操作private void btnSave_Click(object sender, EventArgs e) SqlConnection conn = new SqlConnection(strConn); /聲明并創(chuàng)建連接對(duì)象 conn.Open(); /打開數(shù)據(jù)庫連接 /下面一段代碼將保存添加的商品數(shù)據(jù) if (insertORupdate = "insert") string strSql = "insert into Products values(ProductID,

51、ProductName,SupplierName,CategoryName,UnitPrice,UnitsInStock,Discount)" SqlCommand comm = new SqlCommand(strSql, conn); comm.Parameters.Add(new SqlParameter("ProductID", txtID.Text); comm.Parameters.Add(new SqlParameter("ProductName", txtName.Text); comm.Parameters.Add(new SqlParameter("SupplierName", txtSupplier.Text); comm.Parameters.Add(new SqlParameter("CategoryName", comboCategory.Text); comm.Parameters.A

溫馨提示

  • 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)論