当前位置: 代码网 > it编程>编程语言>Asp.net > ADO.NET基础知识详解

ADO.NET基础知识详解

2024年05月18日 Asp.net 我要评论
ado.net是微软提供的一种数据库访问技术。ado.net为不同类型的数据源提供了不同的数据提供程序对象:数据提供程序说明sql server 数据提供程序提供对microsoft sql serv

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基础知识的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持代码网。

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com