自强不息,厚德载物!身心自在,道法自然!


初始ADO.NET数据操作

以下介绍直接来源与百度百科,介绍十分全面和详细,作为小菜的我们没有理由不看完这些枯燥的介绍原有:

       ADO.NET的名称起源于ADO(ActiveX Data Objects),是一个COM组件库,用于在以往的Microsoft技术中访问数据。之所以使用ADO.NET名称,是因为Microsoft希望表明,这是在NET编程环境中优先使用的数据访问接口。  

1简介

ado.net可让开发人员以一致的方式存取资料来源(例如 SQL ServerXML),以及透过 OLE DBODBC 所公开的资料来源。资料共用的消费者应用程序可使用ado.net 来连接至这些资料来源,并且撷取、处理及更新其中所含的资料。
ado.net可将资料管理的资料存取分成不连续的元件,这些元件可分开使用,也可串联使用ado.net也包含 .NET Framework 资料提供者,以用于连接资料库、执行命令和撷取结果。这些结果会直接处理、放入ado.net DataSet 物件中以便利用机器操作 (Ad Hoc)的方式公开给使用者、与多个来源的资料结合,或在各层之间进行传递。DataSet 物件也可以与.NET Framework 资料提供者分开使用,以便管理应用程序本机的资料或来自 XML 的资料。
ado.net类别 (Class) 位于 System.Data.dll 中,而且会与 System.Xml.dll 中的XML 类别整合。
ado.net可为撰写 Managed 程式码的开发人员提供类似于ActiveX Data Objects (ADO)提供给原生元件物件模型 (Component Object Model,COM)开发人员的功能。建议使用ado.net而非ADO来存取.NET 应用程序中的资料。
ADO .NET会提供最直接的方法,让开发人员在 .NET Framework 中进行资料存取。
隐私权声明

System.Data.dll、System.Data.Design.dll、 System.Data.OracleClient.dll、System.Data.SqlXml.dll、 System.Data.Linq.dll、System.Data.SqlServerCe.dll 和 System.Data.DataSetExtensions.dll 组件无法区分使用者的私用资料与非私用资料。这些组件不会收集、储存或传输任何使用者的私用资料。不过,协力厂商应用程序可能会使用这些组件来收集、存储 或传输使用者的私用资料。

3架构

传统的资料处理主要是依赖相互连接的双层式模型。随着资料处理朝多层次架构发展,程式设计人员也逐渐改用中断连接的方式,使应用程序更具延展性(Scalability)。
ADO .NET3.0 中用于存取和管理资料的两个主要元件是 .NET Framework 资料提供者和 DataSet

资料提供者

.NET Framework 资料提供者是一种明确设计用于管理资料以及快速存取顺向只读资料的元件。Connection 物件会提供资料来源的连接。Command 物件可让开发人员存取资料库命令,以便传回资料、修改资料、执行预存程序 (Stored Procedure),并且传送或撷取参数资讯。DataReader 则可提供来自资料来源的高效能资料流。最后,DataAdapter 会提供 DataSet 物件与资料来源之间的桥接器 (Bridge)。DataAdapter 会使用 Command 物件与资料来源处执行 SQL 命令,以便将资料载入 DataSet,并且将 DataSet 内的资料变更调节回资料来源。

DataSet

ado.net DataSet 的设计已明确指出它可独立于任何资料来源外而存取资料。因此,它可与多个不同的资料里来源搭配使用、与 XML 资料搭配使用,或用于管理应用程序的本机资料。DataSet 包含一或多个由资料列和资料行所组成的 DataTable 物件集合,以及 DataTable 物件中的主索引键、外部索引键、条件约束 (Constraint) 及资料的相关资讯。
 

4作用

它提供了平台互用性和可伸缩的数据访问,ADO .NET增强了对非连接编程模式的支持,并支持RICH XML。由于传送的数据都是XML格式的,因此任何能够读取XML格式的应用程序都可以进行数据处理。事实上,接受数据的组件不一定要是ADO .NET组件,它可以是基于一个Microsoft Visual Studio解决方案,也可以是任何运行在其它平台上的任何应用程序。
ado.net是一组用于和数据源进行交互的面向对象类库。通常情况下,数据源是数据库,但它同样也能够是文本文件、Excel表格或者XML文件。
ado.net允许和不同类型的数据源以及数据库进行交互。然而并没有与此相关的一系列类来完成这样的工作。因为不 同的数据源采用不同的协议,所以对于不同的数据源必须采用相应的协议。一些老式的数据源使用ODBC协议,许多新的数据源使用OleDb协议,并且现在还 不断出现更多的数据源,这些数据源都可以通过NET的ADO .NET类库来进行连接。
ado.net提供与数据源进行交互的相关的公共方法,但是对于不同的数据源采用一组不同的类库。这些类库称为Data Providers,并且通常是以与之交互的协议和数据源的类型来命名的。[4]

ado.net是与数据源交互的.NET技术。有许多的Data Providers,它将允许与不同的数据源交流――取决于它们所使用的协议或者数据库。然而无论使用什么样的Data Provider,开发人员将使用相似的对象与 数据源进行交互。SqlConnection对象管理与数据源的连接。SqlCommand对象允许开发人员与数据源交流并发送命令给它。为了对进行快速 的只“向前”地读取数据,使用SqlDataReader。如果想使用断开数据,使用DataSet并实现能进行读取或者写入数据源的 SqlDataAdapter。

5类库

Connection 类

和数据库交互,必须连接它。连接帮助指明数据库服务器、数据库名字、用户名、密码,和连接数据库所需要的其它参数。Connection对象会被Command对象使用,这样就能够知道是在哪个数据源上面执行命令。
与数据库交互的过程意味着必须指明想要执行的操作。这是依靠Command对象执 行的。开发人员使用Command对象来发送SQL语句给数据库。Command对象使用Connection对象来指出与哪个数据源进行连接。开发人员 能够单独使用Command对象来直接执行命令,或者将一个Command对象的引用传递给DataAdapter,它保存了一组能够操作下面描述的一组 数据的命令。

Command对象

成 功与数据建立连接后,就可以用Command对象来执行查询、修改、插入、删除等命令;Command对象常用的方法有ExecuteReader()方 法、ExecuteScalar()方法和ExecuteNonQuery()方法;插入数据可用ExecuteNonQuery()方法来执行插入命 令。

DataReader类

许多数据操作要求开发人员只是读取一串数据。DataReader对象允许开发人员获得从Command对象的SELECT语句得到的结果。考虑性能的因素,从DataReader返回的数据都是快速的且只是“向前”的数据流。这意味着开发人员只能按照一定的顺序从数据流中取出数据。这对于速度来说是有好处的,但是如果开发人员需要操作数据,更好的办法是使用DataSet。C

DataSet对象

DataSet 对象是数据在内存中的表示形式。它包括多个DataTable对象,而DataTable包含列和行,就象一个普通的数据库中的表。开发人员甚至能够定义 表之间的关系来创建主从关系(parent-child relationships)。DataSet是在特定的场景下使用――帮助管理内存中的数据并支持对数据的断开操作的。DataSet是被所有Data Providers使用的对象,因此它并不像Data Provider一样需要特别的前缀。

DataAdapter类

某 些时候开发人员使用的数据主要是只读的,并且开发人员很少需要将其改变至底层的数据源。同样一些情况要求在内存中缓存数据,以此来减少并不改变的数据被数 据库调用的次数。DataAdapter通过断开模型来帮助开发人员方便的完成对以上情况的处理。当在一单批次的对数据库的读写操作的持续的改变返回至数 据库的时候,DataAdapter 填充(fill)DataSet对象。DataAadapter包含对连接对象以及当对数据库进行读取或者写入的时候自动的打开或者关闭连接的引用。另 外,DataAdapter包含对数据的SELECT、INSERT、UPDATE和DELETE操作的Command对象引用。开发人员将为 DataSet中的每一个Table都定义DataAadapter,它将为开发人员照顾所有与数据库的连接。所以开发人员将做的工作是告诉 DataAdapter什么时候装载或者写入到数据库。

Command对象操作数据的

1.使用Command对象查询数据

using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace WebApplication
{
    public partial class DemoCommand : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                //建立数据库链接
                SqlConnection myConn = GetConnection();
                //打开数据库链接
                myConn.Open();
                //定义查询SQL语句
                string sqlStr = "select * from mytable";
                //初始化查询命令
                SqlCommand myCmd = new SqlCommand(sqlStr, myConn);
                //执行查询
                SqlDataReader dr = myCmd.ExecuteReader();
                //读取查询数据
                while (dr.Read())
                {
                    Response.Write(dr[1].ToString() + "<br>");
                }
                myConn.Close();
            }

        }
        private SqlConnection GetConnection()
        {
            //获取配置文件中的数据库链接配置
            string myStr = ConfigurationManager.AppSettings["ConnectionString"].ToString();
            SqlConnection myConn = new SqlConnection(myStr);
            return myConn;
        }
    }

}

 2.使用Command对象添加数据

using System;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;

using System.Data.SqlClient;

public partial class _Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            //建立数据库链接
            SqlConnection myConn = GetConnection();
            //打开数据库链接
            myConn.Open();
            //定义查询SQL语句
            string sqlStr = "insert into tb_Class(ClassName) values('" + TextBox1.Text + "')";
            //初始化查询命令
            SqlCommand myCmd = new SqlCommand(sqlStr, myConn);
            if (myCmd.ExecuteNonQuery() > 0)
            {
                Response.Write("添加成功!");
            }
            else
            {
                Response.Write("添加失败!");
            }
            myConn.Close();
        }
        else
        {
            Response.Write("内容不能为空!");
        }
    }
    public SqlConnection GetConnection()
    {
        //获取配置文件中的数据库链接配置
        string myStr = ConfigurationManager.AppSettings["ConnectionString"].ToString();
        SqlConnection myConn = new SqlConnection(myStr);
        return myConn;
    }
}

 修改删除写法大同小异,不在啰嗦。。。。

使用DataSet对象和DataAdapter对象

     1.使用DataAdapter对象填充DataSet对象

演示如果从Mytable中查询信息,并且调用DataAdapter的Fill方法填充到DataSet数据集,然后将DataSet的数据绑定到GridView。

using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace WebApplication
{
    public partial class DemoDaset : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                //创建一个DataSet数据集
                DataSet ds = new DataSet();
                string sqlStr = "select * from Mytable";
                SqlConnection con = new SqlConnection("Server=MRWXK\\MRWXK;database=db_12;UId=sa;pwd=;");
                SqlDataAdapter dap = new SqlDataAdapter(sqlStr, con);
                //连接数据库
                con.Open();
                //使用SqlDataAdapter对象的Fill方法填充数据集
                dap.Fill(ds, "Student");
                //将数据集中的所有数据显示到GridView控件中
                GridView1.DataSource = ds;
                GridView1.DataBind();
            }
        }
    }
}

 2.使用DataAdapter更新数据库中数据

using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace WebApplication
{
    public partial class DemoDataSet1 : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            //连接字符串及SQL语句
            SqlConnection con = new SqlConnection("Server=mrwxk\\mrwxk;database=db_12;UId=sa;pwd=;");
            con.Open();
            string sqlStr = "select * from MyNewTables ";
            SqlDataAdapter dap = new SqlDataAdapter(sqlStr, con);
            //创建DataSet对象
            DataSet ds = new DataSet();
            //创建SqlCommandBuilder对象,并和SqlDataAdapter关联
            SqlCommandBuilder builder = new SqlCommandBuilder(dap);
            dap.Fill(ds, "News");
            for (int i = 0; i <= ds.Tables["News"].Rows.Count - 1; i++)
            {
                ds.Tables["News"].Rows[i]["NewsContent"] = ds.Tables["News"].Rows[i]["NewsContent"].ToString() + DateTime.Today.ToShortDateString();
            }
            //从DataSet更新SQL Server数据库
            dap.Update(ds, "News");
            GridView1.DataSource = ds;
            GridView1.DataKeyNames = new string[] { "NewsID" };
            GridView1.DataBind();
            dap.Dispose();
            ds.Dispose();
            con.Close();
        }
    }
}

 补充说明:DadaSet中的数据必须至少存在一个主键列或者唯一列,如果不存在主键列或者唯一列,调用Update时将会产生InvalidOperation异常,而且不会生成自动更新数据库的INSERT,UPDATE或者DELETE命令.

 使用DataReader对象

使用DataReader对象读取数据

using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace WebApplication
{
    public partial class DemoDataReader : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                SqlConnection myConn = new SqlConnection("Server=mrwxk\\mrwxk;database=db_12;UId=sa;pwd=;");
                string sqlStr = "select * from Mytable ";
                SqlCommand myCmd = new SqlCommand(sqlStr, myConn);
                myCmd.CommandType = CommandType.Text;
                try
                {
                    //打开数据库连接
                    myConn.Open();
                    //执行SQL语句,并返回DataReader对象
                    SqlDataReader myDr = myCmd.ExecuteReader();
                    //以粗体显示标题
                    string strTxt = "<B>序号 新闻内容</b><br>";
                    //循环读取结果集
                    while (myDr.Read())
                    {
                        //读取数据库中的信息并显示在界面中
                        strTxt += "  " + myDr["NewsID"] + "       " + myDr["NewsContent"] + "<br>";
                    }
                    //关闭DataReader
                    myDr.Close();
                    Response.Write(strTxt);
                }
                catch (SqlException ex)
                {
                    //异常处理
                    Response.Write(ex.ToString());
                }
                finally
                {
                    //关闭数据库的连接
                    myConn.Close();
                }
            }
        }
    }
}

 说明:

     调用Reader方法后,当前行的信息就返回到DataReader对象中,这时从具体的列中访问数据有3种方法。

  • 使用列明索引器。
  • 使用序数索引器。
  • 使用类型访问器。

访问速度最快类型>序数>列名...........

DataReader对象与DataSet对象的区别

DataSet在为用户查询数据时的步骤如下:

  1. 创建DataAdapter对象.
  2. 定义DataSet对象.
  3. 执行DataAdapter对象的Fill方法。
  4. 将DataSet中的表绑定到数据控件中。

DataReader在为用户查询数据时的步骤如下:

  1. 创建连接
  2. 打开连接
  3. 创建Command对象
  4. 执行Command的ExecuteReader方法
  5. 将DataReader绑定到数据控件中
  6. 关闭DataReader
  7. 关闭练级

 

 

posted @ 2014-04-18 00:20  辉太  阅读(1063)  评论(0编辑  收藏  举报

路漫漫其修远兮,吾将上下而求索!