




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、SQL 數(shù) 據(jù) 庫(kù) 操 作 步 驟及代碼第2章數(shù)據(jù)庫(kù)高級(jí)編程ADO.NET 是為.NET 框架而創(chuàng)建的,是對(duì) ADO (ActiveX Data Objects)對(duì) 象模型的擴(kuò)充。ADO.NET提供了一組數(shù)據(jù)訪問服務(wù)的類,可用于對(duì)MicrosoftSQL Server、Oracle等數(shù)據(jù)源的一致訪問。 ADO.NET模型分為.NET Data Provider (數(shù)據(jù)提供程序)和DataSet數(shù)據(jù)集(數(shù)據(jù)處理的核心)兩大主要部 分。.NET數(shù)據(jù)提供程序提供了四個(gè)核心對(duì)象,分別是Co nn ection、Comma nd、DataReade和DataAdapter對(duì)象。功能如表2-1所示。表2-
2、1 ADO.NET核心對(duì)象對(duì)象功能Connection提供和數(shù)據(jù)源的連接功能Comma nd提供訪問數(shù)據(jù)庫(kù)命令,執(zhí)行查詢數(shù)據(jù)或修改數(shù)據(jù)的功能,例如 運(yùn)行SQL命令和存儲(chǔ)過程等DataReader從數(shù)據(jù)源中讀取只向前的且只讀的數(shù)據(jù)流DataAdapter是DataSet對(duì)象和數(shù)據(jù)源間的橋梁。DataAdapter使用4個(gè)Comma nd對(duì)象來運(yùn)行查詢、新建、修改、刪除的 SQL命令,把數(shù)據(jù)力n載到 DataSet丿 或者把 DataSet內(nèi)的數(shù)據(jù)送冋數(shù)據(jù)源2.1 SQL Server相關(guān)配置在使用C#訪問數(shù)據(jù)庫(kù)之前,首先創(chuàng)建一個(gè)名為“ chap2'的數(shù)據(jù)庫(kù),此數(shù)據(jù)庫(kù) 作為2.1節(jié)及2.2
3、節(jié)中例題操作的默認(rèn)數(shù)據(jù)庫(kù)。然后創(chuàng)建數(shù)據(jù)表 Products,表結(jié) 構(gòu)如表2-2所示。創(chuàng)建完畢后可錄入初始化數(shù)據(jù)若干條。表2-2 Products表表結(jié)構(gòu)序號(hào)列名字段說明數(shù)據(jù)類型長(zhǎng)度主鍵允許空1ProductID商品編號(hào)char4主鍵否2ProductName商品名稱nvarchar40否3SupplierName供應(yīng)商名稱nvarchar40否4CategoryName商品類別名稱nvarchar40否5UnitPrice單價(jià)money否6UnitsInStock庫(kù)存量smallint否7Discount是否折扣char1否F面首先介紹幾個(gè)SQL Server 2012的常用操作。這些操作都是
4、初學(xué)者在實(shí)踐環(huán)節(jié)及上機(jī)課的操作中出現(xiàn)問題較多的地方。1 身份驗(yàn)證方式SQL Server 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)卡,如圖-1所示。圖2-1 “服務(wù)器屬性”對(duì)話框-“安全性”選項(xiàng)卡在“服務(wù)器身份驗(yàn)證”部分選擇SQL Server和
5、Windows身份驗(yàn)證模式”選項(xiàng), 并單擊【確定】按鈕。系統(tǒng)將提示需要重新啟動(dòng) SQL 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ù)庫(kù) 服務(wù)器,而在實(shí)際工作環(huán)境中使用 sa賬號(hào)登錄服務(wù)器是不合理的。因?yàn)楹芏嗲?況下系統(tǒng)的數(shù)據(jù)庫(kù)是部署在租用的數(shù)據(jù)庫(kù)服務(wù)器上的,此時(shí)數(shù)據(jù)庫(kù)設(shè)計(jì)人員或 編程人員都不可能具有
6、sa賬號(hào)的使用權(quán)限,因此在將身份驗(yàn)證方式修改為SQLServer和Windows混合驗(yàn)證后,需要為某應(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)證方式選為SQLServer身份驗(yàn)證”,為新建賬戶設(shè)置密碼為“ 123”,同時(shí)去除
7、“強(qiáng)制實(shí)施密碼策略” 和“用戶在下次登錄時(shí)必須更改密碼”選項(xiàng);最后為賬戶選擇默認(rèn)數(shù)據(jù)庫(kù)“hap2'。圖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ù)庫(kù)“ chap2',在窗體右下方的“數(shù)據(jù)庫(kù)角色成員身份”框里選擇db_Owner”,即數(shù)據(jù)庫(kù)擁有者。圖2-5“登錄名-新建”對(duì)話框“用戶映射”選項(xiàng)卡(5)安全對(duì)象節(jié)點(diǎn)一般不予配置。(6)在對(duì)話框左側(cè)選項(xiàng)卡中選擇“狀態(tài)”
8、節(jié)點(diǎn),如圖2-6所示,將“是否允許連接到數(shù)據(jù)庫(kù)引擎”選項(xiàng)設(shè)為“授予”,同時(shí)將“登錄”選項(xiàng)設(shè)為“啟用”。以上各節(jié)點(diǎn) 配置完成后單擊【確定】按鈕,即完成了對(duì)賬戶的創(chuàng)建工作圖2-6“登錄名-新建”對(duì)話框“狀態(tài)配置”選項(xiàng)卡(7)新建賬戶完成后,重新連接 SQL Server,如圖2-7所示,選擇SQLServer身份驗(yàn)證方式,輸入前面設(shè)置的登錄名“ zd”及密碼123”,點(diǎn)擊【連接】按鈕,即可完成登錄。登錄成功后在對(duì)象資源管理器中可看到服務(wù)器實(shí)例名后 面顯示的登錄用戶名,如圖2-8所示SQL Server :二土tjI出逛名獻(xiàn)RSf t4J.Id-曲口mAWfH14BJJ»圖2-8對(duì)象資源管
9、理器圖2-7 “連接到服務(wù)器”對(duì)話框2.2使用ADO.NET訪問數(shù)據(jù)庫(kù)2.2.1連接數(shù)據(jù)庫(kù)在對(duì)數(shù)據(jù)源進(jìn)行操作之前,首先需建立到數(shù)據(jù)源的連接,可使用Conn ection對(duì)象顯式創(chuàng)建到數(shù)據(jù)源的連接?!纠?-1】 設(shè)計(jì)一個(gè) Windows應(yīng)用程序,能通過“Windows驗(yàn)證“和Windows和SQL Server混合驗(yàn)證”兩種方式建立到數(shù)據(jù)庫(kù)的連接。圖2-9 “連接數(shù)據(jù)庫(kù)”窗體控件 Tab順序?qū)崿F(xiàn)過程如下。(1)新建一 Windows應(yīng)用程序,命名為connection,將創(chuàng)建的默認(rèn)窗體名 更名為frmConnect,窗體的Text屬性設(shè)置為“連接數(shù)據(jù)庫(kù)”,界面設(shè)計(jì)如圖2-9 所示。frmConn
10、ect窗體中的主要控件,按Tab鍵順序,描述如表2-3所示。表2-3 “連接數(shù)據(jù)庫(kù)”窗體控件及說明Tab順序控件類型控件名稱說明主要屬性屬性名屬性值0ButtonbtnConnect1Windows身份驗(yàn)證方式連接數(shù)據(jù)庫(kù)TextWindows 驗(yàn)證1btnConnect2混合驗(yàn)證方式連接數(shù)據(jù)庫(kù)Text混合驗(yàn)證(2)主要程序代碼說明:本節(jié)內(nèi)所有例題代碼均需引用 System.Data.SqlClient命名空間,代碼如下:using System.Data.SqlClient; /添加對(duì) SQL Server 數(shù)據(jù)訪問對(duì)象的引用后續(xù)例題不再逐一說明。 由于篇幅所限,本節(jié)中所有例題的異常捕獲代碼都
11、省略了,讀者需自行添加獲取控件輸入及訪問數(shù)據(jù)庫(kù)等處的異常捕獲代碼。雙擊【W(wǎng)in dows驗(yàn)證】按鈕,進(jìn)入其 Click事件處理函數(shù),代碼如下:/Windows方式連接數(shù)據(jù)庫(kù)private void btnConnect1_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()
12、;/ 打開連接/如連接成功則彈岀消息框提示MessageBox.Show(”數(shù)據(jù)庫(kù)已通過集成驗(yàn)證方式連接成功",”連接狀態(tài)對(duì)話框");conn.Close();/使用完畢后關(guān)閉數(shù)據(jù)庫(kù)連接雙擊【混合驗(yàn)證】按鈕,進(jìn)入其 Click事件處理函數(shù),填寫代碼如下。/SQL Server + Windows方式連接數(shù)據(jù)庫(kù)private void btnConnect2_Click(object sender, EventArgs e)string strConn = "server=XP-4.;database=chap2;uid=zd;pwd=123" / 連接字
13、符串SqlConnection conn = new SqlConnection(strConn); / 創(chuàng)建連接對(duì)象conn.Open(); / 打開連接/如連接成功則彈岀消息框提示MessageBox.Show(”數(shù)據(jù)庫(kù)已通過混合驗(yàn)證方式連接成功",”連接狀態(tài)對(duì)話框");conn.Close();/使用完畢后關(guān)閉數(shù)據(jù)庫(kù)連接數(shù)據(jù)庫(kù)連接字符串包含要連接的數(shù)據(jù)庫(kù)的信息,如server屬性指定數(shù)據(jù)庫(kù)服務(wù)器名稱,database屬性指定數(shù)據(jù)庫(kù)名稱,使用Win dows身份驗(yàn)證方式只需要給出server和 database兩個(gè)屬性的值,并使用“ integrated securit
14、y=true"指定身 份驗(yàn)證方式為 Windows驗(yàn)證;當(dāng)使用混合驗(yàn)證時(shí)則需要使用uid屬性指定數(shù)據(jù)庫(kù)賬戶、pwd屬性指定該賬號(hào)的密碼。說明:上例中的連接字符串中的用戶名“ zd”和密碼“3”,是以本節(jié)“添加登 錄賬戶”的方式創(chuàng)建的,讀者可自行修改為自己計(jì)算機(jī)的SQLServer登錄名及密運(yùn)行程序,分別單擊【W(wǎng)indows驗(yàn)證】和【混合驗(yàn)證】?jī)蓚€(gè)按鈕,如連接成功,將分別彈出不同的連接狀態(tài)對(duì)話框,如圖2-10所示?;?cǎi)鈲苟f阪荃二石77宜實(shí)疋H唏 盂E團(tuán)曲諂駐皿式垂接就口圖2-10連接狀態(tài)對(duì)話框222對(duì)數(shù)據(jù)庫(kù)進(jìn)行添加、修改及刪除操作在創(chuàng)建好到數(shù)據(jù)庫(kù)的連接之后,可以使用Comma nd對(duì)
15、象對(duì)數(shù)據(jù)庫(kù)進(jìn)行更新操作?!纠?-2】設(shè)計(jì)一個(gè)Windows應(yīng)用程序,能實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)表的添加、修改 及刪除操作。實(shí)現(xiàn)過程:(1)新建一 Windows應(yīng)用程序,命名為operateData將創(chuàng)建的默認(rèn)窗體名更名為frmCommand,窗體的Text屬性設(shè)置為“對(duì)數(shù)據(jù)庫(kù)執(zhí)行添加、修改及刪 除操作”,界面設(shè)計(jì)如圖2-11所示。frmCommand窗體中的主要控件,按Tab鍵 順序,描述如表2-4所示。圖2-11“對(duì)數(shù)據(jù)庫(kù)進(jìn)行添加、修改及刪除操作”窗體Tab順序視圖表2-4 “對(duì)數(shù)據(jù)庫(kù)執(zhí)行添加、修改及刪除操作”窗體控件及說明Tab順序控件類型控件名稱說明主要屬性屬性名屬性值0Buttonbtnlnse
16、rt向數(shù)據(jù)庫(kù)表添加一條記錄Text添加1btnUpdate修改數(shù)據(jù)庫(kù)表中的記錄Text修改2btnDelete刪除數(shù)據(jù)庫(kù)表中的記錄Text刪除(2)主要程序代碼 雙擊【添加】按鈕,進(jìn)入其 Click事件處理函數(shù),代碼如下。/【添加】按鈕單擊事件處理函數(shù)private void btnlnsert_Click(object sender, EventArgs e)string strConn = "server=XP-4;database=chap2;integrated security=true" / 連接字符串SqlConnection conn = new SqlCo
17、nnection(strConn); / 聲明并創(chuàng)建連接對(duì)象conn.Open(); /打開數(shù)據(jù)庫(kù)連接/向商品表插入一條新記錄string strSql="insert into Products values('0012','雙層蒸鍋蘇泊爾集團(tuán)','廚具',129.9,100,'false')"SqlCommand comm = new SqlCommand(strSql, conn); / 聲明并創(chuàng)建命令對(duì)象int row = comm.ExecuteNonQuery(); /執(zhí)行SQL語句,并獲取受影響的
18、行數(shù)if (row > 0) /如果記錄插入成功,則彈出消息框提示MessageBox.Show(”插入數(shù)據(jù)成功","操作狀態(tài)對(duì)話框”);conn.Close(); /關(guān)閉數(shù)據(jù)庫(kù)連接 雙擊【修改】按鈕,進(jìn)入其 Click事件處理函數(shù),代碼如下。/【修改】按鈕單擊事件處理函數(shù)private void btnUpdate_Click(object sender, EventArgs e)string strConn = "server=XP-4;database=chap2;integrated security=true"SqlConnection
19、conn = new SqlConnection(strConn);conn.Open();/修改商品表中的一條記錄string strSql = "update Products set UnitsInStock=500 where ProductlD='0012";SqlCommand comm = new SqlCommand(strSql, conn);int row = comm.ExecuteNonQuery();if (row > 0)MessageBox.Show(”修改數(shù)據(jù)成功","操作狀態(tài)對(duì)話框”);conn.Close
20、(); 雙擊【刪除】按鈕,進(jìn)入其 Click事件處理函數(shù),代碼如下。/【刪除】按鈕單擊事件處理函數(shù)private 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
21、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();運(yùn)行程序,分別單擊【添加】、【修改】和【刪除】按鈕,如操作成功, 將分別彈出不同的操作狀態(tài)對(duì)話框,如圖2-12所示。對(duì)于數(shù)據(jù)庫(kù)記錄的修改情況,讀者可同時(shí)從SQL Server管理控制臺(tái)訪問數(shù)據(jù)庫(kù)chap2的Product
22、s表進(jìn)行 驗(yàn)證。損作狀態(tài)對(duì)話框斗圖2-12操作狀態(tài)對(duì)話框2.2.3查詢數(shù)據(jù)庫(kù)中的數(shù)據(jù)【例2-3】設(shè)計(jì)一個(gè) Windows應(yīng)用程序,使用DataReade查詢數(shù)據(jù)庫(kù)中的信息并加載到ComboBox控件的選項(xiàng)中。實(shí)現(xiàn)過程:(1)新建一 Windows應(yīng)用程序,命名為testDataReade,將創(chuàng)建的默認(rèn)窗體名更名為frmProducts,窗體的Text屬性設(shè)置為“商品類別及名稱”,界面設(shè)計(jì)如圖2-13所示。frmProducts窗體中的主要控件,按Tab鍵順序,描述如表2-5 所示。圖2-13 “商品類別及名稱”窗體 Tab鍵順序視圖表2-5“商品類別及名稱”窗體控件及說明Tab順序控件類型控件
23、名稱說明主要屬性屬性名屬性值0ComboBoxcomboCategory所有商品類別名稱DropDownStyleDropDownList1comboProducts某商品類別下的商品名稱DropDownStyleDropDownList說明:界面中不參與編程的Label控件不再進(jìn)行說明,以下各例題均同樣處(2)主要程序代碼雙擊窗體標(biāo)題欄,進(jìn)入Load事件處理函數(shù),訪問數(shù)據(jù)庫(kù),為“商品類別”下拉框加載數(shù)據(jù),代碼如下/窗體加載事件處理函數(shù),為“商品類別”組合框加載所有的商品類別數(shù)據(jù)private void frmProducts_Load(object sender, EventArgs e)s
24、tring strConn = "server=XP-4;database=chap2;integrated security=true" 連接字符串SqlConnection conn = new SqlConnection(strConn); / 聲明并創(chuàng)建連接對(duì)象conn.Open(); /打開數(shù)據(jù)庫(kù)連接string strSql = "select distinct CategoryName from Products" / 查詢SqlCommand comm = new SqlCommand(strSql, conn);SqlDataReade
25、r dr = comm.ExecuteReader();while (dr.Read()comboCategory.ltems.Add(drO); / 依次加載數(shù)據(jù)項(xiàng)至 ComboBoxdr.Close();conn.Close();雙擊商品類別下拉框,進(jìn)入其 Selected In dexCha nge(事件處理函數(shù),根據(jù)其選項(xiàng)為“商品名稱”下拉框加載數(shù)據(jù),代碼如下/ “商品類別”下拉框選項(xiàng)索引變化事件處理函數(shù),/根據(jù)商品類別下拉框中的選項(xiàng)加載該類別下的所有的商品名稱private void comboCategory_SelectedlndexChanged(object sender,
26、EventArgs e)comboProducts.ltems.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+""
27、9; SqlCommand comm = new SqlCommand(strSql, conn);SqlDataReader dr = comm.ExecuteReader();while (dr.Read()comboProducts.ltems.Add(drO);dr.Close(); conn.Close();【例2-4】使用DataAdaper和 DataSet對(duì)象查詢數(shù)據(jù)庫(kù)中的信息并加載到ComboBox控件的選項(xiàng)中。實(shí)現(xiàn)過程:(1) 新建一 Windows應(yīng)用程序,命名為dataSe,將創(chuàng)建的默認(rèn)窗體名更名為frmProducts,窗體及各主要控件的屬性設(shè)置同例2-3。(2) 主
28、要程序代碼 雙擊窗體標(biāo)題欄,進(jìn)入其Load事件處理函數(shù),訪問數(shù)據(jù)庫(kù),為“商品類別”下拉框加載數(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 s
29、trSql = "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 = "
30、;CategoryName" / 設(shè)置商品類別下拉框的顯示屬性 雙擊“商品類別”下拉框,進(jìn)入其SelectedI ndexCha nge(事件處理函數(shù),根據(jù)其選中項(xiàng)為“商品名稱”下拉框加載數(shù)據(jù),代碼如下。/ “商品類別”下拉框選項(xiàng)索引變化事件處理函數(shù),/根據(jù)商品類別下拉框中的選項(xiàng)加載該類別下的所有的商品名稱private void comboCatagory_SelectedlndexChanged(object sender, EventArgs e)string strConn = "server=XP-4;database=chap2;integrated secur
31、ity=true"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);combo
32、Products.DataSource = ds.TablesO; / 設(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ù)庫(kù)中的數(shù)據(jù),加載數(shù)據(jù)至ListBox和ComboBox控件,并根據(jù)用戶在ListBox控件中選擇的數(shù)
33、據(jù)項(xiàng)再次訪問數(shù)據(jù)庫(kù),獲取相關(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輸入和顯示商
34、品名稱ReadonlyTrue2txtSupplier輸入和顯示供應(yīng)商名稱ReadonlyTrue3ComboBoxcomboCategory輸入和顯示商品類別EnabledFalse4TextBoxtxtUnitPrice輸入和顯示商品單價(jià)ReadonlyTrue5txtUnitsInStock輸入和顯示庫(kù)存數(shù)量ReadonlyTrue6CheckBoxchkDisc輸入和顯示是否打折EnabledFalse7ButtonbtnInsert添加商品EnabledTrue8btnUpdate修改商品EnabledTrue9btnSave保存數(shù)據(jù)EnabledFalse10btnCancle取消
35、編輯EnabledFalse11btnDelete刪除數(shù)據(jù)EnabledTrue12ListBoxlstProducts商品名稱列表EnabledTrue(2)主要程序代碼首先要為該程序添加兩個(gè)成員變量,代碼如下:string strConn = "server=XP-4;database=chap2;integrated security=true" / 連接字符串string insertORupdate = ""/標(biāo)識(shí)變量,用來記錄要保存的是添加還是修改操作自定義方法DataLoad(),訪問數(shù)據(jù)庫(kù),加載商品類別列表及商品名稱列表,代碼如下。/ &
36、lt;summary>/訪問數(shù)據(jù)庫(kù),加載商品類別列表及商品名稱列表/ </summary>void DataLoad()/以下代碼使用DataReader訪問數(shù)據(jù)庫(kù)SqlConnection conn = new SqlConnection(strConn); / 創(chuàng)建連接對(duì)象conn.Open();/ 打開連接string strSql = "select distinct CategoryName from Products" / 查詢不重復(fù)的商品類別名 SqlCommand comm = new SqlCommand(strSql, conn); /
37、 聲明并創(chuàng)建命令對(duì)象 SqlDataReader dr = comm.ExecuteReader(); / 執(zhí)行查詢,用 DataReader 存放數(shù)據(jù) while (dr.Read()/如果查詢到數(shù)據(jù)comboCategory.ltems.Add(drO); / 逐項(xiàng)加載商品類別名至ComboBoxdr.Close();/ 關(guān)閉 dataReader/以下代碼使用DataAdapter和DataSet訪問數(shù)據(jù)庫(kù)strSql = "select ProductName,ProductlD from Products" / 查詢商品名稱及商品編號(hào)SqlDataAdapter
38、da = new SqlDataAdapter(strSql, conn); / 聲明并創(chuàng)建數(shù)據(jù)適配器對(duì)象DataSet ds = new DataSet(); 聲明并創(chuàng)建數(shù)據(jù)集對(duì)象da.Fill(ds); /填充數(shù)據(jù)集IstProducts.DataSource = ds.TablesO; / 設(shè)置商品名稱列表的數(shù)據(jù)源IstProducts.DisplayMember = "ProductName" / 設(shè)置顯示值屬性IstProducts.ValueMember = "ProductID" / 設(shè)置實(shí)際值屬性 conn.Close();/ 關(guān)閉連接I
39、stProducts.Selectedlndex = -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(string status)if (s
40、tatus = "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)TextBox txtb = (TextBox)
41、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 is TextBox)TextBox txtb = (TextBox)c)
42、;txtb.ReadOnly = false; 雙擊lstProducts控件,進(jìn)入其選項(xiàng)索引變化事件處理函數(shù),根據(jù)選擇的商品,查詢?cè)撋唐菲渌畔ⅲ榻缑嫫渌丶x值,代碼如下。/商品名稱列表選項(xiàng)索引變化事件,根據(jù)選擇的商品名稱加載商品其他信息private void lstProducts_SelectedlndexChanged(object sender, EventArgs e)/用來判斷用戶是否選中了有效的選項(xiàng),且保證是數(shù)據(jù)加載后用戶進(jìn)行的操作if (IstProducts.Selectedlndex != -1)&&(lstProducts.SelectedVal
43、ue.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ù)庫(kù)連接string strSql="select * from Products where Productld="'+prold+""' /由商品編號(hào)查詢
44、該商品其他信息SqlCommand comm=new SqlCommand(strSql,conn); / 聲明并創(chuàng)建命令對(duì)象SqlDataReader dr = comm.ExecuteReader(); /使用 DataReader獲取查詢結(jié)果if (dr.Read() /如果查詢到數(shù)據(jù),就將該商品各字段的值賦予窗體各控件用以顯示txtID.Text = dr"P roductlD".ToString();txtName.Text=dr"ProductName".ToString();txtSupplier.Text=dr"Supplier
45、Name".ToString();comboCategory.Text = dr"CategoryName".ToString(); txtUnitPrice.Text=dr"UnitPrice".ToString(); txtUnitslnStock.Text=dr"UnitslnStock".ToString(); chkDisc.Checked = (dr"Discount".ToString()="True"?true:false;dr.Close(); / 關(guān)閉 DataRe
46、aderconn.Close(); / 關(guān)閉連接controlEnabled("show"); /將控件設(shè)置為查看狀態(tài)說明:由于為L(zhǎng)istBox控件加載選項(xiàng)時(shí)會(huì)觸發(fā)SelectedlndexChangec事件, 此時(shí)獲取到的 ListBox.SelectedValue.ToString()值為System.Data.DataRowView”,而不是經(jīng)用戶選擇過的商品編號(hào),程序需過濾掉這種情況。只有完成ListBox控件的選項(xiàng)加載后,經(jīng)用戶選擇某條商品數(shù)據(jù)時(shí),程序才進(jìn)行后續(xù)操作,如下代碼即可實(shí)現(xiàn)這種過濾功能。if (IstProducts.Selectedlndex != -
47、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 btnlnsert_Click(object sender, EventArgs e) insertORupdate = "insert" /設(shè)置標(biāo)識(shí)變量為
48、添加操作 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)入其Click事件處理函數(shù),使各輸入控件為可編 輯狀態(tài),設(shè)置編輯狀態(tài)為update,真正的修改操作在btnSave的Click事件處
49、理 函數(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ù)庫(kù)進(jìn)行insert或update操作,代碼如下。I /【保存】按鈕單擊事件處理函數(shù),完成添加和修改操作private void bt
50、nSave_Click(object sender, EventArgs e)SqlConnection conn = new SqlConnection(strConn); / 聲明并創(chuàng)建連接對(duì)象conn.Open(); /打開數(shù)據(jù)庫(kù)連接下面一段代碼將保存添加的商品數(shù)據(jù)if (insertORupdate = "insert")string strSql = "insert into Products values(ProductlD,ProductName ,SupplierName,CategoryName,UnitPrice,UnitslnStock,Di
51、scount)"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.Pa
52、rameters.Add(new SqlParameter("CategoryName", comboCategory.Text); comm.Parameters.Add(new SqlParameter("UnitPrice", float.Parse(txtUnitPrice.Text); comm.Parameters.Add(new SqlParameter("UnitslnStock", float.Parse(txtUnitslnStock.Text); comm.Parameters.Add(new SqlParame
53、ter("Discount", (chkDisc.Checked = true ? "1" : "0"); if (comm.ExecuteNonQuery() > 0)MessageBox.Show(”添加商品信息成功!");elseMessageBox.Show(”添加商品信息失?。?quot;);下面一段代碼將保存修改的商品數(shù)據(jù)elsestring strSql = "update Products set ProductName=ProductName, SupplierName=SupplierNa
54、me,CategoryName=CategoryName,UnitPrice=UnitPrice, UnitslnStock=UnitslnStock,Discount=Discount where ProductID=ProductID"SqlCommand comm = new SqlCommand(strSql, conn); comm.Parameters.Add(new SqlParameter("ProductID", txtID.Text); comm.Parameters.Add(new SqlParameter("ProductName
55、", txtName.Text); comm.Parameters.Add(new SqlParameter("SupplierName", txtSupplier.Text); comm.Parameters.Add(new SqlParameter("CategoryName", comboCategory.Text); comm.Parameters.Add(new SqlParameter("UnitPrice", float.Parse(txtUnitPrice.Text); comm.Parameters.Add
56、(new SqlParameter("UnitsInStock", float.Parse(txtUnitslnStock.Text); comm.Parameters.Add(new SqlParameter("Discount", (chkDisc.Checked = true ? "1" : "0"); if (comm.ExecuteNonQuery() > 0)MessageBox.Show("更新商品信息成功!");elseMessageBox.Show("更新商品信
57、息失?。?quot;);conn.Close(); /關(guān)閉數(shù)據(jù)庫(kù)連接DataLoad(); /重新訪問數(shù)據(jù)庫(kù),刷新界面顯示的商品信息controlEnabled("show"); /將控件設(shè)置為查看狀態(tài)說明:代碼中出現(xiàn)的SqIParamete類為SQL命令對(duì)象類。命令對(duì)象可使用參數(shù)來將值傳遞給SQL語句或存儲(chǔ)過程,提供類型檢查和驗(yàn)證。與命令文本不同,參數(shù)輸入被視為文本值,而不是可執(zhí)行代碼。這樣可幫助抵御“SQL注入”攻擊,這種攻擊的攻擊者會(huì)將命令插入SQL語句,從而危及服務(wù)器的安 全。一般來說,在更新 DataTable或是DataSet時(shí),如果不采用 SqIParamete, 那么當(dāng)輸入的Sql語句出現(xiàn)歧義時(shí),如字
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 櫥柜預(yù)售方案(3篇)
- 水質(zhì)檢測(cè)方案(3篇)
- 冶煉產(chǎn)品安全管理制度
- 制藥車間設(shè)備管理制度
- 幼兒廚房人員管理制度
- 單位人員閉環(huán)管理制度
- 房產(chǎn)代理進(jìn)場(chǎng)方案(3篇)
- 口岸入境閉環(huán)管理制度
- 小公司軍事化管理制度
- 廈門餐飲現(xiàn)場(chǎng)管理制度
- 轉(zhuǎn)讓魚塘股份合同范本
- 貴州省畢節(jié)地區(qū)金沙縣2022-2023學(xué)年小學(xué)六年級(jí)數(shù)學(xué)畢業(yè)檢測(cè)指導(dǎo)卷含答案
- 抖音帶貨主播勞動(dòng)合同范本
- DB32-T 4284-2022 居民住宅二次供水工程技術(shù)規(guī)程
- 食品有限公司制冷機(jī)組安全風(fēng)險(xiǎn)分級(jí)管控清單
- 金賽 說明書完整版
- 經(jīng)濟(jì)學(xué)思維方式智慧樹知到答案章節(jié)測(cè)試2023年西安交通大學(xué)
- 經(jīng)濟(jì)林栽培學(xué) PPT課件 竹子栽培
- 2023年山東省威海市中考?xì)v史試題
- 2023年江蘇海事職業(yè)技術(shù)學(xué)院招聘筆試題庫(kù)及答案解析
- 畢業(yè)設(shè)計(jì)基于單片機(jī)的發(fā)動(dòng)機(jī)轉(zhuǎn)速電控系統(tǒng)程序設(shè)計(jì)及仿真
評(píng)論
0/150
提交評(píng)論