


版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第2章数据库高级编程ADO.NET是为.NET框架而创建的,是对ADO(ActiveXDataObjects)对象模型的扩充。ADO.NET提供了一组数据访问服务的类,可用于对MicrosoftSQLServer、Oracle等数据源的一致访问。ADO.NET模型分为.NETDataProvider(数据提供程序)和DataSet数据集(数据处理的核心)两大主要部分。.NET数据提供程序提供了四个核心对象,分别是Connection、Command、DataReader和DataAdapter对象。功能如表2-1所示。表2-1ADO.NET核心对象对象功能Connection田供和数据源的挥榜
2、功能Command提供访问数据库命令,执行查询数据或修改数据的功能,例如运行SQLDataReader从数据源中读取只向前的且只读的数据流DataAdapter是DataSet对象和数据源间的桥梁。DataAdapter使用4个Command冲家来您打查询、""DataSet,2.1SQLServer相关配置在使用C#访问数据库之前,首先创建一个名为“chap2”的数据库,此数据库作为2.1节及2.2节中例题操作的默认数据库。然后创建数据表Products,表结构如表2-2所示。创建完毕后可录入初始化数据若干条。表2-2Products表表结构字号列名断坦米刑长度主键/JJ
3、1ProductID品幺扁char4主键/LJJ11_L否2ProductName商品名称nvarchar403SupplierName供应商名称nvarchar40否4CategoryName商品类别名称nvarchar40否5UnitPrice单价money否6UnitsInStock库存量smallint否7Discount是否折扣char1否卜面首先介绍几个SQLServer2012的常用操作。这些操作都是初学者在实践环节及上机课的操作中出现问题较多的地方。1.身份验证方式SQLServer2012在安装时默认是使用Windows验证方式的,但是安装过后用户可随时修改身份验证方式。启动
4、SQLServer2012ManagementStudio,在"连接到服务器"对话框中选择"Windows身份验证”连接服务器,连接成功后,在窗体左侧的“对象资源管理器”中右键单击服务器实例节点,并在弹出的快捷菜单中选择“属性”菜单项,系统将弹出“服务器属性”窗体,切换至“安全性”选项卡,如图2-1所示。*内处itit稀靠由1IF亏者却雌还Vitrt耳闫骸任橘式里SLmr10Vlnlw耳而蛤证舰吏二史?!节里无7伽茶般任#曰.但l*KE潮皇泵U生!MlEi*.!11白闩砂暑FN户M)E心|C心辱is它/涉3神:江I曰用C2率氏沼村1'¥的衅:H戒
5、京#.i*;FVF图2-1“服务器属性”对话框“安全性”选项卡在"服务器身份验证"部分选择SQLServer和Windows身份验证模式"选项,并单击【确定】按钮。系统将提示需要重新启动SQLServer以使配置生效,如图2-2所示。图2-2系统提示框右键单击“对象资源管理器”的服务器实例节点,在弹出的快捷菜单中选择“重新启动”菜单项,SQLServer将重新启动服务,重启成功后即可使用混合验证方式登录SQLServer服务器。2.添加登录账户大部分初学者都习惯于使用SQLServer的系统管理员账号“sa”来登录数据库服务器,而在实际工作环境中使用sa账号登录服
6、务器是不合理的。因为很多情况下系统的数据库是部署在租用的数据库服务器上的,此时数据库设计人员或编程人员都不可能具有sa账号的使用权限,因此在将身份验证方式修改为SQLServer和Windows混合验证后,需要为某应用程序创建一个专用的登录账户。其操作步骤描述如下。(1) 使用Windows身份验证登录SQLServer,在对象资源管理器中点击"安全性"节点前面的加号"+';在展开后的“登录名”子节点上单击右键,如图2-3所示,并在弹出的快捷菜单中选择“新建登录名”选项。图2-3登录名节点的右键菜单(2) 系统弹出“登录名一新建”对话框中,如图2-4所示。
7、首先在登录名输入框中填写需要创建的用户名,此处以“zd”为例;将身份验证方式选为“SQLServer身份验证”,为新建账户设置密码为“123;同时去除“强制实施密码策略”和“用户在下次登录时必须更改密码”选项;最后为账户选择默认数据库“chap2:图2-4“登录名新建”对话框“常规”选项卡服务器角色节点不予配置。有关SQLServer服务器角色请参考相关资料,此处不再详细介绍。(3) 在对话框左侧选项卡中选择“用户映射”节点,如图2-5所示,在“映射到此登录名的用户”列表中,勾选此前创建好的数据库“chap2';在窗体右下方的“数据库角色成员身份”框里选择“db_Owner';
8、即数据库拥有者。透牌直_r宣旧%郭即也用咛堂一1xdlr“匕*ricdalriLdh虞吁h*tEwvn-)tZwvvs't'arj-Iii.-.m-71嫌V-7涯:ETP-«'>Aiihiin喜*霆电IKhej-w钢Mrdb-侦4T.尊也db.GitrLtir晶ffl,:赢金Jb_占9«iw图2-5“登录名新建”对话框“用户映射”选项卡(4) 安全对象节点一般不予配置。(5) 在对话框左侧选项卡中选择“状态”节点,如图2-6所示,将“是否允许连接到数据库引擎”选项设为“授予;同时将“登录”选项设为“启用”以上各节点配置完成后单击【确定】按钮,即
9、完成了对账户的创建工作。图2-6“登录名新建”对话框“状态配置”选项卡(6) 新建账户完成后,重新连接SQLServer,如图2-7所示,选择SQLServer身份验证方式,输入前面设置的登录名“zd”及密码123';点击【连接】按钮,即可完成登录。登录成功后在对象资源管理器中可看到服务器实例名后面显示的登录用户名,如图2-8所示。±4蛀.略村丘不SQLServersHi毒理-I*册帅化,an#剧耳迥,34-ssEmg痈8MJHfflrfWJA图2-8对象资源管理器图2-7“连接到服务器”对话框2.2使用ADO.NET访问数据库2.2.1连接数据库在对数据源进行操作之前,首先
10、需建立到数据源的连接,可使用Connection对象显式创建到数据源的连接。【例2-1】设计一个Windows应用程序,能通过“Windows验证"和Windows和SQLServer混合验证”两种方式建立到数据库的连接。图2-9"连接数据库”窗体控件Tab顺序实现过程如下。新建一Windows应用程序,命名为connection,将创建的默认窗体名更名为frmConnect,窗体的Text属性设置为"连接数据库”,界面设计如图2-9所示。frmConnect窗体中的主要控件,按Tab键顺序,描述如表2-3所示。表2-3“连接数据库”窗体控件及说明Tab顺序控件类
11、型控件名称说明主要属性属性名属性值0ButtonbtnConnect1Windows身份验证方式连接数据库TextWindows验证1btnConnect2混合验证方式连接数据库Text混合验证(2)主要程序代码说明:本节内所有例题代码均需引用System.Data.SqlClient命名空间,代码如下:usingSystem.Data.SqlClient;/添加对SQLServer数据访问对象的引用后续例题不再逐一说明。 由于篇幅所限,本节中所有例题的异常捕获代码都省略了,读者需自行添加获取控件输入及访问数据库等处的异常捕获代码。双击【Windows验证】按钮,进入其Click事件处理函数,
12、代码如下:/Windows方式连接数据库privatevoidbtnConnect1_Click(objectsender,EventArgse)stringstrConn="server=XP-4;database=chap2;integratedsecurity=true"/连接字符串SqlConnectionconn=newSqlConnection(strConn);/创建连接对象conn.Open();/打开连接如连接成功则弹出消息框提示MessageBox.Show(”数据库已通过集成验证方式连接成功”,”连接状态对话框");conn.Close();
13、/使用完毕后关闭数据库连接)双击【混合验证】按钮,进入其Click事件处理函数,填写代码如下。/SQLServer+Windows方式连接数据库privatevoidbtnConnect2_Click(objectsender,EventArgse)stringstrConn="server=XP-4.;database=chap2;uid=zd;pwd=123"/连接字符串SqlConnectionconn=newSqlConnection(strConn);/创建连接对象conn.Open();打开连接如连接成功则弹出消息框提示MessageBox.Show(”数据库已
14、通过混合验证方式连接成功”,”连接状态对话框");conn.Close();/使用完毕后关闭数据库连接)数据库连接字符串包含要连接的数据库的信息,如server属性指定数据库服务器名称,database属性指定数据库名称,使用Windows身份验证方式只需要给出server和database两个属性的值,并使用aintegratedsecurity=true”指定身份验证方式为Windows验证;当使用混合验证时则需要使用uid属性指定数据库账户、pwd属性指定该账号的密码。说明:上例中的连接字符串中的用户名“zd”和密码123';是以本节“添加登录账户”的方式创建的,读者可
15、自行修改为自己计算机的SQLServer登录名及密码。运行程序,分别单击【Windows验证】和【混合验证】两个按钮,如连接成功,将分别弹出不同的连接状态对话框,如图2-10所示。图2-10连接状态对话框2.2.2对数据库进行添加、修改及删除操作在创建好到数据库的连接之后,可以使用Command对象对数据库进行更新操作。【例2-2】设计一个Windows应用程序,能实现对数据库表的添加、修改及删除操作。实现过程:(1)新建一Windows应用程序,命名为operateData,将创建的默认窗体名更名为frmCommand,窗体的Text属性设置为"对数据库执行添加、修改及删除操作&q
16、uot;,界面设计如图2-11所示。frmCommand窗体中的主要控件,按Tab键顺序,描述如表2-4所示。图2-11"对数据库进行添加、修改及删除操作”窗体Tab顺序视图表2-4“对数据库执行添加、修改及删除操作”窗体控件及说明Tab顺序控件类型控件名称说明主要属性属性名属性值0ButtonbtnInsert向数据库表添加一条记录Text添加1btnUpdate修改数据库表中的记录Text修改2btnDelete删除数据库表中的记录Text删除(2)主要程序代码 双击【添加】按钮,进入其Click事件处理函数,代码如下。/【添加】按钮单击事件处理函数privatevoidbtnI
17、nsert_Click(objectsender,EventArgse)(stringstrConn="server=XP-4;database=chap2;integratedsecurity=true”;/连接字符串SqlConnectionconn=newSqlConnection(strConn);/声明并创建连接对象conn.Open();/打开数据库连接/向商品表插入一条新记录stringstrSql="insertintoProductsvalues('0012','双层蒸锅,苏泊尔集团,厨具',129.9,100,'f
18、alse')”;SqlCommandcomm=newSqlCommand(strSql,conn);/声明并创建命令对象introw=comm.ExecuteNonQuery();/执行SQL语句,并获取受影响的行数if(row>0)/如果记录插入成功,则弹出消息框提示(MessageBox.Show("插入数据成功","操作状态对话框”);conn.Close();关闭数据库连接 双击【修改】按钮,进入其Click事件处理函数,代码如下。/【修改】按钮单击事件处理函数privatevoidbtnUpdate_Click(objectsender,E
19、ventArgse)(stringstrConn="server=XP-4;database=chap2;integratedsecurity=true"SqlConnectionconn=newSqlConnection(strConn);conn.Open();/修改商品表中的一条记录stringstrSql="updateProductssetUnitsInStock=500whereProductID='0012'"SqlCommandcomm=newSqlCommand(strSql,conn);introw=comm.Exec
20、uteNonQuery();if(row>0)(MessageBox.Show("修改数据成功","操作状态对话框");)conn.Close();) 双击【删除】按钮,进入其Click事件处理函数,代码如下。/【删除】按钮单击事件处理函数privatevoidbtnDelete_Click(objectsender,EventArgse)(stringstrConn="server=XP-4;database=chap2;integratedsecurity=true"SqlConnectionconn=newSqlConne
21、ction(strConn);conn.Open();/删除商品表中的一条记录stringstrSql="deletefromProductswhereProductID='0012'"SqlCommandcomm=newSqlCommand(strSql,conn);introw=comm.ExecuteNonQuery();if(row>0)(MessageBox.Show("删除数据成功","操作状态对话框");)conn.Close();)运行程序,分别单击【添加】、【修改】和【删除】按钮,如操作成功,将
22、分别弹出不同的操作状态对话框,如图2-12所示。对于数据库记录的修改情况,读者可同时从SQLServer管理控制台访问数据库chap2的Products表进行验证。图2-12操作状态对话框2.2.3查询数据库中的数据【例2-3】设计一个Windows应用程序,使用DataReader查询数据库中的信息并加载到ComboBox控件的选项中。实现过程:(1)新建一Windows应用程序,命名为testDataReader,将创建的默认窗体名更名为frmProducts,窗体的Text属性设置为"商品类别及名称",界面设计如图2-13所示。frmProducts窗体中的主要控件,
23、按Tab键顺序,描述如表2-5所示。图2-13"商品类别及名称”窗体Tab键顺序视图表2-5“商品类别及名称”窗体控件及说明主要属性Tab顺序控件类型控件名称说明属性名属性值0ComboBoxcomboCategory所有商品类别名称DropDownStyleDropDownList1comboProducts某商品类别下的商品名称DropDownStyleDropDownList说明:界面中不参与编程的Label控件不再进行说明,以下各例题均同样处理。(1) 主要程序代码双击窗体标题栏,进入Load事件处理函数,访问数据库,为“商品类别”下拉框加载数据,代码如下。/窗体加载事件处理
24、函数,为“商品类别”组合框加载所有的商品类别数据privatevoidfrmProducts_Load(objectsender,EventArgse)(stringstrConn="server=XP-4;database=chap2;integratedsecurity=true”;/连接字符串SqlConnectionconn=newSqlConnection(strConn);声明并创建连接对象conn.Open();/打开数据库连接stringstrSql="selectdistinctCategoryNamefromProducts"/查询SqlCom
25、mandcomm=newSqlCommand(strSql,conn);SqlDataReaderdr=comm.ExecuteReader();while(dr.Read()comboCategory.Items.Add(dr0);/依次加载数据项至ComboBoxdr.Close();conn.Close();双击商品类别下拉框,进入其SelectedIndexChanged事件处理函数,根据其选项为“商品名称”下拉框加载数据,代码如下。/“商品类别”下拉框选项索引变化事件处理函数,/根据商品类别下拉框中的选项加载该类别下的所有的商品名称privatevoidcomboCategory_S
26、electedIndexChanged(objectsender,EventArgse)(comboProducts.Items.Clear();stringstrConn="server=XP-4;database=chap2;integratedsecurity=true"SqlConnectionconn=newSqlConnection(strConn);conn.Open();stringstrSql="selectProductNamefromProductswhereCategoryName='"+comboCategory.Tex
27、t+""'SqlCommandcomm=newSqlCommand(strSql,conn);SqlDataReaderdr=comm.ExecuteReader();while(dr.Read()comboProducts.Items.Add(dr0);dr.Close();conn.Close();【例2-4】使用DataAdaper和DataSet对象查询数据库中的信息并加载到ComboBox控件的选项中。实现过程:(1)新建一Windows应用程序,命名为dataSet,将创建的默认窗体名更名为frmProducts,窗体及各主要控件的属性设置同例2-3。(
28、2)主要程序代码 双击窗体标题栏,进入其Load事件处理函数,访问数据库,为“商品类别”下拉框加载数据,代码如下。窗体加载事件处理函数,为“商品类别”组合框加载所有的商品分类数据。privatevoidfrmProducts_Load(objectsender,EventArgse)stringstrConn="server=XP-4;database=chap2;integratedsecurity=true"/连接字符串SqlConnectionconn=newSqlConnection(strConn);声明并创建连接对象stringstrSql="sele
29、ctdistinctCategoryNamefromProducts"查询不重复的商品类别名称SqlDataAdapterda=newSqlDataAdapter(strSql,conn);/声明并创建数据适配器对象DataSetds=newDataSet();声明并创建数据集对象da.Fill(ds);使用数据适配器填充数据集comboCatagory.DataSource=ds.Tables0;设置商品类别下拉框数据源comboCatagory.DisplayMember="CategoryName"设置商品类别下拉框的显示属性双击"商品类别&quo
30、t;下拉框,进入其SelectedIndexChanged事件处理函数,根据其选中项为“商品名称”下拉框加载数据,代码如下。/“商品类别”下拉框选项索引变化事件处理函数,/根据商品类别下拉框中的选项加载该类别下的所有的商品名称privatevoidcomboCatagory_SelectedIndexChanged(objectsender,EventArgse)(stringstrConn="server=XP-4;database=chap2;integratedsecurity=true"SqlConnectionconn=newSqlConnection(strCo
31、nn);/根据“商品类别”下拉框中的选项查询商品名称stringstrSql="selectProductNamefromProductswhereCategoryName="'+comboCategory.Text+""'SqlDataAdapterda=newSqlDataAdapter(strSql,conn);DataSetds=newDataSet();da.Fill(ds);comboProducts.DataSource=ds.Tables0;/设置商品名称下拉框的数据源comboProducts.DisplayMember
32、="ProductName"/设置商品名称下拉框的显示属性思考:细心的同学会发现,例2-3和例2-4虽然运行界面完全相同,但是窗体加载之后列表框中选项的情况是有区别的。那么,区别在哪呢?原因又是什么呢?2.2.4数据绑定控件【例2-5】设计一个Windows应用程序,能实现商品信息的维护。本例题中,程序要读取数据库中的数据,加载数据至ListBox和ComboBox控件,并根据用户在ListBox控件中选择的数据项再次访问数据库,获取相关记录。另外,本例题还实现了对商品表Products的增加、修改及删除操作。图2-14“商品信息管理”窗体Tab键顺序视图实现过程:(1)新
33、建一Windows应用程序,命名为products,将创建的默认窗体名更名为frmProducts,窗体的Text属性设置为"商品信息管理",界面设计如图2-14所示。frmProducts窗体中的主要控件,按Tab键顺序,描述如表2-6所示。表2-6“商品信息管理”窗体控件及说明Tab顺序控件类型控件名称说明主要属性属性名属性值0TextBoxtxtID输入和显示商品编号ReadonlyTrue1txtName输入和显示商品名称ReadonlyTrue2txtSupplier输入和显示供应商名称ReadonlyTrue3ComboBoxcomboCategory输入和显示
34、商品类别EnabledFalse4TextBoxtxtUnitPrice输入和显示商品单价ReadonlyTrue5txtUnitsInStock输入和显示库存数量ReadonlyTrue6CheckBoxchkDisc输入和显示是否打折EnabledFalse7ButtonbtnInsert添加商品EnabledTrue8btnUpdate修改商品EnabledTrue9btnSave保存数据EnabledFalse10btnCancle取消编辑EnabledFalse11btnDelete删除数据EnabledTrue12ListBoxlstProducts商品名称列表EnabledTru
35、e(2)主要程序代码 首先要为该程序添加两个成员变量,代码如下:stringstrConn="server=XP-4;database=chap2;integratedsecurity=true"/连接字符串stringinsertORupdate=""标识变量,用来记录要保存的是添加还是修改操作 自定义方法DataLoad(),访问数据库,加载商品类别列表及商品名称列表,代码如下。/<summary>/访问数据库,加载商品类别列表及商品名称列表/</summary>voidDataLoad()/以下代码使用DataReader访
36、问数据库SqlConnectionconn=newSqlConnection(strConn);/创建连接对象conn.Open();打开连接stringstrSql="selectdistinctCategoryNamefromProducts"/查询不重复的商品类别名SqlCommandcomm=newSqlCommand(strSql,conn);/声明并创建命令对象SqlDataReaderdr=comm.ExecuteReader();/执行查询,用DataReader存放数据while(dr.Read()如果查询到数据comboCategory.Items.Ad
37、d(dr0);逐项加载商品类别名至ComboBoxdr.Close();/关闭dataReader/以下代码使用DataAdapter和DataSet访问数据库strSql="selectProductName,ProductIDfromProducts"/查询商品名称及商品编号SqlDataAdapterda=newSqlDataAdapter(strSql,conn);/声明并创建数据适配器对象DataSetds=newDataSet();声明并创建数据集对象da.Fill(ds);/填充数据集lstProducts.DataSource=ds.Tables0;设置商品
38、名称列表的数据源lstProducts.DisplayMember="ProductName"/设置显示值属性lstProducts.ValueMember="ProductID"/设置实际值属性conn.Close();关闭连接lstProducts.SelectedIndex=-1;/使商品名称列表没有选中项商品管理窗体的Load事件处理函数,就是调用DataLoad()方法,代码如下。窗体加载事件处理函数privatevoidfrmProducts_Load(objectsender,EventArgse)DataLoad();声明自定义方法con
39、trolEnabled(),控制各输入控件在“查看”和“编辑”操作时的可用性,代码如下。/自定义方法,控制控件的可用性,将控件可用性分为查看”和编辑”两种状态publicvoidcontrolEnabled(stringstatus)if(status="show")当前为查看数据状态,控件都不可编辑btnInsert.Enabled=true;btnUpdate.Enabled=true;btnSave.Enabled=false;btnCancle.Enabled=false;btnDelete.Enabled=true;chkDisc.Enabled=false;co
40、mboCategory.Enabled=false;foreach(Controlcinthis.Controls)if(cisTextBox)(TextBoxtxtb=(TextBox)c);txtb.ReadOnly=true;)else当前为编辑数据状态,控件可用(btnInsert.Enabled=false;btnUpdate.Enabled=false;btnSave.Enabled=true;btnCancle.Enabled=true;btnDelete.Enabled=false;chkDisc.Enabled=true;comboCategory.Enabled=true;
41、foreach(Controlcinthis.Controls)(if(cisTextBox)(TextBoxtxtb=(TextBox)c);txtb.ReadOnly=false;)查询该双击lstProducts控件,进入其选项索引变化事件处理函数,根据选择的商品,商品其他信息,并为界面其他控件赋值,代码如下。商品名称列表选项索引变化事件,根据选择的商品名称加载商品其他信息privatevoidlstProducts_SelectedIndexChanged(objectsender,EventArgse)(用来判断用户是否选中了有效的选项,且保证是数据加载后用户进行的操作if(lstP
42、roducts.SelectedIndex!=-1)&&(lstProducts.SelectedValue.ToString()!="System.Data.DataRowView")(stringproId=lstProducts.SelectedValue.ToString();获取当前选中商品的商品编号SqlConnectionconn=newSqlConnection(strConn);声明并创建连接对象conn.Open();/打开数据库连接stringstrSql="select*fromProductswhereProductId=
43、'"+proId+""'/由商品编号查询该商品其他信息SqlCommandcomm=newSqlCommand(strSql,conn);/声明并创建命令对象SqlDataReaderdr=comm.ExecuteReader();/使用DataReader获取查询结果if(dr.Read()/如果查询到数据,就将该商品各字段的值赋予窗体各控件用以显示txtID.Text=dr"ProductID".ToString();txtName.Text=dr"ProductName".ToString();txtS
44、upplier.Text=dr"SupplierName".ToString();comboCategory.Text=dr"CategoryName".ToString();txtUnitPrice.Text=dr"UnitPrice".ToString();txtUnitsInStock.Text=dr"UnitsInStock".ToString();chkDisc.Checked=(dr"Discount".ToString()="True”?true:false;dr.Clo
45、se();/关闭DataReaderconn.Close();关闭连接controlEnabled("show");将控件设置为查看状态说明:由于为ListBox控件加载选项时会触发SelectedIndexChanged事件,此时获取到的ListBox.SelectedValue.ToString()值为System.Data.DataRowView';而不是经用户选择过的商品编号,程序需过滤掉这种情况。只有完成ListBox控件的选项加载后,经用户选择某条商品数据时,程序才进行后续操作,如下代码即可实现这种过滤功能。if(lstProducts.Selected
46、Index!=-1)&&(lstProducts.SelectedValue.ToString()!="System.Data.DataRowView") 双击btnInsert按钮,进入其Click事件处理函数,清空所有输入控件并使其为可编辑状态,设置编辑状态为insert,真正的插入操作在btnSave的Click事件处理函数中进行。代码如下。/【添加】按钮单击事件处理函数privatevoidbtnInsert_Click(objectsender,EventArgse)(insertORupdate="insert"设置标识变量为
47、添加操作controlEnabled("edit");将控件设置为编辑状态/清空所有控件foreach(Controlcinthis.Controls)(if(cisTextBox)(TextBoxtxtb=(TextBox)c);txtb.Text="”;comboCategory.SelectedIndex=-1;chkDisc.Checked=false;双击btnUpdate按钮,进入其Click事件处理函数,使各输入控件为可编辑状态,设置编辑状态为update,真正的修改操作在btnSave的Click事件处理函数中进行。代码如下。/【修改】按钮单击事件
48、处理函数privatevoidbtnUpdate_Click(objectsender,EventArgse)(controlEnabled("edit");txtID.ReadOnly=true;商品编号不能修改insertORupdate="update"设置标志变量为修改操作双击btnSave按钮,进入其Click事件处理函数,根据编辑状态对数据库进行insert或update操作,代码如下。/【保存】按钮单击事件处理函数,完成添加和修改操作privatevoidbtnSave_Click(objectsender,EventArgse)(SqlC
49、onnectionconn=newSqlConnection(strConn);声明并创建连接对象conn.Open();/打开数据库连接下面一段代码将保存添加的商品数据if(insertORupdate="insert")(stringstrSql="insertintoProductsvalues(ProductID,ProductName,SupplierName,CategoryName,UnitPrice,UnitsInStock,Discount)"SqlCommandcomm=newSqlCommand(strSql,conn);comm.
50、Parameters.Add(newSqlParameter("ProductID",txtID.Text);comm.Parameters.Add(newSqlParameter("ProductName",txtName.Text);comm.Parameters.Add(newSqlParameter("SupplierName",txtSupplier.Text);comm.Parameters.Add(newSqlParameter("CategoryName",comboCategory.Text);c
51、omm.Parameters.Add(newSqlParameter("UnitPrice",float.Parse(txtUnitPrice.Text);comm.Parameters.Add(newSqlParameter("UnitsInStock",float.Parse(txtUnitsInStock.Text);comm.Parameters.Add(newSqlParameter("Discount",(chkDisc.Checked=true?"1":”0”);if(comm.ExecuteNonQ
52、uery()>0)MessageBox.Show("添加商品信息成功!”);elseMessageBox.Show("添加商品信息失败!”);)下面一段代码将保存修改的商品数据else(stringstrSql="updateProductssetProductName=ProductName,SupplierName=SupplierName,CategoryName=CategoryName,UnitPrice=UnitPrice,UnitsInStock=UnitsInStock,Discount=DiscountwhereProductID=Prod
53、uctID"SqlCommandcomm=newSqlCommand(strSql,conn);comm.Parameters.Add(newSqlParameter("ProductID”,txtID.Text);comm.Parameters.Add(newSqlParameter("ProductName”,txtName.Text);comm.Parameters.Add(newSqlParameter("SupplierName”,txtSupplier.Text);comm.Parameters.Add(newSqlParameter(&qu
54、ot;CategoryName",comboCategory.Text);comm.Parameters.Add(newSqlParameter("UnitPrice",float.Parse(txtUnitPrice.Text);comm.Parameters.Add(newSqlParameter("UnitsInStock”,float.Parse(txtUnitsInStock.Text);comm.Parameters.Add(newSqlParameter("Discount”,(chkDisc.Checked=true?"
55、;1":"0");if(comm.ExecuteNonQuery()>0)MessageBox.Show("更新商品信息成功!");elseMessageBox.Show("更新商品信息失败!");)conn.Close();关闭数据库连接DataLoad();/重新访问数据库,刷新界面显示的商品信息controlEnabled("show");/将控件设置为查看状态)说明:代码中出现的SqlParameter类为SQL命令对象类。命令对象可使用参数来将值传递给SQL语句或存储过程,提供类型检查和验
56、证。与命令文本不同,参数输入被视为文本值,而不是可执行代码。这样可帮助抵御“SQL注入”攻击,这种攻击的攻击者会将命令插入SQL语句,从而危及服务器的安全。一般来说,在更新DataTable或是DataSet时,如果不采用SqlParameter,那么当输入的Sql语句出现歧义时,如字符串中含有单引号,程序就会发生错误,并且他人可以轻易地通过拼接Sql语句来进行注入攻击。参数化命令还可提高查询执行性能,因为它们可帮助数据库服务器将传入命令与适当的缓存查询计划进行准确匹配。除具备安全和性能优势外,参数化命令还提供一种用于组织传递到数据源的值的便捷方法。双击btnCancel按钮单击事件处理函数,
57、控制各输入控件的可编辑状态,恢复查看状态,代码如下。/【取消】按钮单击事件处理函数,退出编辑状态privatevoidbtnCancle_Click(objectsender,EventArgse)(controlEnabled("show");/将控件设置为查看状态) 双击btnDelete按钮,进入其Click事件处理函数,根据选择商品的编号删除该商品信息,代码如下。/【删除】按钮单击事件处理函数privatevoidbtnDelete_Click(objectsender,EventArgse)(SqlConnectionconn=newSqlConnection(s
58、trConn);conn.Open();stringstrSql="deletefromProductswhereProductID=ProductID”;SqlCommandcomm=newSqlCommand(strSql,conn);comm.Parameters.Add(newSqlParameter("ProductID”,txtID.Text);if(comm.ExecuteNonQuery()>0)MessageBox.Show("删除商品信息成功!”);elseMessageBox.Show("删除商品信息失败!”);conn.Close();关闭数据库连接DataLoad();/重新访问数据库,刷新界面显示的商品信息controlEnabled("show");/将控件设置为查看状态)运行程序,显示“商品信息管理”界面。界面左侧的商品名称列表中加载了所有的商品名称。点击任一商品名称,右侧商品详细信息区域的各控件中将加载该商品记录的其他字段,如图2-15。【添加】、【修改】及【删除】按钮可用,【保存】及【取消】按钮不可用。3t亩品辰号:0EC5供也鬲:苏口亍黔怖i1建州:厅日单:。或90加:式口TtXB.ifi图2-15“商品信息管理”
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 纺织品设计师规划设计试题及答案
- 防讯培训考试题及答案
- 纺织品设计师必考知识点与试题答案
- 2024年磁罗盘项目资金申请报告代可行性研究报告
- 学校零星修建合同协议书
- 《风力发电机风道原理与应用》课件
- 培训机构学员合同协议书范本
- 绿化养护考试题及答案
- 合作联盟合同协议书
- 阴地合同协议书
- 工业管道的分类和分级
- 浅谈脓毒血症的集束化治疗及护理-PPT课件
- 新部编版《道德与法治》五年级下册第7课《不甘屈辱 奋勇抗争》优质课件(含视频)
- 架子工班组承包协议
- 机器人任务规划
- 化验室化学试剂台账范例
- 杨家湾220KV变电站工程预算表
- 易拉罐回收机设计毕业设计
- 第七课:构图的形式
- 六类网线检测报告(共9页)
- 教师素养试题及答案
评论
0/150
提交评论