asp.net学习之ado.net(无连接模式中的DataAdapter)
原文:asp.net学习之ado.net(无连接模式中的DataAdapter)
在非连接模式下,主要讨论以下对象:DataAdapter。
DataAdpater的作用是在物理存储模式的数据和内存之间进行数据传递。DataTable是用在内存中表示数据库表。DataSet是内存中表示数据库(表、表关系的集合)。DataView是用于在内存中表示数据库视图。
DataAdapter对象在后台使用DataReader对象从数据库中获取数据;DataView对象来对数据进行过滤和排序;DataTable对象可以用来跟踪数据记录的改变情况,并决定是否接受或者拒绝这些改变。
1.DataAdapter对象
DataAdapter对象在物理数据库和内存数据表之间起桥梁的作用。一般用DataAdapter对象从数据库获取数据并装入DataTable对象中,也通过DataAdapter对象将DataTable对象中数据的修改写回到物理数据库。
例1: 一个简单的DataAdapter对象的使用
=== App_Code\DawnDataObject.cs ===
Codepublic class Movie_Disconnect{ private static readonly string _connectionstring; static Movie_Disconnect() { _connectionstring = WebConfigurationManager.ConnectionStrings["DawnEnterpriseDBConnectionString"]. ConnectionString.ToString(); } public DataTable GetAll() { // 初始化DataAdapter SqlDataAdapter dad = new SqlDataAdapter("Select Id,Title,Director from Movies", _connectionstring); // 初始化Table DataTable dt = new DataTable(); dad.Fill(dt); return dt; }}
=== showMovies.aspx
Code<asp:GridView ID="GridView1" runat="server" DataSourceID="ObjectDataSource1"></asp:GridView><asp:ObjectDataSource ID="ObjectDataSource1" TypeName="DawnDataObject.Movie_Disconnect" SelectMethod="GetAll" runat="server"></asp:ObjectDataSource>
2.DataAdapter的构造
在例1中,我们看到了如何构造一个SqlDataAdapter对象,并且使用Fill方法把数据表填到一个DataTable中。它看起来是像下面这样子的:
SqlDataAdapter dad = new SqlDataAdapter("Select Id,Title,Director from Movies", _connectionstring);DataTable dt = new DataTable();dad.Fill(dt);
在以上的例子中,看不到SqlConnection,SqlCommand对象的出象,其实,它们还是隐含存在的,这些对象被SqlDataAdapter对象调用了而已,就连SqlConnection对象的Open()方法的调用也由SqlDataAdapter对象来代劳了。
如果要显式使用SqlConnection,SqlCommand对象,可以像以下代码这样:
例2: SqlAdapter对象的另外构造方法
public DataTable GetAll(){ DataTable dt = new DataTable(); using(SqlConnection conn = new SqlConnection(_connectionstring)) { SqlCommand command = new SqlCommand("Select Id,Title,Director from Movies", conn); SqlDataAdapter dad = new SqlDataAdapter(command); // 初始化Table dad.Fill(dt); } return dt;}
以上,可以看出,SqlDataAdapter构造函数可以传入一个SqlCommand对象。在ADO.Net中SqlDataAdapter构造函数可以使用以下几种方法进行构造
● SqlDataAdapter(): 无参数,构造后,可以给SqlDataAdapter对象的SelectCommand属性分配一个SqlCommand对象。
作为补充,SqlDataAdapter还有UpdateCommand、DeleteCommand、InsertCommand属性,这些属性在后面会提到。
● SqlDataAdapter(string commandText, SqlConnection connection): 第一个参数为T-SQL语句,第二个参数为一个SqlConnection对象。
使用这个构造函数时,不需要显式声明SqlCommand对象。
● SqlDataAdapter(string commandText, string connectionString): 例1使用的方法,不需要显式声明SqlConnection与SqlCommand对象
● SqlDataAdapter(SqlCommand command): 例2使用的方法。
3. SqlDataAdapter的Fill/FillSchema方法
DataAdapter对象的Fill方法,该方法不止可以传入DataTable作为参数,也可以传入DataSet作为参数。
DataAdapter对象的FillSchema方法,可以向DataSet/DataTable参数添加现有的数据库约束。
3.1 赋值到DataSet
因为DataSet是DataTable的集合,所以可以Fill多张表到DataSet对象中。
例3: Fill多张数据表到DataSet对象
private void buttonFillData_Click(object sender, EventArgs e){ DataSet userData = new DataSet(); using (SqlConnection testConnection = new SqlConnection(connectionString)) { SqlCommand testCommand = testConnection.CreateCommand(); testCommand.CommandText = "Select FirstName, LastName from userTable; Select PermissionType from PermissionsTable"; SqlDataAdapter dataAdapter = new SqlDataAdapter(testCommand); dataAdapter.Fill(userData); } // testConnection.Dispose called automatically.}
3.2 Fill方法的重载
默认的,当调用SqlDataAdapter.Fill(DataSet)时,并没有指定Table名,所以,要想取得DataSet中的DataTable对象,需要使用Index序号。
也可以指定当Fill进DataSet时,相应表的TableName属性,当需要指定TableName属性时,调用以下Fill方法:
public int Fill(DataSet dataSet, string srcTable);
以下的例子是它们之间的区别:
例4: 调用Fill方法填充到DataSet时,指定TableName属性
protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { string _connectionstring = WebConfigurationManager.ConnectionStrings["DawnEnterpriseDBConnectionString"]. ConnectionString.ToString(); DataSet ds = new DataSet(); using (SqlConnection conn = new SqlConnection(_connectionstring)) { SqlCommand command = new SqlCommand("Select Id,Title,Director from Movies", conn); SqlDataAdapter dad = new SqlDataAdapter(command); dad.Fill(ds, "Movies"); // 调用Fill方法时,使用TableName dad.SelectCommand = new SqlCommand("select Id,name from MovieCategories", conn); dad.Fill(ds); // 为使用TableName GridView1.DataSource = ds.Tables["Movies"]; // 使用TableName进行指定 GridView1.DataBind(); GridView2.DataSource = ds.Tables[]; // 使用inde进行指定 GridView2.DataBind(); } } }
Fill被重载的方法有很多,具体可以查看:http://msdn.microsoft.com/zh-cn/library/system.data.sqlclient.sqldataadapter.fill.aspx
3.3 DataAdapter的FillSchema方法
SqlDataAdapter 类提供 Fill 和 FillSchema 两种方法,这对于加载这些数据很关键。这两种方法均可将信息加载到 DataSet 中。Fill 加载数据本身,而 FillSchema 加载有关特定表的所有可用的元数据(如列名、主键和约束)。处理数据加载的正确方式是先运行 FillSchema,后运行 Fill。例如:
daAuthors.FillSchema(dsPubs,SchemaType.Source, "Authors");
daAuthors.Fill(dsPubs,"Authors");
具体的参照以下几篇文章:
http://msdn.microsoft.com/zh-cn/library/49z48hxc.aspx
http://support.microsoft.com/kb/314145/zh-cn
例5:调用FillSchema方法:
//一般先用FillSchema来填入详细的元数据信息,再用Fill来填充数据,例如:
sqlDataAdapter1.FillSchema(dataSet1,SchemaType.Source,"authors");sqlDataAdapter1.Fill(dataSet1,"authors");DataColumn[] colArr;colArr = dataSet1.Tables["authors"].PrimaryKey;MessageBox.Show("Column Count: " + colArr.Length.ToString());for(int i = ; i < colArr.Length; i++){ MessageBox.Show(colArr[i].ColumnName + " " + colArr[i].DataType.ToString());}
在上例中,如果不调用FillSchema, 缺省情况下不会填如PrimaryKey信息。
另外,DataAdapter还有一个MissingSchemaAction属性,该属性可以接受以下Enum值:
● Add---在添加新行时向DataTable中添加必须的附加列(默认值)
● AddWithKey---在添加新行时向DataTAble中添加所有必须的列。
● Error---在添加新行时,如果此行不匹配现在的DataTable,就引发一个错误。
● Ignore---在添加新行时,如果此行中包含DataTable中没有的列,那么忽略多余的列。
ds.MissingSchemaAction = MissingSchemaAction.AddWithkey
asp.net学习之ado.net(无连接模式中的DataAdapter)的更多相关文章
- asp.net学习之ado.net(连接模式访问)
原文:asp.net学习之ado.net(连接模式访问) ado.net框架支持两种模式的数据访问: 连接模式(Connected)和非连接模式(disconnected).这一节介绍如何使用连 ...
- <原>ASP.NET 学习笔记之HTML helper中参数何时会是路由参数,何时又会是query string?
HTML helper中参数何时会是路由参数,何时又会是query string? @Html.ActionLink("Edit", "Edit", new ...
- 第八周学习笔记-ADO.Net中DataTable的应用
ADO.Net中DataTable的应用 一.知识点描述 1.概述:DataTable是一个临时保存数据的网格虚拟表(表示内存中数据的一个表),是ADO.Net库中的核心对象. 2.DataTabl ...
- asp.net学习之SqlDataSource
原文:asp.net学习之SqlDataSource 通过 SqlDataSource 控件,可以使用 Web 服务器控件访问位于关系数据库中的数据.其中可以包括 Microsoft SQL Serv ...
- asp.net学习之Repeater控件
asp.net学习之Repeater控件 文章摘自:http://www.cnblogs.com/shipfi/archive/2009/10/19/1585703.html Repeater控件和D ...
- asp.net学习资源汇总
名称:快速入门地址:http://chs.gotdotnet.com/quickstart/描述:本站点是微软.NET技术的快速入门网站,我们不必再安装.NET Framework中的快速入门示例程序 ...
- asp.net学习之DataList控件
asp.net学习之DataList控件 DataList控件与Repeater控件一样由模板驱动,与Repeater控件不同的是: DataList控件默认输出是一个HTML表格.DataLis ...
- asp.net学习之 数据绑定控件--List数据绑定控件
原文:asp.net学习之 数据绑定控件--List数据绑定控件 List控件(如 CheckBoxList.DropDownList.ListBox 和 RadioButtonList 类)继承自L ...
- asp.net学习之数据绑定控件、数据源控件概述
原文:asp.net学习之数据绑定控件.数据源控件概述 1.asp.net数据绑定控件分为三大类,每个类分别进行详细: ● 列表式数据绑定控件: 列表式数据绑定控件常用来在一个表格内的一个字 ...
随机推荐
- 【shell文字】mysql每日备份shell文字
每天固定时间使用mysqldump 备份mysql数据. #!/bin/bash #每天早上4点, mysql备份数据 orangleliu #chmod 700 backup.sh #crontab ...
- 于Unity3D动态创建对象和创建Prefab三种方式的原型对象
于Unity3D动态创建对象和创建Prefab三种方式的原型对象 u3d在动态创建的对象,需要使用prefab 和创建时 MonoBehaviour.Instantiate( GameObject o ...
- 为什么OC语言很难
作为一个Objective-C的coder,我总能听到一部分人在这门语言上抱怨有很多问题.他们总在想快速学习这门语言来写一个App出来,但他们也总是联想到Objective-C看上去实在太难了或者在想 ...
- [Android 4.4.4] 泛泰A870 通过刷第三版 Mokee4.4.4 KTU84P 20140626 RC2.1 by syhost
主题及注意事项请访问以前的版本: http://blog.csdn.net/syhost/article/details/29931291 此RC2.1版比RC2.0改进的地方: 1. Mokee本身 ...
- 跨域请求jQuery的ajax jsonp使用常见问题解答
前天在项目中写了ajax jsonp的使用,出现了问题:能够成功获得请求结果,但没有运行success方法,直接运行了error方法提示错误--ajax jsonp之前并没实用过.对其的理解为跟普通的 ...
- JTextAreaDemo
问题:java swing 图形界面程序,拖了一个JTextArea出来,程序中有很多地方调用JTextArea中的append这个方法不断往文本域结尾处追加数据,但是程序每次运行,总是在程序运行完成 ...
- mfc配置GDI+有106个错误
mfc配置GDI+有106个错误,处理如下,参考http://bbs.csdn.net/topics/380054079 一开始#include...放在stdafx.h里有错误,后来上面修改好了,放 ...
- SQLServer数据类型优先级对性能的影响
原文:SQLServer数据类型优先级对性能的影响 译自: http://www.mssqltips.com/sqlservertip/2749/sql-server-data-type-preced ...
- 你所不了解的float(滥用float的怪异现象) (转)
阅读目录 float设计初衷就是为了实现文字环绕效果 如何解决浮动造成的父容器塌陷? 兼容各浏览器清除浮动的通用方式 滥用浮动 运用浮动的一些特性 浮动与布局 浮动与单侧固定布局 浮动与智能自适应的流 ...
- 面向对象的软件project——面向对象分析
为了解决软件危机.一些IT前辈国产软件project这个词汇,软件project它被引入到整个软件开发过程的维护. 软件project从程序的设计角度能够分为两类.一类是面向结构的软件project. ...