ado.net是微软提供的一种数据库访问技术。
ado.net为不同类型的数据源提供了不同的数据提供程序对象:
数据提供程序 | 说明 |
---|---|
sql server 数据提供程序 | 提供对microsoft sql server中数据的访问,使用system.data.sqlclient命名空间。 |
ole 数据提供程序 | 提供对使用ole db公开的数据源(如access、excel等)中数据的访问,使用system.data.oledb命名空间。 |
odbc 数据提供程序 | 提供对使用odbc公开的数据源中数据的访问,使用system.data.odbc命名空间。 |
数据提供程序中包含了ado.net的四个核心对象:
对象 | 说明 |
---|---|
connection | 建立与特定数据源的连接 |
command | 对数据源执行命令 |
datareader | 从数据源中读取只进只读的数据流 |
dataadapter | 使用数据源填充dataset并支持更新 |
ado.net提供两种方式访问数据库:
连接式访问:整个操作过程中需要保持数据库连接。
断开式访问:只需要在执行数据库命令时保持数据库连接。
一、使用datareader读取数据
使用datareader读取数据属于连接式读取,只能只进的一行一行读取数据,并且不能改变数据,如需要改变数据,必须重新执行insert,update,delete等sql语句来改变数据。
示例:使用datareader读取数据在listview控件显示:
此示例的测试数据如下:
create table member ( memberid int primary key identity(1,1), memberaccount nvarchar(20) unique check(len(memberaccount) between 6 and 12), memberpwd nvarchar(20), membername nvarchar(20), memberphone nvarchar(20) ) insert into member(memberaccount,memberpwd,membername,memberphone) values('liubei','123456','刘备','4659874564') insert into member(memberaccount,memberpwd,membername,memberphone) values('guanyu','123456','关羽','42354234124') insert into member(memberaccount,memberpwd,membername,memberphone) values('zhangfei','123456','张飞','41253445') insert into member(memberaccount,memberpwd,membername,memberphone) values('zhangyun','123456','赵云','75675676547') insert into member(memberaccount,memberpwd,membername,memberphone) values('machao','123456','马超','532523523')
此示例代码如下:
在编写代码之前需要进行listview控件的编辑列操作,并且将视图模式切换成details模式。
private void form1_load(object sender, eventargs e) { //1-编写连接字符串(windows方式连接) string connstr = "integrated security=sspi;persist security info=false;initial catalog=dbtest;data source=."; //2-创建连接对象,打开数据库连接 sqlconnection conn = new sqlconnection(connstr); conn.open(); //3-编写sql语句 string sql = "select * from member"; //4-定义执行命令的对象执行命令 sqlcommand cmd = new sqlcommand(sql, conn); //5-利用datareader读取数据 sqldatareader rd = cmd.executereader(); while (rd.read()) { listviewitem item = new listviewitem(rd["memberid"].tostring()); item.subitems.add(rd["memberaccount"].tostring()); item.subitems.add(rd["memberpwd"].tostring()); item.subitems.add(rd["membername"].tostring()); item.subitems.add(rd["memberphone"].tostring()); this.listview1.items.add(item); } rd.close(); //显示人数 cmd.commandtext = "select count(*) from member"; int count = (int)cmd.executescalar(); this.lblcount.text = "会员人数:" + count; conn.close(); }
二、使用dataadapter的方式抽取数据
dataset是特意为独立于所有数据源的数据访问而设计的,可以理解成内存中的数据库。
在支持ado.net的断开式、分布式数据方案中起着重要的作用。
dataset是数据驻留在内存中的表现形式,无论是什么数据源,它都可以提供一致的编程模型。
dataset支持改变数据然后回传给数据库。
示例:使用dataadapter抽取数据到datatable中,在datagridview中进行显示
此示例的测试数据与文档第一部分测试数据相同。
此示例代码如下:
在编写代码之前需要对datagridview控件进行编辑列操作。
设置datagridview控件的allowusertoaddrows=false实现清楚最后一个空行,selectionmode=fullrowselect实现整行选中模式,用户体验更好。
//窗体加载事件 private void form1_load(object sender, eventargs e) { //1-定义连接字符串 //string connstr = "integrated security=sspi;persist security info=false;initial catalog=dbtest;data source=."; //2-编写连接字符串(sql用户名密码方式连接) string connstr = "server=.;database=dbtest;uid=sa;pwd=123456"; //2-定义连接对象,打开连接 sqlconnection conn = new sqlconnection(connstr); conn.open(); //3-编写sql语句 string sql = "select * from member"; //4-数据适配器抽取信息 sqldataadapter adp = new sqldataadapter(sql, conn); datatable dt = new datatable(); //数据表格 adp.fill(dt); this.datagridview1.autogeneratecolumns = false; //自动列取消 this.datagridview1.datasource = dt; //显示人数 adp.selectcommand.commandtext = "select count(*) from member"; int count = (int)adp.selectcommand.executescalar(); this.lblcount.text = "会员人数:" + count; conn.close(); } //修改数据后跟新数据库的按钮事件 private void btupdate_click(object sender, eventargs e) { //1-定义连接字符串 //string connstr = "integrated security=sspi;persist security info=false;initial catalog=dbtest;data source=."; //2-编写连接字符串(sql用户名密码方式连接) string connstr = "server=.;database=dbtest;uid=sa;pwd=123456"; //2-定义连接对象,打开连接 sqlconnection conn = new sqlconnection(connstr); conn.open(); //3-编写sql语句 string sql = "select * from member"; //4-数据适配器抽取信息 sqldataadapter adp = new sqldataadapter(sql, conn); datatable dt = new datatable(); //数据表格 adp.fill(dt); //添加一条数据 datarow dr = dt.newrow(); dr["memberaccount"] = "weiyan"; dr["memberpwd"] = "123456"; dr["membername"] = "魏延"; dr["memberphone"] = "15352565585"; dt.rows.add(dr); //修改一条数据 dt.rows[1]["memberpwd"] = "654321"; //删除一条数据 dt.rows[4].delete(); //跟新数据到数据库 sqlcommandbuilder sqlbuilder = new sqlcommandbuilder(adp); adp.update(dt); //确认datatable的数据变化,并且重新绑定到控件 dt.acceptchanges(); this.datagridview1.datasource = dt; messagebox.show("数据跟新成功!"); }
三、非查询操作
非查询操作分为"添加","删除","修改"操作,这些操作处理sql语句不同,其他编码是一样的,所以在此文档中以添加操作为例介绍非查询操作。
示例:添加会员信息
此示例的测试数据与文档第一部分测试数据相同。
此示例中通过两种方式添加数据:
- (1)使用dataadapter的command跟新数据
- (2)直接使用sqlcommand对象跟新数据
此示例代码如下:
//方案一:使用dataadapter的command跟新数据 private void btadd1_click(object sender, eventargs e) { //1-定义连接字符串 //string connstr = "integrated security=sspi;persist security info=false;initial catalog=dbtest;data source=."; //2-编写连接字符串(sql用户名密码方式连接) string connstr = "server=.;database=dbtest;uid=sa;pwd=123456"; //2-定义连接对象,打开连接 sqlconnection conn = new sqlconnection(connstr); conn.open(); //3-编写sql语句 string sql = string.format("insert into member(memberaccount,memberpwd,membername,memberphone) values('{0}', '{1}', '{2}', '{3}')" , this.txtaccount.text, this.txtpwd.text, this.txtnickname.text, this.txtphone.text); //4-数据适配器 sqldataadapter adp = new sqldataadapter(sql, conn); //执行sql语句 int rowcount = adp.selectcommand.executenonquery(); conn.close(); if(rowcount == 1) messagebox.show("添加成功!"); else messagebox.show("添加失败!"); } //方案二:直接使用sqlcommand对象跟新数据 private void btadd2_click(object sender, eventargs e) { //1-编写连接字符串(windows方式连接) //string connstr = "integrated security=sspi;persist security info=false;initial catalog=dbtest;data source=."; //2-编写连接字符串(sql用户名密码方式连接) string connstr = "server=.;database=dbtest;uid=sa;pwd=123456"; //2-创建连接对象,打开数据库连接 sqlconnection conn = new sqlconnection(connstr); conn.open(); //3-编写sql语句 string sql = string.format("insert into member(memberaccount,memberpwd,membername,memberphone) values('{0}', '{1}', '{2}', '{3}')" , this.txtaccount.text, this.txtpwd.text, this.txtnickname.text, this.txtphone.text); //4-定义执行命令的对象执行命令 sqlcommand cmd = new sqlcommand(sql, conn); int rowcount = cmd.executenonquery(); conn.close(); if (rowcount == 1) messagebox.show("添加成功!"); else messagebox.show("添加失败!"); }
四、一个窗体中实现会员信息的增加,删除,修改,查询操作
此示例的测试数据与文档第一部分测试数据相同。
业务需求:
- (1)窗体加载的时候显示数据。
- (2)输入字段内容,点击新增按钮,可以添加数据
- (3)鼠标选中一行,右键弹出删除菜单,可以删除数据
- (4)鼠标选中一行,将会员信息在右侧文本框中显示,重新编辑后可以点击修改按钮实现数据的修改
代码如下:
绑定数据的通用方法:
//绑定数据的方法 private void binddata() { //1-定义连接字符串 //string connstr = "integrated security=sspi;persist security info=false;initial catalog=dbtest;data source=."; //2-编写连接字符串(sql用户名密码方式连接) string connstr = "server=.;database=dbtest;uid=sa;pwd=123456"; //2-定义连接对象,打开连接 sqlconnection conn = new sqlconnection(connstr); conn.open(); //3-编写sql语句 string sql = "select * from member"; //4-数据适配器抽取信息 sqldataadapter adp = new sqldataadapter(sql, conn); datatable dt = new datatable(); //数据表格 adp.fill(dt); this.datagridview1.autogeneratecolumns = false; //自动列取消 this.datagridview1.datasource = dt; conn.close(); }
窗体加载事件代码:
//窗体加载事件 private void form1_load(object sender, eventargs e) { binddata(); }
新增按钮的点击事件代码:
//添加信息按钮事件 private void btadd_click(object sender, eventargs e) { //1-编写连接字符串(windows方式连接) //string connstr = "integrated security=sspi;persist security info=false;initial catalog=dbtest;data source=."; //2-编写连接字符串(sql用户名密码方式连接) string connstr = "server=.;database=dbtest;uid=sa;pwd=123456"; //2-创建连接对象,打开数据库连接 sqlconnection conn = new sqlconnection(connstr); conn.open(); //3-编写sql语句 string sql = string.format("insert into member(memberaccount,memberpwd,membername,memberphone) values('{0}', '{1}', '{2}', '{3}')" , this.txtaccount.text, this.txtpwd.text, this.txtnickname.text, this.txtphone.text); //4-定义执行命令的对象执行命令 sqlcommand cmd = new sqlcommand(sql, conn); int rowcount = cmd.executenonquery(); conn.close(); if (rowcount == 1) messagebox.show("添加成功!"); else messagebox.show("添加失败!"); binddata(); }
datagridview控件的点击事件代码:
//网格控件的点击事件 private void datagridview1_click(object sender, eventargs e) { //当allowusertoaddrows=true的时候,防止用户选择最后一个空行 if (this.datagridview1.selectedrows[0].cells[0].value.tostring().equals("")) { messagebox.show("请正确选择!"); return; } int memid = int.parse(this.datagridview1.selectedrows[0].cells[0].value.tostring()); //messagebox.show(memid.tostring()); //1-定义连接字符串 string connstr = "integrated security=sspi;persist security info=false;initial catalog=dbtest;data source=."; //2-定义连接对象,打开连接 sqlconnection conn = new sqlconnection(connstr); conn.open(); //3-编写sql语句 string sql = "select * from member where memberid = " + memid; //-抽取数据 sqldataadapter adp = new sqldataadapter(sql, conn); datatable dt = new datatable(); adp.fill(dt); conn.close(); this.txtaccount.text = dt.rows[0]["memberaccount"].tostring(); this.txtpwd.text = dt.rows[0]["memberpwd"].tostring(); this.txtnickname.text = dt.rows[0]["membername"].tostring(); this.txtphone.text = dt.rows[0]["memberphone"].tostring(); }
修改按钮的点击事件代码:
//修改按钮的点击事件 private void btupdate_click(object sender, eventargs e) { int memid = int.parse(this.datagridview1.selectedrows[0].cells[0].value.tostring()); string connstr = "integrated security=sspi;persist security info=false;initial catalog=dbtest;data source=."; sqlconnection conn = new sqlconnection(connstr); conn.open(); string sql = string.format("update member set memberaccount='{0}',memberpwd='{1}',membername='{2}',memberphone='{3}' where memberid='{4}'" , this.txtaccount.text, this.txtpwd.text, this.txtnickname.text, this.txtphone.text, memid); sqlcommand cmd = new sqlcommand(sql, conn); int rowcount = cmd.executenonquery(); conn.close(); if (rowcount == 1) messagebox.show("修改成功!"); else messagebox.show("修改失败!"); binddata(); }
//删除菜单的点击事件代码:
//删除信息弹出菜单事件 private void 删除toolstripmenuitem_click(object sender, eventargs e) { dialogresult r = messagebox.show("您确定要删除吗?", "****系统", messageboxbuttons.yesno); if (r == system.windows.forms.dialogresult.no) { return; } int memid = int.parse(this.datagridview1.selectedrows[0].cells[0].value.tostring()); string connstr = "integrated security=sspi;persist security info=false;initial catalog=dbtest;data source=."; sqlconnection conn = new sqlconnection(connstr); conn.open(); string sql = "delete from member where memberid = " + memid; sqlcommand cmd = new sqlcommand(sql, conn); int rowcount = cmd.executenonquery(); conn.close(); if (rowcount == 1) messagebox.show("删除成功!"); else messagebox.show("删除失败!"); binddata(); }
五、多个窗体中实现会员信息的增加,删除,修改,查询操作
此示例的测试数据与文档第一部分测试数据相同。
业务需求:
- (1)窗体加载的时候显示数据。
- (2)点击"添加数据"按钮,弹出新窗体,在新窗体中进行数据的添加,添加完成后自动刷新表格数据。
- (3)鼠标选中一行,右键弹出删除菜单,可以删除数据
- (4)鼠标选中一行,点击"编辑数据"按钮,弹出新窗体,在新窗体中进行数据修改,修改后自动刷新表格数据。
实现步骤如下:
(1)查询窗体显示数据代码:
//绑定数据的方法 public void binddata() { //1-定义连接字符串 //string connstr = "integrated security=sspi;persist security info=false;initial catalog=dbtest;data source=."; //2-编写连接字符串(sql用户名密码方式连接) string connstr = "server=.;database=dbtest;uid=sa;pwd=123456"; //2-定义连接对象,打开连接 sqlconnection conn = new sqlconnection(connstr); conn.open(); //3-编写sql语句 string sql = "select * from member"; //4-数据适配器抽取信息 sqldataadapter adp = new sqldataadapter(sql, conn); datatable dt = new datatable(); //数据表格 adp.fill(dt); this.datagridview1.autogeneratecolumns = false; //自动列取消 this.datagridview1.datasource = dt; conn.close(); } private void frmselect_load(object sender, eventargs e) { binddata(); }
(2)"删除"菜单代码:
private void 删除toolstripmenuitem_click(object sender, eventargs e) { dialogresult r = messagebox.show("您确定要删除吗?", "****系统", messageboxbuttons.yesno); if (r == system.windows.forms.dialogresult.no) { return; } int memid = int.parse(this.datagridview1.selectedrows[0].cells[0].value.tostring()); string connstr = "integrated security=sspi;persist security info=false;initial catalog=dbtest;data source=."; sqlconnection conn = new sqlconnection(connstr); conn.open(); string sql = "delete from member where memberid = " + memid; sqlcommand cmd = new sqlcommand(sql, conn); int rowcount = cmd.executenonquery(); conn.close(); if (rowcount == 1) messagebox.show("删除成功!"); else messagebox.show("删除失败!"); binddata(); }
(3)会员添加窗体代码:
private void btadd_click(object sender, eventargs e) { //1-编写连接字符串(windows方式连接) //string connstr = "integrated security=sspi;persist security info=false;initial catalog=dbtest;data source=."; //2-编写连接字符串(sql用户名密码方式连接) string connstr = "server=.;database=dbtest;uid=sa;pwd=123456"; //2-创建连接对象,打开数据库连接 sqlconnection conn = new sqlconnection(connstr); conn.open(); //3-编写sql语句 string sql = string.format("insert into member(memberaccount,memberpwd,membername,memberphone) values('{0}', '{1}', '{2}', '{3}')" , this.txtaccount.text, this.txtpwd.text, this.txtnickname.text, this.txtphone.text); //4-定义执行命令的对象执行命令 sqlcommand cmd = new sqlcommand(sql, conn); int rowcount = cmd.executenonquery(); conn.close(); if (rowcount == 1) messagebox.show("添加成功!"); else messagebox.show("添加失败!"); //刷新查询窗体数据并关闭当前窗体 ((frmselect)this.owner).binddata(); this.close(); }
(4)会员编辑窗体代码:
public int memid { get; set; } //接受外部传递过来的会员编号 //绑定会员详情到文本框 private void binddetail() { //1-定义连接字符串 string connstr = "integrated security=sspi;persist security info=false;initial catalog=dbtest;data source=."; //2-定义连接对象,打开连接 sqlconnection conn = new sqlconnection(connstr); conn.open(); //3-编写sql语句 string sql = "select * from member where memberid = " + this.memid; //-抽取数据 sqldataadapter adp = new sqldataadapter(sql, conn); datatable dt = new datatable(); adp.fill(dt); conn.close(); this.txtaccount.text = dt.rows[0]["memberaccount"].tostring(); this.txtpwd.text = dt.rows[0]["memberpwd"].tostring(); this.txtnickname.text = dt.rows[0]["membername"].tostring(); this.txtphone.text = dt.rows[0]["memberphone"].tostring(); } private void frmedit_load(object sender, eventargs e) { binddetail(); } private void btupdate_click(object sender, eventargs e) { string connstr = "integrated security=sspi;persist security info=false;initial catalog=dbtest;data source=."; sqlconnection conn = new sqlconnection(connstr); conn.open(); string sql = string.format("update member set memberaccount='{0}',memberpwd='{1}',membername='{2}',memberphone='{3}' where memberid='{4}'" , this.txtaccount.text, this.txtpwd.text, this.txtnickname.text, this.txtphone.text, this.memid); sqlcommand cmd = new sqlcommand(sql, conn); int rowcount = cmd.executenonquery(); conn.close(); if (rowcount == 1) messagebox.show("修改成功!"); else messagebox.show("修改失败!"); //刷新查询窗体数据并关闭当前窗体 ((frmselect)this.owner).binddata(); this.close(); }
(5)查询窗体"添加数据"和"编辑数据"按钮的代码:
private void btadd_click(object sender, eventargs e) { frmadd frm = new frmadd(); frm.owner = this; frm.show(); } private void btedit_click(object sender, eventargs e) { if (this.datagridview1.selectedrows[0].cells[0].value.tostring().equals("")) { messagebox.show("请正确选择!"); return; } int memid = int.parse(this.datagridview1.selectedrows[0].cells[0].value.tostring()); frmedit frm = new frmedit(); frm.memid = memid; frm.owner = this; frm.show(); }
到此这篇关于ado.net基础知识的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持代码网。
发表评论