




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、是為.NET框架而創(chuàng)建的,是對ADO(ActiveX Data Objects)對象模型的擴(kuò)充。提供了一組數(shù)據(jù)訪問服務(wù)的類,可用于對Microsoft SQL Server、Oracle等數(shù)據(jù)源的一致訪問。模型分為.NET Data Provider(數(shù)據(jù)提供程序)和DataSet數(shù)據(jù)集(數(shù)據(jù)處理的核心)兩大主要部分。.NET數(shù)據(jù)提供程序提供了四個(gè)核心對象,分別是Connection、Command、DataReader和DataAdapter對象。功能如表2-1所示。表2-1對象功能Connection提供和數(shù)據(jù)源的連接功能Command提供訪問數(shù)據(jù)庫命令,執(zhí)行查詢數(shù)據(jù)或修改數(shù)據(jù)的功能,例如
2、運(yùn)行SQL命令和存儲過程等DataReader從數(shù)據(jù)源中讀取只向前的且只讀的數(shù)據(jù)流DataAdapter是DataSet對象和數(shù)據(jù)源間的橋梁。DataAdapter使用4個(gè)Command對象來運(yùn)行查詢、新建、修改、刪除的SQL命令,把數(shù)據(jù)加載到DataSet,或者把DataSet內(nèi)的數(shù)據(jù)送回?cái)?shù)據(jù)源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)建完畢后可錄入初始化數(shù)據(jù)若干條。表2-2 Products表表結(jié)構(gòu)序號列名字段說明數(shù)據(jù)類型長度主鍵
3、允許空1ProductID商品編號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 Server 2012在安裝時(shí)默認(rèn)是使用Windows驗(yàn)證方式的,但是安裝過后用戶可隨時(shí)修改身份驗(yàn)證
4、方式。啟動SQL Server 2012 Management Studio,在“連接到服務(wù)器”對話框中選擇“Windows身份驗(yàn)證”連接服務(wù)器,連接成功后,在窗體左側(cè)的“對象資源管理器”中右鍵單擊服務(wù)器實(shí)例節(jié)點(diǎn),并在彈出的快捷菜單中選擇“屬性”菜單項(xiàng),系統(tǒng)將彈出“服務(wù)器屬性”窗體,切換至“安全性”選項(xiàng)卡,如圖2-1所示。圖2-1 “服務(wù)器屬性”對話框-“安全性”選項(xiàng)卡在“服務(wù)器身份驗(yàn)證”部分選擇“SQL Server和Windows身份驗(yàn)證模式”選項(xiàng),并單擊【確定】按鈕。系統(tǒng)將提示需要重新啟動SQL Server以使配置生效,如圖2-2所示。圖2-2 系統(tǒng)提示框右鍵單擊“對象資源管理器”的服
5、務(wù)器實(shí)例節(jié)點(diǎn),在彈出的快捷菜單中選擇“重新啟動”菜單項(xiàng),SQL Server將重新啟動服務(wù),重啟成功后即可使用混合驗(yàn)證方式登錄SQL Server服務(wù)器。2添加登錄賬戶大部分初學(xué)者都習(xí)慣于使用SQL Server的系統(tǒng)管理員賬號“sa”來登錄數(shù)據(jù)庫服務(wù)器,而在實(shí)際工作環(huán)境中使用sa賬號登錄服務(wù)器是不合理的。因?yàn)楹芏嗲闆r下系統(tǒng)的數(shù)據(jù)庫是部署在租用的數(shù)據(jù)庫服務(wù)器上的,此時(shí)數(shù)據(jù)庫設(shè)計(jì)人員或編程人員都不可能具有sa賬號的使用權(quán)限,因此在將身份驗(yàn)證方式修改為SQL Server和Windows混合驗(yàn)證后,需要為某應(yīng)用程序創(chuàng)建一個(gè)專用的登錄賬戶。其操作步驟描述如下。(1)使用Windows身份驗(yàn)證登錄SQ
6、L Server,在對象資源管理器中點(diǎn)擊“安全性”節(jié)點(diǎn)前面的加號“+”,在展開后的“登錄名”子節(jié)點(diǎn)上單擊右鍵,如圖2-3所示,并在彈出的快捷菜單中選擇“新建登錄名”選項(xiàng)。圖2-3 登錄名節(jié)點(diǎn)的右鍵菜單(2)系統(tǒng)彈出“登錄名新建”對話框中,如圖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ù)庫“chap2”。圖2-4 “登錄名-新建”對話框“常規(guī)”選項(xiàng)卡(3)服務(wù)器角色節(jié)點(diǎn)不予配置。有關(guān)SQL S
7、erver服務(wù)器角色請參考相關(guān)資料,此處不再詳細(xì)介紹。(4)在對話框左側(cè)選項(xiàng)卡中選擇“用戶映射”節(jié)點(diǎn),如圖2-5所示,在“映射到此登錄名的用戶”列表中,勾選此前創(chuàng)建好的數(shù)據(jù)庫“chap2”,在窗體右下方的“數(shù)據(jù)庫角色成員身份”框里選擇“db_Owner”,即數(shù)據(jù)庫擁有者。圖2-5 “登錄名-新建”對話框“用戶映射”選項(xiàng)卡(5)安全對象節(jié)點(diǎn)一般不予配置。(6)在對話框左側(cè)選項(xiàng)卡中選擇“狀態(tài)”節(jié)點(diǎn),如圖2-6所示,將“是否允許連接到數(shù)據(jù)庫引擎”選項(xiàng)設(shè)為“授予”,同時(shí)將“登錄”選項(xiàng)設(shè)為“啟用”。以上各節(jié)點(diǎn)配置完成后單擊【確定】按鈕,即完成了對賬戶的創(chuàng)建工作。圖2-6 “登錄名-新建”對話框“狀態(tài)配置
8、”選項(xiàng)卡(7)新建賬戶完成后,重新連接SQL Server,如圖2-7所示,選擇SQL Server身份驗(yàn)證方式,輸入前面設(shè)置的登錄名“zd”及密碼“123”,點(diǎn)擊【連接】按鈕,即可完成登錄。登錄成功后在對象資源管理器中可看到服務(wù)器實(shí)例名后面顯示的登錄用戶名,如圖2-8所示。圖2-7 “連接到服務(wù)器”對話框 圖2-8 對象資源管理器 連接數(shù)據(jù)庫在對數(shù)據(jù)源進(jìn)行操作之前,首先需建立到數(shù)據(jù)源的連接,可使用Connection對象顯式創(chuàng)建到數(shù)據(jù)源的連接?!纠?-1】 設(shè)計(jì)一個(gè)Windows應(yīng)用程序,能通過“Windows驗(yàn)證“和“Windows和SQL Server混合驗(yàn)證”兩種方式建立到數(shù)據(jù)庫的連接
9、。圖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)證方式連接數(shù)據(jù)庫TextWindows驗(yàn)證1btnConnect2混合驗(yàn)證方式連接數(shù)據(jù)庫Text混合驗(yàn)證(2)主要程序代碼說明: 本節(jié)內(nèi)所有例題代碼均需
10、引用System.Data.SqlClient命名空間,代碼如下:using System.Data.SqlClient; /添加對SQL Server數(shù)據(jù)訪問對象的引用后續(xù)例題不再逐一說明。 由于篇幅所限,本節(jié)中所有例題的異常捕獲代碼都省略了,讀者需自行添加獲取控件輸入及訪問數(shù)據(jù)庫等處的異常捕獲代碼。雙擊【W(wǎng)indows驗(yàn)證】按鈕,進(jìn)入其Click事件處理函數(shù),代碼如下:/Windows方式連接數(shù)據(jù)庫private void btnConnect1_Click(object sender, EventArgs e)string strConn = server=XP-4;database=c
11、hap2;integrated security=true; /連接字符串SqlConnection conn = new SqlConnection(strConn); /創(chuàng)建連接對象conn.Open(); /打開連接/如連接成功則彈出消息框提示MessageBox.Show(數(shù)據(jù)庫已通過集成驗(yàn)證方式連接成功, 連接狀態(tài)對話框);conn.Close(); /使用完畢后關(guān)閉數(shù)據(jù)庫連接雙擊【混合驗(yàn)證】按鈕,進(jìn)入其Click事件處理函數(shù),填寫代碼如下。/SQL Server + Windows方式連接數(shù)據(jù)庫private void btnConnect2_Click(object sender
12、, EventArgs e)string strConn = server=XP-4.;database=chap2;uid=zd;pwd=123; /連接字符串SqlConnection conn = new SqlConnection(strConn); /創(chuàng)建連接對象conn.Open(); /打開連接/如連接成功則彈出消息框提示MessageBox.Show(數(shù)據(jù)庫已通過混合驗(yàn)證方式連接成功, 連接狀態(tài)對話框);conn.Close(); /使用完畢后關(guān)閉數(shù)據(jù)庫連接數(shù)據(jù)庫連接字符串包含要連接的數(shù)據(jù)庫的信息,如server屬性指定數(shù)據(jù)庫服務(wù)器名稱,database屬性指定數(shù)據(jù)庫名稱,使用
13、Windows身份驗(yàn)證方式只需要給出server和database兩個(gè)屬性的值,并使用“integrated security=true”指定身份驗(yàn)證方式為Windows驗(yàn)證;當(dāng)使用混合驗(yàn)證時(shí)則需要使用uid屬性指定數(shù)據(jù)庫賬戶、pwd屬性指定該賬號的密碼。說明:上例中的連接字符串中的用戶名“zd”和密碼“123”,是以本節(jié)“添加登錄賬戶”的方式創(chuàng)建的,讀者可自行修改為自己計(jì)算機(jī)的SQLServer登錄名及密碼。運(yùn)行程序,分別單擊【W(wǎng)indows驗(yàn)證】和【混合驗(yàn)證】兩個(gè)按鈕,如連接成功,將分別彈出不同的連接狀態(tài)對話框,如圖2-10所示。圖2-10 連接狀態(tài)對話框 對數(shù)據(jù)庫進(jìn)行添加、修改及刪除操作
14、在創(chuàng)建好到數(shù)據(jù)庫的連接之后,可以使用Command對象對數(shù)據(jù)庫進(jìn)行更新操作?!纠?-2】設(shè)計(jì)一個(gè)Windows應(yīng)用程序,能實(shí)現(xiàn)對數(shù)據(jù)庫表的添加、修改及刪除操作。實(shí)現(xiàn)過程:(1)新建一Windows應(yīng)用程序,命名為operateData,將創(chuàng)建的默認(rèn)窗體名更名為frmCommand,窗體的Text屬性設(shè)置為“對數(shù)據(jù)庫執(zhí)行添加、修改及刪除操作”,界面設(shè)計(jì)如圖2-11所示。frmCommand窗體中的主要控件,按Tab鍵順序,描述如表2-4所示。圖2-11“對數(shù)據(jù)庫進(jìn)行添加、修改及刪除操作”窗體Tab順序視圖表2-4“對數(shù)據(jù)庫執(zhí)行添加、修改及刪除操作”窗體控件及說明Tab順序控件類型控件名稱說 明主
15、要屬性屬性名屬性值0ButtonbtnInsert向數(shù)據(jù)庫表添加一條記錄Text添加1btnUpdate修改數(shù)據(jù)庫表中的記錄Text修改2btnDelete刪除數(shù)據(jù)庫表中的記錄Text刪除(2)主要程序代碼雙擊【添加】按鈕,進(jìn)入其Click事件處理函數(shù),代碼如下。/【添加】按鈕單擊事件處理函數(shù)private void btnInsert_Click(object sender, EventArgs e)string strConn = server=XP-4;database=chap2;integrated security=true; /連接字符串SqlConnection conn =
16、new SqlConnection(strConn); /聲明并創(chuàng)建連接對象conn.Open(); /打開數(shù)據(jù)庫連接/向商品表插入一條新記錄string strSql=insert into Products values(0012,雙層蒸鍋,蘇泊爾集團(tuán),廚具,129.9,100,false);SqlCommand comm = new SqlCommand(strSql, conn); /聲明并創(chuàng)建命令對象int row = comm.ExecuteNonQuery(); /執(zhí)行SQL語句,并獲取受影響的行數(shù)if (row 0) /如果記錄插入成功,則彈出消息框提示MessageBox.S
17、how(插入數(shù)據(jù)成功, 操作狀態(tài)對話框); 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 =
18、 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)對話框);conn.Close();雙擊【刪除】按鈕,進(jìn)入其Click事件處理函數(shù),代碼如下。/【刪除】按鈕單擊事件處理函數(shù)private void btnDelete_Click(object sender, EventArgs e) stri
19、ng strConn = server=XP-4;database=chap2;integrated security=true;SqlConnection conn = new SqlConnection(strConn);conn.Open();/刪除商品表中的一條記錄string strSql = delete from Products where ProductID=0012;SqlCommand comm = new SqlCommand(strSql, conn);int row = comm.ExecuteNonQuery();if (row 0)MessageBox.Show
20、(刪除數(shù)據(jù)成功, 操作狀態(tài)對話框);conn.Close();運(yùn)行程序,分別單擊【添加】、【修改】和【刪除】按鈕,如操作成功,將分別彈出不同的操作狀態(tài)對話框,如圖2-12所示。對于數(shù)據(jù)庫記錄的修改情況,讀者可同時(shí)從SQL Server管理控制臺訪問數(shù)據(jù)庫chap2的Products表進(jìn)行驗(yàn)證。圖2-12操作狀態(tài)對話框 查詢數(shù)據(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,窗體的T
21、ext屬性設(shè)置為“商品類別及名稱”,界面設(shè)計(jì)如圖2-13所示。frmProducts窗體中的主要控件,按Tab鍵順序,描述如表2-5所示。圖2-13“商品類別及名稱”窗體Tab鍵順序視圖表2-5“商品類別及名稱”窗體控件及說明Tab順序控件類型控件名稱說 明主要屬性屬性名屬性值0ComboBoxcomboCategory所有商品類別名稱DropDownStyleDropDownList1comboProducts某商品類別下的商品名稱DropDownStyleDropDownList說明:界面中不參與編程的Label控件不再進(jìn)行說明,以下各例題均同樣處理。(2)主要程序代碼雙擊窗體標(biāo)題欄,進(jìn)入
22、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)建連接對象conn.Open(); /打開數(shù)據(jù)庫連接string strSql = se
23、lect distinct CategoryName from Products; /查詢SqlCommand comm = new SqlCommand(strSql, conn);SqlDataReader dr = comm.ExecuteReader();while (dr.Read()comboCategory.Items.Add(dr0); /依次加載數(shù)據(jù)項(xiàng)至ComboBoxdr.Close();conn.Close();雙擊商品類別下拉框,進(jìn)入其SelectedIndexChanged事件處理函數(shù),根據(jù)其選項(xiàng)為“商品名稱”下拉框加載數(shù)據(jù),代碼如下。/“商品類別”下拉框選項(xiàng)索引變化
24、事件處理函數(shù), /根據(jù)商品類別下拉框中的選項(xiàng)加載該類別下的所有的商品名稱private void comboCategory_SelectedIndexChanged(object sender, EventArgs e)comboProducts.Items.Clear();string strConn = server=XP-4;database=chap2;integrated security=true;SqlConnection conn = new SqlConnection(strConn);conn.Open();string strSql = select ProductNa
25、me from Products where CategoryName=+comboCategory.Text+;SqlCommand comm = new SqlCommand(strSql, conn);SqlDataReader dr = comm.ExecuteReader();while (dr.Read()comboProducts.Items.Add(dr0);dr.Close();conn.Close();【例2-4】 使用DataAdaper和DataSet對象查詢數(shù)據(jù)庫中的信息并加載到ComboBox控件的選項(xiàng)中。實(shí)現(xiàn)過程:(1)新建一Windows應(yīng)用程序,命名為data
26、Set,將創(chuàng)建的默認(rèn)窗體名更名為frmProducts,窗體及各主要控件的屬性設(shè)置同例2-3。(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=XP-4;database=chap2;integrated security=true; /連接字符串 SqlConnection conn = new Sql
27、Connection(strConn); /聲明并創(chuàng)建連接對象 string strSql = select distinct CategoryName from Products; /查詢不重復(fù)的商品類別名稱 SqlDataAdapter da = new SqlDataAdapter(strSql, conn); /聲明并創(chuàng)建數(shù)據(jù)適配器對象 DataSet ds = new DataSet(); /聲明并創(chuàng)建數(shù)據(jù)集對象 da.Fill(ds); /使用數(shù)據(jù)適配器填充數(shù)據(jù)集 comboCatagory.DataSource = ds.Tables0; /設(shè)置商品類別下拉框數(shù)據(jù)源 comboC
28、atagory.DisplayMember = CategoryName; /設(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;integra
29、ted security=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); comboProducts.DataSource =
30、 ds.Tables0; /設(shè)置商品名稱下拉框的數(shù)據(jù)源 comboProducts.DisplayMember = ProductName; /設(shè)置商品名稱下拉框的顯示屬性思考:細(xì)心的同學(xué)會發(fā)現(xiàn),例2-3和例2-4雖然運(yùn)行界面完全相同,但是窗體加載之后列表框中選項(xiàng)的情況是有區(qū)別的。那么,區(qū)別在哪呢?原因又是什么呢? 數(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)再次訪問數(shù)據(jù)庫,獲取相關(guān)記錄。另外,本例題還實(shí)現(xiàn)了對商品表Products的
31、增加、修改及刪除操作。圖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輸入和顯示商品編號ReadonlyTrue1txtName輸入和顯示商品名稱ReadonlyTrue2txtSupplier輸入和顯示供應(yīng)商名稱Reado
32、nlyTrue3ComboBoxcomboCategory輸入和顯示商品類別EnabledFalse4TextBoxtxtUnitPrice輸入和顯示商品單價(jià)ReadonlyTrue5txtUnitsInStock輸入和顯示庫存數(shù)量ReadonlyTrue6CheckBoxchkDisc輸入和顯示是否打折EnabledFalse7ButtonbtnInsert添加商品EnabledTrue8btnUpdate修改商品EnabledTrue9btnSave保存數(shù)據(jù)EnabledFalse10btnCancle取消編輯EnabledFalse11btnDelete刪除數(shù)據(jù)EnabledTrue12
33、ListBoxlstProducts商品名稱列表EnabledTrue(2)主要程序代碼首先要為該程序添加兩個(gè)成員變量,代碼如下:string strConn = server=XP-4;database=chap2;integrated security=true;/連接字符串string insertORupdate = ;/標(biāo)識變量,用來記錄要保存的是添加還是修改操作自定義方法DataLoad(),訪問數(shù)據(jù)庫,加載商品類別列表及商品名稱列表,代碼如下。/ / 訪問數(shù)據(jù)庫,加載商品類別列表及商品名稱列表/ void DataLoad() /以下代碼使用DataReader訪問數(shù)據(jù)庫 Sql
34、Connection conn = new SqlConnection(strConn); /創(chuàng)建連接對象 conn.Open(); /打開連接 string strSql = select distinct CategoryName from Products; /查詢不重復(fù)的商品類別名 SqlCommand comm = new SqlCommand(strSql, conn); /聲明并創(chuàng)建命令對象 SqlDataReader dr = comm.ExecuteReader(); /執(zhí)行查詢,用DataReader存放數(shù)據(jù) while (dr.Read() /如果查詢到數(shù)據(jù) comboC
35、ategory.Items.Add(dr0); /逐項(xiàng)加載商品類別名至ComboBox dr.Close(); /關(guān)閉dataReader /以下代碼使用DataAdapter和DataSet訪問數(shù)據(jù)庫 strSql = select ProductName,ProductID from Products; /查詢商品名稱及商品編號 SqlDataAdapter da = new SqlDataAdapter(strSql, conn); /聲明并創(chuàng)建數(shù)據(jù)適配器對象 DataSet ds = new DataSet(); /聲明并創(chuàng)建數(shù)據(jù)集對象 da.Fill(ds); /填充數(shù)據(jù)集 lstP
36、roducts.DataSource = ds.Tables0; /設(shè)置商品名稱列表的數(shù)據(jù)源 lstProducts.DisplayMember = ProductName; /設(shè)置顯示值屬性 lstProducts.ValueMember = ProductID; /設(shè)置實(shí)際值屬性 conn.Close(); /關(guān)閉連接 lstProducts.SelectedIndex = -1; /使商品名稱列表沒有選中項(xiàng)商品管理窗體的Load事件處理函數(shù),就是調(diào)用DataLoad()方法,代碼如下。/窗體加載事件處理函數(shù)private void frmProducts _Load(object sen
37、der, EventArgs e) DataLoad();聲明自定義方法controlEnabled(),控制各輸入控件在“查看”和“編輯”操作時(shí)的可用性,代碼如下。/自定義方法,控制控件的可用性,將控件可用性分為“查看”和“編輯”兩種狀態(tài) public void controlEnabled(string status) if (status = show) /當(dāng)前為查看數(shù)據(jù)狀態(tài),控件都不可編輯 btnInsert.Enabled = true; btnUpdate.Enabled = true; btnSave.Enabled = false; btnCancle.Enabled = fa
38、lse; btnDelete.Enabled = true; chkDisc.Enabled = false; comboCategory.Enabled = false; foreach (Control c in this.Controls) if (c is TextBox) TextBox txtb = (TextBox)c); txtb.ReadOnly = true; else /當(dāng)前為編輯數(shù)據(jù)狀態(tài),控件可用 btnInsert.Enabled = false; btnUpdate.Enabled = false; btnSave.Enabled = true; btnCancle
39、.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); txtb.ReadOnly = false; 雙擊lstProducts控件,進(jìn)入其選項(xiàng)索引變化事件處理函數(shù),根據(jù)選擇的商品,查詢該商品其他信息,并為界面其他控件賦值,代碼如下。/商品名稱列表選項(xiàng)索引變化事件,根據(jù)選擇的商品名稱加載商品其
40、他信息private void lstProducts_SelectedIndexChanged(object sender, EventArgs e) /用來判斷用戶是否選中了有效的選項(xiàng),且保證是數(shù)據(jù)加載后用戶進(jìn)行的操作 if (lstProducts.SelectedIndex != -1)&(lstProducts.SelectedValue.ToString()!=System.Data.DataRowView) string proId = lstProducts.SelectedValue.ToString(); /獲取當(dāng)前選中商品的商品編號 SqlConnection conn=
41、new SqlConnection(strConn); /聲明并創(chuàng)建連接對象 conn.Open(); /打開數(shù)據(jù)庫連接 string strSql=select * from Products where ProductId=+proId+; /由商品編號查詢該商品其他信息 SqlCommand comm=new SqlCommand(strSql,conn); /聲明并創(chuàng)建命令對象 SqlDataReader dr = comm.ExecuteReader(); /使用DataReader獲取查詢結(jié)果 if (dr.Read() /如果查詢到數(shù)據(jù),就將該商品各字段的值賦予窗體各控件用以顯示
42、 txtID.Text = drProductID.ToString(); txtName.Text=drProductName.ToString(); txtSupplier.Text=drSupplierName.ToString(); comboCategory.Text = drCategoryName.ToString(); txtUnitPrice.Text=drUnitPrice.ToString(); txtUnitsInStock.Text=drUnitsInStock.ToString(); chkDisc.Checked = (drDiscount.ToString()=
43、True?true:false; dr.Close(); /關(guān)閉DataReader conn.Close(); /關(guān)閉連接controlEnabled(show); /將控件設(shè)置為查看狀態(tài) 說明:由于為ListBox控件加載選項(xiàng)時(shí)會觸發(fā)SelectedIndexChanged事件,此時(shí)獲取到的ListBox.SelectedValue.ToString()值為“”,而不是經(jīng)用戶選擇過的商品編號,程序需過濾掉這種情況。只有完成ListBox控件的選項(xiàng)加載后,經(jīng)用戶選擇某條商品數(shù)據(jù)時(shí),程序才進(jìn)行后續(xù)操作,如下代碼即可實(shí)現(xiàn)這種過濾功能。if (lstProducts.SelectedIndex !
44、= -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, EventArgs e)insertORupdate = insert; /設(shè)置標(biāo)識變量為添加操作 controlEnabled(edit); /將控
45、件設(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事件處理函數(shù)中進(jìn)行。代碼如下。/【修改】按鈕單擊事件處理函數(shù)private void btnUpdat
46、e_Click(object sender, EventArgs e)controlEnabled(edit); txtID.ReadOnly = true; /商品編號不能修改 insertORupdate = update; /設(shè)置標(biāo)志變量為修改操作雙擊btnSave按鈕,進(jìn)入其Click事件處理函數(shù),根據(jù)編輯狀態(tài)對數(shù)據(jù)庫進(jìn)行insert或update操作,代碼如下。/【保存】按鈕單擊事件處理函數(shù),完成添加和修改操作private void btnSave_Click(object sender, EventArgs e) SqlConnection conn = new SqlConne
47、ction(strConn); /聲明并創(chuàng)建連接對象 conn.Open(); /打開數(shù)據(jù)庫連接 /下面一段代碼將保存添加的商品數(shù)據(jù) if (insertORupdate = insert) string strSql = insert into Products values(ProductID,ProductName,SupplierName,CategoryName,UnitPrice,UnitsInStock,Discount); SqlCommand comm = new SqlCommand(strSql, conn); comm.Parameters.Add(new SqlPar
48、ameter(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.Add(new SqlParameter(UnitPrice, float.Parse(tx
49、tUnitPrice.Text); comm.Parameters.Add(new SqlParameter(UnitsInStock, float.Parse(txtUnitsInStock.Text); comm.Parameters.Add(new SqlParameter(Discount, (chkDisc.Checked = true ? 1 : 0); if (comm.ExecuteNonQuery() 0) MessageBox.Show(添加商品信息成功!); else MessageBox.Show(添加商品信息失?。?; /下面一段代碼將保存修改的商品數(shù)據(jù) else s
50、tring strSql = update Products set ProductName=ProductName,SupplierName=SupplierName,CategoryName=CategoryName,UnitPrice=UnitPrice,UnitsInStock=UnitsInStock,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, txtName.Text); comm.Parameters.Add(new SqlParameter(SupplierNa
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 大學(xué)生校園歌手大賽觀后感
- 湖北省武漢市常青聯(lián)合體2024-2025學(xué)年高二上學(xué)期期末聯(lián)考地理試題 含解析
- 商務(wù)往來文件處理規(guī)范
- 活動現(xiàn)場照片登記表
- 小學(xué)生思維導(dǎo)圖征文
- 供應(yīng)鏈采購協(xié)議細(xì)則
- 人才需求及就業(yè)前景分析表
- 貝雷片租賃合同
- 年度項(xiàng)目工作計(jì)劃與執(zhí)行監(jiān)控報(bào)告
- 新能源技術(shù)合作開發(fā)風(fēng)險(xiǎn)免責(zé)書
- 供應(yīng)鏈的三道防線:需求預(yù)測、庫存計(jì)劃、供應(yīng)鏈執(zhí)行
- 雙新背景下小學(xué)英語單元整體作業(yè)設(shè)計(jì)與優(yōu)化探索 論文
- 大學(xué)生勞動教育教程全套PPT完整教學(xué)課件
- GB/T 985.1-2008氣焊、焊條電弧焊、氣體保護(hù)焊和高能束焊的推薦坡口
- GB/T 15970.7-2000金屬和合金的腐蝕應(yīng)力腐蝕試驗(yàn)第7部分:慢應(yīng)變速率試驗(yàn)
- 制度經(jīng)濟(jì)學(xué):05團(tuán)隊(duì)生產(chǎn)理論
- 作文格子紙(1000字)
- 刻度尺讀數(shù)練習(xí)(自制)課件
- 四年級下冊美術(shù)課件 4紙卷魔術(shù)|蘇少版
- 七年級數(shù)學(xué)蘇科版下冊 101 二元一次方程 課件
- ZL50裝載機(jī)工作裝置設(shè)計(jì)
評論
0/150
提交評論