250 likes | 409 Views
第 11 章 ADO.NET 数据访问技术. 内容提要. ADO.NET 的结构。 Connection 对象 Command 对象 DataReader 对象 DataAdapter 对象. ADO.NET 的结构. 数据提供程序. 数据提供程序的四个核心对象. SQL Server .NET 数据提供程序.
E N D
内容提要 • ADO.NET的结构。 • Connection对象 • Command对象 • DataReader对象 • DataAdapter对象
数据提供程序 • 数据提供程序的四个核心对象
SQL Server .NET 数据提供程序 • 对应SQL Server.NET的4个核心对象分别是:SqlConnection、SqlCommand、SqlDataReader和SqlDataAdapter。这4个对象包含在System.Data.SqlClient命名控件中,需要将这个命名空间引入到文件中。 • SQL Server.NET数据提供程序对SQL Server数据库的底层操作进行了封装,可以更加快捷的访问SQL Server数据库。目前主要用来操作SQL Server 2000、SQL Server2005 、SQL Server2008 。
OLE DB .NET 数据提供程序 • 对应OLE DB .NET的4个核心对象分别是:OleDbConnection、OleDbCommand、OleDbDataReader和OleDbDataAdapter。这4个对象包含在System.Data.OleDb命名控件中,需要将这个命名空间引入到文件中 • 目前主要用来访问Access、Foxpro等简单的数据源。
Oracle DB .NET数据提供程序 • 对应Oracle DB .NET的4个核心对象分别是:OracleConnection、OracleCommand、OracleDataReader和OracleDataAdapter。这4个对象包含在System.Data.OracleClient命名控件中,需要将这个命名空间引入到文件中。
DataSet简介 • ADO.NET的核心组件是DataSet,DataSet中常用的对象是DataTable和DataRow等等。 • DataSet通过DataAdapter对象从数据源得到数据,DataAdapter是连接DataSet和数据库的一个桥梁,因此命名为:“数据适配器”。
Connection对象 案例名称:使用Connection对象连接Access数据库 Using System.Data.OleDb; void Page_Load(Object sender, EventArgs e) { OleDbConnection Conn; Conn=new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;"+ "Data Source="+Server.MapPath("School.mdb")); Conn.Open(); Message.Text=Conn.State.ToString(); Conn.Close(); } <asp:Label id="Message" runat="server" />
使用Connection对象连接SQL Server数据库 案例名称:使用Connection对象连接SQL Server数据库 using System.Data.SqlClient; void Page_Load(Object sender, EventArgs e) { SqlConnection Conn; Conn=new SqlConnection("server=localhost;database=School;uid=sa;pwd=''"); //Conn = new SqlConnection(@"Data Source=zmr-pc;Initial Catalog=School; //Integrated Security=True"); Conn.Open(); Message.Text=Conn.State.ToString(); Conn.Close(); } <asp:Label id="Message" runat="server" />
用数据控件连接数据 • 详细步骤如下: • (1)把“工具箱”里的SqlDataSource控件拖到页面上。 • (2)单击控件右上角的三角形,选择“配置数据源”命令,弹出“配置数据源”对话框 。 • (3)单击“新建连接”按钮,在弹出的“添加连接”对话框里填入服务器名、用户名、密码之后在下方选择一个数据库,单击“测试连接”按钮。
Command对象 • 建立数据连接以后,利用Command对象来执行命令并从数据源返回结果。 • Command对象常用的构造函数包括两个参数:(1) 要执行的SQL语句,(2) 已经建立的Connnection对象,基本语法是: String strsql = "select Name from Users where UserID = 10"; SqlCommand com = new SqlCommand(strsql,con);
1.Command对象的方法 • 方法有ExecuteReader() 、ExecuteScalar() 和ExecuteNonQuery() ,这些方法用来执行SQL语句。 • (1)ExecuteReader方法:将返回一个记录集给DataReader对象。 下面使用ExecuteReader方法列出学校网站数据库School的栏目表Columns里的数据,程序代码如下: protected void Page_Load(object sender, EventArgs e) { SqlConnection con = new SqlConnection ("Server=zmr-pc; Database=School; User ID=sa;Password="); SqlCommand com = new SqlCommand("select * from Columns ", con); con.Open(); SqlDataReader dr = com.ExecuteReader(); GridView1.DataSource = dr; GridView1.DataBind(); con.Close(); }
(2)ExecuteScalar方法:执行指定的SQL语句,它从查询中返回第一行第一列的值。该方法只能执行Select命令。比较适合用在Select命令中带avg()、sum()、count()等求值函数,返回单一值的情况。(2)ExecuteScalar方法:执行指定的SQL语句,它从查询中返回第一行第一列的值。该方法只能执行Select命令。比较适合用在Select命令中带avg()、sum()、count()等求值函数,返回单一值的情况。 protected void Page_Load(object sender, EventArgs e) { SqlConnection con = new SqlConnection ("Server=zmr-pc; Database=School; User ID=sa;Password=123456"); con.Open(); String strSQL = "select * from Colunms "; SqlCommand com = new SqlCommand(strSQL, con); string d = (string)com.ExecuteScalar(); Meg.Text = d; con.Close(); }
(3)ExecuteNonQuery方法。ExecuteNonQuery方法用于执行不需要返回结果的命令。比如:Insert、Update、Delete命令。下面利用ExecuteQuery方法往数据库里添加一组数据。(3)ExecuteNonQuery方法。ExecuteNonQuery方法用于执行不需要返回结果的命令。比如:Insert、Update、Delete命令。下面利用ExecuteQuery方法往数据库里添加一组数据。 protected void Page_Load(object sender, EventArgs e) { SqlConnection con = new SqlConnection ("Server=zmr-pc; Database=School; User ID=sa;Password=123456"); stringStrSql = "insert into Columns values('体育新闻 ','0','0','True','')"; SqlCommand com = new SqlCommand(StrSql,con); con.Open(); com.ExecuteNonQuery(); con.Close(); }
2.Command对象的属性 三个重要属性:CommandText、CommandType和Connection。 • (1)CommandText属性:用于获取或设置对数据源执行的SQL命令、数据表或存储过程名称。 • (2)CommandType属性:描述CommandText所给出的类型。该属性的默认值为Text。它的可能值包括以下两种。 • 第一种是StoredProcedure:存储过程。CommandType属性设置为StoredProcedure时,应将CommandText属性设置为存储过程的名称。当调用“执行”方法时,将执行此存储过程。 • 第二种是Text:SQL文本命令。 • (3)Connection属性。Connection属性用于获取或设置Command对象所用到的数据源的连接对象。Command对象发出的命令都要通过该属性施加到原始数据库中。
使用SqlCommand执行存储过程 • 若要调用存储过程,需要将Command对象的CommandType设置为StoredProcedure。CommandType设置为StoredProcedure,就可以使用Parameters集合来定义参数。 • 下面用为友情链接表(Links)添加记录。 • 创建的存储过程如下: create procedure addLinks ( @Name nvarchar(50), @Url nvarchar(50), @AddDate datetime, @UserID int, @Remark nvarchar(100) ) as insert into Links values(@Name,@Url,@AddDate,@UserID,@Remark) go
执行存储过程的代码如下: SqlConnection con = new SqlConnection ("Server=zmr-pc; Database=School; User ID=sa;Password=123456"); con.Open(); SqlCommand com = new SqlCommand("addLinks", con); com.CommandType = CommandType.StoredProcedure.ToString(); SqlParameter p1 = new SqlParameter("@Name", SqlDbType.NVarChar, 50); SqlParameter p2 = new SqlParameter("@Url", SqlDbType.NVarChar, 50); SqlParameter p3 = new SqlParameter("@AddDate", SqlDbType.DateTime, 10); SqlParameter p4 = new SqlParameter("@UserID", SqlDbType.Int, 10); SqlParameter p5 = new SqlParameter("@Remark", SqlDbType.NVarChar, 100); p1.Value = "百度"; p2.Value = "www.baidu.com"; p3.Value = "2009-01-01"; p4.Value = "4"; p5.Value = "0"; com.Parameters.Add(p1); com.Parameters.Add(p2); com.Parameters.Add(p3); com.Parameters.Add(p4); com.Parameters.Add(p5); com.ExecuteNonQuery(); con.Close();
使用DataReader对象 • 取DataReader对象的数据,有两种方法: • 1、通过和GridView等数据控件绑定,直接输出。 • 2、另一种方法是利用循环将其数据取出
可以循环使用DataReader对象的Read()方法来指向下一条数据并读取,读到最后,则Reader()会返回false,从而将所有数据输出。具体代码如下:可以循环使用DataReader对象的Read()方法来指向下一条数据并读取,读到最后,则Reader()会返回false,从而将所有数据输出。具体代码如下: • protected void Page_Load(object sender, EventArgs e) • { • SqlConnection con = new SqlConnection ("Server=localhost; • Database=School; User ID=sa;Password=123456"); • string strsql = "select * from Columns"; • SqlCommand com = new SqlCommand(strsql,con); • con.Open(); • SqlDataReader dr = com.ExecuteReader(); • while (dr.Read()) • { • Response.Write(dr["ColumnID"].ToString() + "/" + dr["ColumnName"].ToString() • + "/" + dr["ColumnSort"].ToString() + "/" + dr["FatherID"].ToString() • + "/" +dr["IsLastNode"].ToString() + "/" + dr["Remark"].ToString() + "<br>"); • } • dr.Close(); • con.Close(); • }
使用DataAdapter对象 • DataAdapter对象用于从数据源中获取数据,填充DataSet中的表和约束,并将对DataSet的更改提交回数据源。它是连接DataSet和数据源的一个桥梁,因此又命名为“数据适配器”。 • DataAdapter对象主要两个方法:Fill()和Update()方法。 • (1)Fill()方法。读取原始数据库中的数据,并将结果表装载到指定的数据集(DataSet对象中) • (2)Update()方法。用于执行由InsertCommand、DeleteCommand和UpdateCommand对象的CommandText属性指定的SQL命令,从而将数据集中的数据返回到相应的数据源,从而使原始数据库和数据集保持同步。
DataAdapter对象 • 案例名称:使用DataAdapter对象构造方法执行 • protected void Page_Load(Object sender, EventArgs e) • { • SqlConnection con = new SqlConnection ("Server=zmr-pc; • Database=School; User ID=sa;Password=123456"); • con.Open(); • string strsql = "select * from Columns "; • SqlDataAdapter da = new SqlDataAdapter(strsql,con); • DataSet ds = new DataSet(); • da.Fill(ds, "grade");//将da中的数据填充到DataSet对象中 • GridView1.DataSource = ds.Tables["grade"].DefaultView; • GridView1.DataBind();//与DataGrid进行绑定 • con.Close(); • }
DataSet对象 • DataSet封装在命名空间“Syste.Data”中。DataSet中可以包含任意数量的DataTable(数据表),且每个DataTable对应一个数据库中的数据表和视图。 • 通过DataAdapter的Fill方法,将表内容填充到DataSet对象中,而且可以填充多个表。利用别名来区分。比如“da.Fill(ds,"grade1");”的功能是将da对象中的数据填充到ds对象中,并起别名“grade1” 。
案例名称:自动生成DataSet对象 void Page_Load(Object sender, EventArgs e) { DataSet myds = new DataSet(); DataTable mydt = new DataTable("Squares"); DataRow mydr; mydt.Columns.Add(new DataColumn("数字",typeof(Int32))); mydt.Columns.Add(new DataColumn("平方",typeof(Int32))); for (int i = 0; i < 10; i++) { mydr = mydt.NewRow(); mydr[0] = i; mydr[1] = i * i; mydt.Rows.Add(mydr); } myds.Tables.Add(mydt); GridView1.DataSource = myds.Tables["Squares"].DefaultView; GridView1.DataBind(); } <ASP: GridView id=" GridView1 " runat="server" />