ADO.NET的名称起源于ADO(ACTIVEX DATA OBJECTS)
USING SYSTEM;
USING SYSTEM.COLLECTIONS.GENERIC;
USING SYSTEM.DATA;
USING SYSTEM.DATA.SQLCLIENT; CLASS PROGRAM
{
STATIC VOID MAIN()
{
STRING CONNECTIONSTRING = GETCONNECTIONSTRING();
STRING QUERYSTRING = "SELECT CATEGORYID, CATEGORYNAME FROM DBO.CATEGORIES;";
USING (SQLCONNECTION CONNECTION = NEW SQLCONNECTION(CONNECTIONSTRING))
{
SQLCOMMAND COMMAND = CONNECTION.CREATECOMMAND();
COMMAND.COMMANDTEXT = QUERYSTRING;
TRY
{
CONNECTION.OPEN();
SQLDATAREADER READER = COMMAND.EXECUTEREADER();
WHILE (READER.READ())
{
CONSOLE.WRITELINE("\T{0}\T{1}",READER[], READER[]);
}
CONSOLE.READKEY();
READER.CLOSE();
}
CATCH (EXCEPTION EX)
{
CONSOLE.WRITELINE(EX.MESSAGE);
}
}
} STATIC PRIVATE STRING GETCONNECTIONSTRING()
{
// TO AVOID STORING THE CONNECTION STRING IN YOUR CODE,
// YOU CAN RETRIEVE IT FROM A CONFIGURATION FILE.
RETURN "DATA SOURCE=(LOCAL);INITIAL CATALOG=NORTHWIND;"+ "INTEGRATED SECURITY=SSPI";
}
}
连接数据库的基本代码
ADO.NET 对象模型中有五个主要的组件,分别是Connection对象、Command对象、DataAdapter对象、DataSet对象以及DataReader对象。
ADO.NET对数据库的访问
1.断开式数据库访问连接
ADO.NET技术中,最重要的一条就是采用断开式数据库访问连接。所谓断开式数据库访问连接就是指客户端从数据源获取数据后,断开与数据源的连接,所有的数据操作都是针对本地数据缓存里的数据,当需要从数据源获取新数据或者被处理后的数据回传,这时客户端再与数据源相连接来完成相应的操作。断开式数据库访问连接最为核心的对象是DataSet对象,一旦通过数据适配器将数据填充至DataSet对象后,则今后的数据访问将直接针对DataSet对象展开。
首先,数据适配器(DataAdapter对象)选择连接和命令从数据库获取数据(Connection对象),通过填充操作将数据装载到数据集(DataSet对象);然后,数据集作为WinForm程序控件的“数据源”,通过数据绑定控件使数据集中的数据与WinForm程序控件中的数据保持一致。这时客户端使用的数据,在填充那一刻就已经被缓存了。用户通过WinForm应用程序操作的数据都是针对本地缓存里的数据进行的。当数据被修改后需要回传,再通过数据适配器重新连接数据库,将数据保存在数据库内。这里需要注意点是:将数据传递到用户界面时,ADO.NET采用XML格式。
2.连线式数据库访问连接
ADO.NET技术中,另一种数据库访问连接方式就是连线式数据库访问连接。所谓连线式数据库访问连接就是指客户端从数据源获取数据后,通过DataReader对象一条一条的从数据源之中将访问到的数据行读取到客户端的过程,在这种只读前进式的数据访问读取过程中,DataReader对象必须时刻与数据源保持连接,因此这种方式访问数据库的特点是:在前进只读方式访问数据表时候其效率较高。
3.对于Insert,Update,Delete等单向操作
对于插入、删除、修改等操作,由于是客户端应用程序向数据库提出的请求,不需要返回源数据,这个过程是单向操作。
主要有三个过程:首先,建立针对具体数据库的Connection对象,利用Connection对象的Open()方法打开数据库;然后,包含插入、删除、修改等命令信息的Command对象和DataAdapter内伴生的Command对象都可以利用Execute系列方法执行命令信息对应的命令;最后,利用Connection对象的Close()方法关闭数据库。
这里有一点要强调,DataAdapter内伴生的Command对象有四个:SelectCommand、InsertCommand、DeleteCommand、UpdateCommand 。命令信息中要求执行的是Select命令则由SelectCommand调用相应方法实现,Insert用InsertCommand,Delete用DeleteCommand,Update用UpdateCommand。
4.对于Select的双向操作
对于查询操作而言,由于是客户端应用程序向数据库提出的请求,需要返回源数据,这个过程是双向操作。
首先,建立针对具体数据库的Connection对象,利用Connection对象的Open()方法打开数据库;然后,包含查询命令信息的Command对象和DataAdapter内伴生的SelectCommand对象都可以执行命令信息对应的命令,查询得到的数据可以通过DataReader对象获取或者被DataAdapter对象用Fill()方法填充在DataSet对象中;最后,利用Connection对象的Close()方法关闭数据库。
-1-4 ADO.NET连接数据库管理系统
1.ADO.NET连接数据库的类型及方法
ADO.NET连接数据库的内容包括:连接到数据库、执行数据库操纵命令和检索结果。可以直接处理检索到的结果,也可以将其放入DataSet对象,方便与来自多个源的数据和在层之间进行远程处理的数据组合在一起,以特殊方式向用户公开。
数据提供程序的四个核心对象表
对象 | 说明 |
Connection | 建立与特定数据源的连接。所有Connection对象的基类均为DbConnection类。 |
Command | 对数据源执行命令。公开Parameters,并且可以通过Connection在Transaction的范围内执行。所有Command对象的基类均为DbCommand类。 |
DataReader | 从数据源中读取只进且只读的数据流。所有DataReader对象的基类均为DbDataReader类。 |
DataAdapter | 用数据源填充DataSet并解析更新。所有DataAdapter对象的基类均为DbDataAdapter类。 |
列出的其他重要对象。
表4-2 .NET数据提供程序的其他对象表
对象 | 说明 |
Transaction | 使您能够在数据源的事务中登记命令。所有Transaction对象的基类均为DbTransaction类。 |
CommandBuilder | 帮助器对象将自动生成DataAdapter的命令属性或将从存储过程派生参数信息并填充Command对象的Parameters集合。所有CommandBuilder对象的基类均为DbCommandBuilder类。 |
ConnectionStringBuilder | 帮助器对象为创建和管理Connection对象所使用的连接字符串的内容提供了一种简单的方法。所有ConnectionStringBuilder对象的基类均为DbConnectionStringBuilder类。 |
Exception | 在数据源中遇到错误时返回。对于在客户端遇到的错误,.NET Framework数据提供程序会引发.NET Framework异常。所有Exception对象的基类均为DbException类。 |
Error | 公开数据源返回的警告或错误中的信息。 |
ClientPermission | 为.NET Framework数据提供程序代码访问安全属性。所有ClientPermission对象的基类均为DBDataPermission类。 |
四类命名空间分别是:SQLClient、OLEDB、Oracle、ODBC,其对应的数据提供程序
.NET Framework 数据提供程序 | 说明 |
SQL Server .NET Framework数据提供程序 |
提供对Microsoft SQL Server 7.0版或更高版本的数据访问。使用System.Data.SqlClient命名空间。 建议用于使用Microsoft SQL Server 7.0或更高版本的中间层应用程序,Microsoft数据库引擎(MSDE)或SQL Server 7.0或更高版本的单层应用程序。 建议将用于SQL Server的OLE DB提供程序(SQLOLEDB)与OLE DB .NET Framework数据提供程序一起使用。对于SQL Server 6.5版和较早版本,必须将用于SQL Server的OLE DB提供程序与OLE DB .NET Framework数据提供程序一起使用。 |
OLE DB .NET Framework数据提供程序 |
适合于使用OLE DB公开的数据源。使用System.Data.OleDb命名空间。 建议用于使用SQL Server 6.5或较早版本的中间层应用程序。 对于SQL Server 7.0或更高版本,建议使用SQL Server .NET Framework数据提供程序。还建议用于使用Microsoft Access数据库的单层应用程序。不建议将Access数据库用于中间层应用程序。 |
ODBC .NET Framework数据提供程序 |
适合于使用ODBC公开的数据源。使用System.Data.Odbc命名空间。 建议用于使用ODBC数据源的中间层和单层应用程序。 |
Oracle .NET Framework数据提供程序 | 适用于Oracle数据源。Oracle .NET Framework数据提供程序支持Oracle 客户端软件 8.1.7 版和更高版本,使用System.Data.OracleClient命名空间。建议用于使用Oracle数据源的中间层和单层应用程序。 |
每一类数据提供程序的命名空间里都有一套对象,它们是通过前缀名进行区别的,例如:SQLClient命名空间包含的对象有:SqlConnection、SqlCommand、SqlDataReader、SqlDataAdapter等,OLEDB命名空间包含的对象有:OleDbConnection、OleDbCommand、OleDbDataReader、OleDbDataAdapter等。
调用sql 数据库 头文件
using System.Data.SqlClient;
oracle 数据库
using System.Data;
using System.Data.OracleClient;
access 数据库 头文件
using System.Data.OleDb;
OLEDB数据提供程序所对应的数据源驱动程序表
驱动程序 | 提供程序 |
SQLOLEDB | 用于SQL Server的Microsoft OLE DB提供程序 |
MSDAORA | 用于Oracle的Microsoft OLE DB提供程序 |
Microsoft.Jet.OLEDB.4.0 | 用于Microsoft Jet的OLE DB提供程序 |
OLE DB .NET Framework数据提供程序类位于System.Data.OleDb命名空间中。以下代码示例显示如何在应用程序中包含System.Data.OleDb命名空间。
using System.Data.OleDb;
注意:
不推荐将Access (Jet)数据库用作多线程应用程序(如ASP.NET应用程序)的数据源。如果必须将Access数据库用作ASP.NET应用程序的数据源,而且不能使用其他数据库(如SQL Server或MSDE),那么请注意,连接到Access数据库的ASP.NET应用程序可能会遇到连接问题,这些问题通常与安全权限有关。
ADO.NET与ODBC的关联
DSN(数据源)是在odbc里设置的,用于连接数据库,ODBC只能用于关系型数据库。作为DSN的数据库连接可分为以前三种:
n 用户DSN:数据源对计算机来说是本地的,并且只能被当前用户访问,所以只有建立该数据源的用户才能访问该数据源,而且不能从网络上访问该数据源。
n 系统DSN:数据源对于计算机来说也是本地的,但并不是用户专用的,任何具有权限的用户都可以访问“系统DSN”,但是它还是不能从网络上来访问。
n 文件DSN:则与前两者不同,它们可以在所有安装了相同驱动程序的用户中共享,这些数据源对于计算机说都是本地的。也就是说可以通过网络上来访问。
显示了用ADO.NET测试的ODBC驱动程序。
ODBC数据提供程序所对应的数据源驱动程序表
驱动程序 |
SQL Server |
Microsoft ODBC for Oracle |
Microsoft Access 驱动程序 (*.mdb) |
ODBC .NET Framework数据提供程序类位于System.Data.Odbc命名空间中。以下代码示例显示如何在您的应用程序中包含System.Data.Odbc命名空间。
using System.Data.Odbc;
ADO.NET与Oracle的关联
ADO.NET提供程序通过Oracle客户端连接软件启用对Oracle数据源的数据访问,该数据提供程序支持Oracle客户端软件8.1.7版或更高版本。
ADO.NET为与Oracle数据库关联提供程序类位于System.Data.OracleClient命名空间中,并包含在System.Data.OracleClient.dll程序集中。在编译使用该数据提供程序的应用程序时,需要同时引用System.Data.dll和System.Data.OracleClient.dll。
以下代码示例显示如何在您的应用程序中包含System.Data.OracleClient命名空间。
using System.Data;
using System.Data.OracleClient;
各个对象属性介绍
1.Connection 对象
要开发数据库应用程序,首先需要建立与数据库的连接。在ADO.NET中,数据库连接是通过Connection对象管理的。此外,事务管理也通过Connection对象进行。
提供程序 | Connection类 |
SQL数据提供程序 | SqlConnection |
OLE DB数据提供程序 | OleDbConnection |
Oracle数据提供程序 | OracleConnection |
ODBC数据提供程序 | OdbcConnection |
x
Connection对象的使用
(1)Connection对象的属性和方法
Connection对象最常用的属性有ConnectionString和Database。其中ConnectionString属性用来获取或设置用于打开SQL Server数据库的字符串。Database属性用来获取当前数据库或连接打开后要使用的数据库的名称。ConnectionString属性要使用到连接字符串
Connection对象最常用的方法有Open()和Close()。其中Open()方法使用ConnectionString所指定的属性设置打开数据库连接。如果SqlConnection超出范围,则不会将其关闭。因此,必须通过调用Close显式关闭该连接。Close()方法用来关闭与数据库的连接。这是关闭任何打开连接的首选方法。
private static void OpenSqlConnection(string connectionString)
{
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
Console.WriteLine("ServerVersion: {0}", connection.ServerVersion);
Console.WriteLine("State: {0}", connection.State);
}
}
示例
(2)可以通过图形来实现
.NET开发平台将一部分对象做成可视化的对象组件,程序员在编程的时候可以不用编写大量代码去定义和使用,只需要在工具箱中拖拽一个组件到窗体上,就可以进行配置使用。这种方式大幅的提高了编程效率,降低了出错率,但是在实际项目开发中不建议采取这种拖拽的形式进行ADO.NET开发。
通过拖拽形式建立Connection对象的数据库连接实验
首先右击工具箱弹出菜单,在弹出菜单中点击“选择项”,在出现的选择工具箱箱中选中要使用到的SqlConnection等一系列ADO.NET对象组件,在它们前面的复选框中打上对号,并;最后点击“确定”,SqlConnection等组件就出现在工具箱中
在工具箱中选择“数据”选项卡,找到刚刚添加上的SqlConnection对象组件,点击后向窗体拖放,在设计窗口下的组件栏出现SqlConnection1对象。选中SqlConnection1对象,在属性窗口找到ConnectionString属性,选择右侧下拉框中的“新建连接”。设计窗口会弹出一个“添加连接”窗口这个窗口是配置SqlConnection1对象的连接属性而专用的窗口。在“添加连接”窗口,首先要在列表中选择SQL Server服务器,然后要指定用户和密码,最后选择要连接的数据库。点击“测试连接”,如果连接成功,则会显示一则成功消息。这时,就可以看到SqlConnection1对象的ConnectionString属性右侧栏中出现一长串字符,这就是连接字符串。在后续的代码编写过程中,就可以使用SqlConnection1对象对数据库进行访问了。
代码实现
SQL Client方式的连接字符串如下:
"Data Source=127.0.0.1;Persist Security Info=False;Initial Catalog=MyDB;Integrated Security=SSPI"
"Data Source"是关键字,这里与"server"可以呼唤,都用来表示数据库服务器,等号后面就要对应具体的数据库服务器的IP或者名称。"Persist Security Info"关键字,如果将该关键字设置为true或yes,将允许在打开连接后,从连接中获得涉及安全性的信息(包括用户标识和密码)。如果在建立连接时必须提供用户标识和密码,最安全的方法是在使用信息打开连接后丢弃这些信息,在Persist Security Info设置为false或no时会发生这种情况。当您向不可信的源提供打开的连接,或将连接信息永久保存到磁盘时,这点尤其重要。如果将Persist Security Info保持为false,可帮助确保不可信的源无法访问连接中涉及安全性的信息,并帮助确保任何涉及安全性的信息都不会随连接字符串信息在磁盘上持久化。"Initial Catalog"关键字可以与"database"关键字互换,用来指定需要连接的数据库服务器中具体某一数据库,等号后面就要对应具体的数据库,本例中就是"MyDB"。"Integrated Security"关键字表示是否使用Windows身份验证(通常称为集成安全性)连接到服务器数据库上。如果键值为"true"或者"SSPI"表示指定Windows身份验证,如果键值为"false"表示不指定Windows身份验证。但是,只有键值"SSPI"将适用于OleDb .NET Framework数据提供程序。对于ODBC .NET Framework数据提供程序,必须使用以下键/值"Trusted_Connection=yes;"指定Windows身份验证。对于不使用Windows身份验证而使用SQL Server身份验证,使用"User ID=*****;Password=*****;"替换掉"Integrated Security"关键字及其键值,来指定用户名和密码。
② OLE DB方式的连接字符串如下:
"Provider=SQLOLEDB;Data Source=127.0.0.1;Persist Security Info=False;
Initial Catalog=MyDB;Integrated Security=SSPI"
"Provider"关键字用来指定哪一类数据源,其键值取值可以参见表4-4,其他关键字用法与SQL Client方式相同。
③ ODBC方式的连接字符串如下:
"Driver={SQL Server};Server=127.0.0.1;Database=MyDB;Trusted_Connection=Yes;UID=Administrator"
"Driver"关键字用来指定哪一类数据源,其键值取值可以参见表4-5,其他关键字用法与SQL Client方式相似。区别就是"Trusted_Connection"、"UID"与"Integrated Security"、"User ID",关键字虽然不同,但是用法相同。
方式一
SqlConnection sql=new SqlConnection("Data Source=10.5.0.30;Initial Catalog=TTDB;
User ID=TrainingDeveloper Pwd=Password");
sql.open();
方式二
SqlConnection SqlConnection1 = new SqlConnection();
SqlConnection1.ConnectionString = "Data Source=10.5.0.30;Initial Catalog=TTDB;
User ID=TrainingDeveloper Pwd=Password";
2. Command对象
数据库连接建立好以后,要操作数据库就得向数据库发送命令信息。所谓命令信息就是指SQL语句或者存储过程名称。除了增删查改数据外,命令信息还可以对数据源执行一些不返回结果集的查询,以及改变数据源结构的数据定义命令信息,如DDL语言。
在ADO.NET中,命令信息是通过Command对象管理的。与数据库建立连接之后,可以使用Command对象执行命令并从数据源返回结果。
提供程序 | Command类 |
SQL数据提供程序 | SqlCommand |
OLE DB数据提供程序 | OleDbCommand |
Oracle数据提供程序 | OracleCommand |
ODBC数据提供程序 | OdbcCommand |
Command对象的使用
(1)Command对象的属性和方法
Command对象最常用的属性有CommandText、CommandType和Connection。其中CommandText属性用来获取或设置欲执行的内容,可以是SQL语句或者存储过程名称。CommandType属性用来获取或设置命令类型,指示当前命令是SQL语句还是存储过程名称。当将CommandType属性设置为StoredProcedure时,应将CommandText属性设置为存储过程的名称;CommandType属性设置为Text时,应将CommandText属性设置为SQL语句。Connection属性用来获取或设置Command对象使用的Connection对象。
Command对象最常用的方法有ExecuteNonQuery()、ExecuteReader()和ExecuteScalar()。其中ExecuteNonQuery()方法对连接执行Transact-SQL语句并返回受影响的行数。可以使用ExecuteNonQuery()方法来执行目录操作(例如查询数据库的结构或创建诸如表等的数据库对象),或通过执行UPDATE、INSERT或DELETE语句,在不使用 DataSet 的情况下更改数据库中的数据。虽然ExecuteNonQuery()方法不返回任何行,但映射到参数的任何输出参数或返回值都会用数据进行填充。对于UPDATE、INSERT和DELETE语句,返回值为该命令所影响的行数。对于所有其他类型的语句,返回值为-1。如果发生回滚,返回值也为-1。ExecuteReader()方法将CommandText所设置的命令信息发送到数据库,并生成一个SqlDataReader对象。ExecuteScalar()方法执行查询,并返回查询所返回的结果集中第一行的第一列,忽略其他列或行。使用ExecuteScalar()方法从数据库中检索单个值(例如一个聚合值)。与使用ExecuteReader()方法,然后使用SqlDataReader()返回的数据执行生成单个值所需的操作相比,此操作需要的代码较少。
eg.
//参数 执行的sql 语句 ,连接字符串
private static void CreateCommand(string queryString,string connectionString)
{
using (SqlConnection connection = new SqlConnection(connectionString))
{
SqlCommand command = new SqlCommand(); command.Connection = connection; command.CommandTimeout = ;
command.CommandType = CommandType.Text;
command.CommandText = queryString;
connection.Open();
//查询
SqlDataReader reader = command.ExecuteReader();
while (reader.Read())
{
Console.WriteLine(String.Format("{0}, {1}",reader[], reader[]));
}
}
}
SQLcommand
实训 向窗体添加Command对象组件并配置实验
Sqlconnection,SqlCommand,oledbconnection,oledbcommand对象组件在默认情况下工具箱中是没有的,需要手动添加。
鼠标左键单击SqlCommand对象,配置其Connection属性为sqlConnection1对象,配置其commandtext为用户自定义的SQL语句,如:select * from student。
u实验步骤(3):配置oledbCommand组件SQL命令
鼠标左键单击oledbconnection对象,命名为oledbconnection1,在其connectionstring属性之中点击下拉列表框,在弹出的添加连接对话框中点击数据源的更改按钮,在弹出的更改数据源对话框中,选择数据源为“Microsoft Access数据库文件”,点击确定后浏览本机Access数据库文件即可。
鼠标左键单击oledbCommand对象,配置其Connection属性为oleDbConnection1对象,配置其commandtext为用户自定义的SQL语句,如:select * from teacher。
学习2:通过编写代码来设置Command对象实验
SqlCommand类的构造函数表
名称 | 说明 |
SqlCommand() | 初始化SqlCommand类的新实例。 |
SqlCommand(String) | 用查询文本初始化SqlCommand类的新实例。 |
SqlCommand(String, SqlConnection) | 初始化具有查询文本和SqlConnection的SqlCommand类的新实例。 |
SqlCommand(String, SqlConnection, SqlTransaction) | 使用查询文本、一个SqlConnection以及SqlTransaction来初始化SqlCommand类的新实例。 |
单击button按钮后,向school数据库的student表之中插入一条数据。
private void button1_Click(object sender, EventArgs e)
{
SqlConnection conn = new SqlConnection();
conn.ConnectionString = "Data Source=(local);Initial Catalog=school;User ID=sa";
conn.Open();
//开始事务
SqlTransaction sqltran = conn.BeginTransaction();
string sqlstring = "insert into student(sno,sname) values(3390220,'张三')";
SqlCommand comm = new SqlCommand(sqlstring, conn);
comm.Transaction = sqltran;
int p = comm.ExecuteNonQuery();
//事务提交
sqltran.Commit();
comm.Dispose();
comm.Clone();
conn.Dispose();
conn.Close();
}
单击button按钮后,向school数据库的student表之中插入一条数据。
事务代码
static void Main(string[] args)
{ SqlConnection sqlConn = new SqlConnection(
ConfigurationManager.ConnectionStrings["ConnStr"].ConnectionString);
SqlTransaction sqlTrans = null;
try
{
sqlConn.Open();
sqlTrans = sqlConn.BeginTransaction();//事务开始
SqlCommand sqlComm = new SqlCommand("", sqlConn, sqlTrans);
sqlComm.CommandTimeout = ;
sqlComm.CommandType = System.Data.CommandType.Text; string insertSql = "insert into dbo.TransTestTable values (66,'66');";
string updateSql = "update dbo.TransTestTable set [Name] = '77' where [Id] = 66;"; sqlComm.CommandText = insertSql;
sqlComm.ExecuteNonQuery();//执行insert sqlComm.CommandText = updateSql;
sqlComm.ExecuteNonQuery();//执行update
//throw new Exception("test exception.the transaction must rollback"); sqlTrans.Commit();//事务提交
}
catch (Exception ex)
{
sqlTrans.Rollback();//事务回滚
Console.WriteLine(ex.Message);
}
finally
{
if (sqlConn.State != System.Data.ConnectionState.Closed)
sqlConn.Close();
} Console.ReadLine();
}
c#事务例子
sql 函数大全
https://www.cnblogs.com/ldy_ai/p/3644619.html
sql 语句
7 .NET中的事务处理
例如在一个销售系统里,通过帐单处理模块完成对销售表的数据处理,客户端销售人员已经将库存货品销售出去,但与销售表相关的库存表尚未及时更新,结果娶她销售人员再读取库存数据就会出现数据不一致的现象。
所谓事务就是这样的一系列操作,这些操作被视为一个操作序列,要么全做,要么全部做,是一个不可分割的程序单元。在数据库数据处理中经常会发生数据更新事件,为了保证数据操作的安全与一致,大型数据库服务器都支持事务处理,以保证数据更新在可控的范围内进行。ADO.NET通过Connection对象的BeginTransaction()方法实现对事务处理的支持,该方法返回一个实现IDbTransaction接口的对象,而该对象是在System.Data中被定义的。
1.事务处理命令
调用Connection对象的BeginTransaction()方法,返回的是一个DbTransaction对象。DbTransaction对象常用的事务处理命令包括下面三个:
nBegin:在执行事务处理中的任何操作之前,必须使用Begin命令来开始事务处理;
nCommit:在成功将所有修改都存储于数据库时,才算是提交了事务处理;
nRollback:由于在事务处理期间某个操作失败,而取消事务处理已做的所有修改,这时将发生回滚;
不同命名空间里的DbTransaction类名称是不同,表示也不同。参见表4-9:
表4-9 DbTransaction类在不同命名空间里的表
类 | 说明 |
OdbcTransaction | 表示对Odbc数据源进行的SQL 事务处理。 |
OleDbTransaction | 表示对OleDb数据源进行的SQL事务处理。 |
OracleTransaction | 表示对Oracle数据库进行的事务处理。 |
SqlTransaction | 表示要对SQL Server数据库进行的Transact-SQL事务处理。 |
SqlTransaction对象的使用
SqlTransaction对象的属性和方法
SqlTransaction对象表示要对数据源进行的事务处理,其常用的属性有Connection。Connection属性是用来获取与该事务关联的SqlConnection对象,或者如果该事务不再有效,则为空引用。SqlTransaction对象常用的方法有Save()、Commit()和Rollback(),其中Save()方法在事务中创建保存点(它可用于回滚事务的一部分),并指定保存点名称;Commit()方法用来提交数据库事务,Rollback()方法从挂起状态回滚事务。
private void button1_Click(object sender, EventArgs e)
{
SqlConnection conn = new SqlConnection();
conn.ConnectionString = "Data Source=(local);Initial Catalog=school;User ID=sa";
conn.Open();
//注意此处为一个事务开始之处
SqlTransaction sqltran = conn.BeginTransaction();
string sqlstring = "insert into student(sno,sname) values(3390220,'张三')";
SqlCommand comm = new SqlCommand(sqlstring, conn);
comm.Transaction = sqltran;
int p = comm.ExecuteNonQuery();
sqltran.Commit();
//此处为一个事务正常结束之处
comm.Dispose();
comm.Clone();
conn.Dispose();
conn.Close();
}
/*
第一步:通过连接对象产生事务对象sqltran;
第二步:将事务对象sqltran绑定到命令对象的Transaction属性;
第三步:执行命令对象;
第四步:通过事务对象sqltran的Commit()方法,提交事务,或者通过事务对象sqltran的Rollback()方法回滚事务。 */
事务处理代码
2 ADO.Net 查询和检索数据
n 掌握DataSet对象
n DataTable、DataColumn和DataRow对象
n DataAdapter对象
n DataReader对象
-1 DataSet对象
1.数据集DataSet概述
数据集DataSet是断开与数据源的连接时,可以被使用的数据记录在内存中的缓存,断开式数据库访问连接部分提到,可以把数据集DataSet看作是内存中的数据库。它在应用程序中对数据的支持功能十分强大。DataSet一经创建,就能在应用程序中充当数据库的位置,为应用程序提供数据支持。
数据集DataSet的数据结构可以在.net开发环境中通过向导完成,也可以通过代码来增加表、数据列、约束以及表之间的关系。数据集DataSet中的数据既可以来自数据源,也可以通过代码直接向表中增加数据行。这也看出,数据集DataSet类似一个客户端内存中的数据库,可以在这个数据库中增加、删除数据表,可以定义数据表结构和表之间的关系,可以增加、删除表中的行。
数据集DataSet不考虑其中的表结构和数据是来自数据库、XML文件还是程序代码,因此数据集DataSet不维护到数据源的连接。这缓解了数据库服务器和网络的压力。对数据集DataSet的特点总结可以总结为四点:
第一,使用数据集对象DataSet无需与数据库直接交互;
第二,DataSet对象是存储从数据库检索到的数据的对象;
第三,DataSet对象是零个或多个表对象的集合,这些表对象由数据行和列、约束和有关表中数据关系的信息组成;
第四,DataSet对象既可容纳数据库的数据,也可以容纳非数据库的数据源。
2.DataSet的结构,常用属性及方法
数据集DataSet是以DataSet对象形式存在的。DataSet对象是一种用户对象,此对象表示一组相关表,在应用程序中这些表作为一个单元来引用。DataSet对象的常用属性是Tables、Relations等
DataSet对象由数据表及表关系组成,所以DataSet对象包含DataTable对象集合Tables和DataRelation对象集合Relations。而每个数据表又包含行和列以及约束等结构,所以DataTable对象包含DataRow对象集合Rows、DataColumn对象集合Columns和Constraint对象集合Constraints。
类 | 说明 |
DataTableCollection | 包含特定数据集的所有DataTable对象 |
DataTable | 表示数据集中的一个表 |
DataColumnCollection | 表示DataTable对象的结构 |
DataRowCollection | 表示DataTable对象中的实际数据行 |
DataColumn | 表示DataTable对象中列的结构 |
DataRow | 表示DataTable对象中的一个数据行 |
r如图 :
所示的是用一个具体实例来描述的DataSet层次结构中各个类之间的关系。
整个图表示的是一个DataSet对象,用来描述一个学生成绩管理系统的客户端数据库。DataSet对象中的DataTableCollection数据表集合包含三个DataTable对象,分别是StudentTable代表学生表、ClassTable代表班级表和GradeTable代表成绩表。
其中在StudentTable对象中的DataColumnCollection数据列集合包含四个DataColumn对象,分别是id代表学生号、name代表学生姓名、class代表学生班级号和sex代表学生性别。
StudentTable对象还包含了按数据列定义结构的DataRow数据行集合DataRowCollection。
DataRowCollection数据行集合中的每个DataRow数据行表示一个学生的数据信息。例如第一条,学号为“1”、姓名是“小菲”、班级为“5”、性别为“女”。
DataSet对象常用属性表
属性 | 说明 |
DataSetName | 用于获取或设置当前数据集的名称 |
Tables | 用于检索数据集中包含的表集合 |
DataSet对象常用方法表
方法 | 说明 |
Clear() | 清除数据集中包含的所有表的所有行 |
HasChanges() | 返回一个布尔值,指示数据集是否更改了 |
3.数据集的工作原理
数据集DataSet的工作原理。首先,客户端与数据库服务器端建立连接。然后,由客户端应用程序向数据库服务器发送数据请求。数据库服务器接到数据请求后,经检索选择出符合条件的数据,发送给客户端的数据集,这时连接可以断开。接下来,数据集以数据绑定控件或直接引用等形式将数据传递给客户端应用程序。如果客户端应用程序在运行过程中有数据发生变化,它会修改数据集里的数据。当应用程序运行到某一阶段时,比如应用程序需要保存数据,就可以再次建立客户端到数据库服务器端的连接,将数据集里的被修改数据提交给服务器,最后再次断开连接。
把这种不需要实时连接数据库的工作过程叫做面向非连接的数据访问。在DataSet对象中处理数据时,客户端应用程序仅仅是在本地机器上的内存中使用数据的副本。这缓解了数据库服务器和网络的压力,因为只有在首次获取数据和编辑完数据并将其回传到数据库时,才能连接到数据库服务器。
虽然这种面向非连接的数据结构有优点,但还是存在问题。当处于断开环境时,客户端应用程序并不知道其他客户端应用程序对数据库中原数据所做的改动。很有可能得到的是过时的信息。
案例学习:通过编码创建DataSet对象
private void Form5_Load(object sender, EventArgs e)
{
//建立SQL Server数据库连接
string connstring = "Data Source=(local);Initial Catalog=school;User ID=sa";
SqlConnection connection = new SqlConnection(connstring);
connection.Open();
string sqlstring = "select * from student";
SqlCommand mycom = new SqlCommand(sqlstring, connection);
SqlDataAdapter adapter = new SqlDataAdapter();
adapter.SelectCommand = mycom;
//创建DataSet对象
DataSet SQLds = new DataSet();
adapter.Fill(SQLds);//通过SqlDataAdapter对象填充DataSet对象
//释放数据库连接资源。要养成了好的编程习惯,操作完数据后记住打扫垃圾!
connection.Dispose();
connection.Close();
connection = null;
}
编程
使用类型化数据集访问列,参见如下代码:
string employeeName;
employeeName = dsEmployees.Emp[0].EmpName;
从dsEmployees数据集的Emp表中第一个记录返回EmpName列,然后将其存储在employeeName字符串变量中。
使用非类型化数据集访问列 ,参见如下代码:
string employeeName;
employeeName = dsEmployees.Tables["Emp"].Rows[0]["EmpName"];
使用Tables集合返回EmpName列。
案例学习:数据集的类型——通过图形化界面生成类型化数据集
通过图形化界面生成类型化数据集的过程大致分为三步:
u 实验步骤(1):
创建数据库连接对象。
从工具箱中选中SqlConnection,拖放到窗体上,窗体设计器的组件栏出现sqlConnection1对象,鼠标右击sqlConnection1对象,选择“属性”。在属性窗口找到ConnectionString属性,在右侧下拉栏里选择“新建连接”,弹出“添加连接”窗口。在“添加连接”窗口的服务器名处填写“(local)”,选择“使用SQL Server身份验证”,用户名为“sa”,选择或输入一个数据库名处选择“school”。最后点击“确定”关闭“添加连接”窗口。ConnectionString属性右侧栏中出现字符串“Data Source=(local);Initial Catalog=school;User ID=sa”。
前面这个过程可能因不同服务器、不同数据库、不同帐号而不同,这里只是举个例子,希望读者根据具体情况来完整这一步。
u实验步骤(2):
添加新数据源
接上一步,在.net开发环境的工具栏里选择 项目--》“数据”菜单中的“添加新数据源”,弹出“数据源配置向导”窗口。在这个窗口点击“数据库”图标,点击“下一步”,然后选择“schoolConnectionString(Settings)”。再连续点击两次“下一步”,接下来选择窗体中的表、视图、存储过程或者函数。最后点击“完成”关闭窗口。
u实验步骤(3):
接上一步,在工具箱中选择DataSet,拖放到窗体上,弹出“添加数据集”窗口,默认选择类型化数据集,名称为“WindowsApplication1.schoolDataSet”。这个名称源于数据源中的“schoolDataSet”。点击“确定”关闭“添加数据集”窗口,窗体设计器的组件栏出现schoolDataSet1对象。经过上述三步,在图形化界面就生成类型化数据集。
数据集的类型——通过图形化界面生成非类型化数据集
通过图形化界面生成非类型化数据集的过程大致也分为三步:
u实验步骤(1):
建立表及主键。
在工具箱中选择DataSet,拖放到窗体上,弹出“添加数据集”窗口,选择“非类型化数据集”。点击“确定”关闭“添加数据集”窗口,窗体设计器的组件栏出现dataSet1对象。鼠标右击dataSet1对象,选择“属性”。在属性窗口找到Tables属性,在右侧栏里选择“…”按钮,弹出“表集合编辑器”窗口。在“表集合编辑器”窗口中点击“添加”按钮,左侧列表框中出现一个表名为“Table1”的项,这是添加的第一个表。“表集合编辑器”窗口的右侧列表的是表Table1的属性。找到TableName属性,将其设置为“student”。找到Columns属性,在右侧栏里选择“…”按钮,弹出“列集合编辑器”窗口。“列集合编辑器”窗口与“表集合编辑器”窗口基本一样。用类似的办法连续点击五次“添加”按钮,左侧列表框中出现五项。在右侧属性栏,将其ColumnName属性分别设置为“sno”、“sname”、“ssex”、“sclass”、“birthday”,同时也修改DataType属性为相应的值。最后点击“关闭”关闭“列集合编辑器”窗口。
u 实验步骤(2):
建立表的主键唯一性约束。
接上一步,找到表student的Constraints属性,在右侧栏里选择“…”按钮,弹出“约束集合编辑器”窗口。“约束集合编辑器”窗口与“表集合编辑器”窗口基本一样。点击“添加”时要选择“唯一约束”或“外键约束”。选择“唯一约束”后,弹出“唯一约束”窗口,接下来就要填写约束名称,选择主键列“sno”,下面的“主键”复选框也要勾选。点击“确定”关闭“唯一约束”窗口。这时“约束集合编辑器”窗口中左侧列表框出现一个项,这是添加的第一个主键唯一性约束。
u实验步骤(3):
建立表的外键约束。
接上一步,在“约束集合编辑器”窗口点击“添加”时要选择“外键约束”,弹出“外键约束”窗口。在“外键约束”窗口填写约束名称,选择外键约束的父表(即被引用的表),以及父表被引用的键列和当前表的外键列。同时还要选择更新规则、删除规则和接受/拒绝规则。点击“确定”关闭“唯一约束”窗口。这时“约束集合编辑器”窗口中左侧列表框出现另一个项,这是添加的第一个外键约束。再连续点击两次“关闭”按钮,关闭“约束集合编辑器”窗口和“表集合编辑器”窗口。经过上述三步,在图形化界面就生成非类型化数据集。
小知识:
更新、删除规则的选择
更新、删除以及接受/拒绝规则中可选项有四种:Cascade、None、SetNull、SetDefault。
其中Cascade表示级联操作,当父表键列发生更新、删除以及接受/拒绝操作时,子表的外键列也发生相应的操作。None表示无操作,当父表键列发生更新、删除以及接受/拒绝操作时,子表的外键列不采取任何操作。SetNull表示置空操作,当父表键列发生更新、删除操作时,子表的外键列相关行中的值置空。SetDefault表示置默认值操作,当父表键列发生更新、删除操作时,子表的外键列相关行中的值置DefaultValue属性中默认的值。
1. 案例学习:数据集的类型——编码实现非类型化数据集
在本节“通过编码创建DataSet对象”的案例学习中,我们建立了窗体Form5,本案例在Form5窗体之中添加一个Label标签控件,命名为Label1,用以显示从数据库表之中读取的相关数据信息,最终实现通过编码实现非类型化数据集的实验目的。
private void Form1_Load(object sender, EventArgs e)
{
string connstring = "Server=10.87.12.251,1433;DataBase=ccut_soft;User ID=sa;PWD=123456";
SqlConnection connection = new SqlConnection(connstring);
connection.Open();
string sqlstring = "select * from soft_student";
SqlCommand mycom = new SqlCommand(sqlstring, connection);
SqlDataAdapter adapter = new SqlDataAdapter();
adapter.SelectCommand = mycom;
//设置DataSet对象
DataSet ds = new DataSet();
adapter.Fill(ds);
//开始循环读取DataSet中的数据表信息
label1.Text = "";
for (int i = ; i < ds.Tables[].Rows.Count; i++)
{
//label1.Text += ds.Tables[0].Rows[i]["sname"].ToString()+"\n";
label1.Text +=ds.Tables[].Rows[i][].ToString() + "\n";
}
//释放数据库连接资源
connection.Dispose();
connection.Close();
connection = null;
}
取数据集
2-2 DataTable、DataColumn和DataRow对象
1.DataTable对象
DataTable对象是内存中的一个数据表,主要由DataRow对象和DataColumn对象组成。DataTable对象是组成DataSet对象的主要组件,因DataSet对象可以接收由DataAdapter对象执行SQL指令后所取得的数据,这些数据是DataTable对象的格式,所以DataSet对象也需要许多DataTable对象来储存数据,并可利用DataRows集合对象中的Add方法加入新的数据。
DataTable对象常用属性表
属性 | 说明 |
Columns | 表示列的集合或DataTable包含的DataColumn |
Constraints | 表示特定DataTable的约束集合 |
DataSet | 表示DataTable所属的数据集 |
PrimaryKey | 表示作为DataTable主键的字段或DataColumn |
Rows | 表示行的集合或DataTable包含的DataRow |
HasChanges | 返回一个布尔值,指示数据集是否更改了 |
DataTable对象常用方法表
方法 | 说明 |
AcceptChanges() | 提交对该表所做的所有修改 |
NewRow() | 添加新的DataRow |
DataTable对象常用的事件
DataTable对象常用事件表
事件 | 说明 |
ColumnChanged | 修改该列中的值时激发该事件 |
RowChanged | 成功编辑行后激发该事件 |
RowDeleted | 成功删除行时激发该事件 |
根据类DataTable构造函数的多种重载,类DataTable的实例化,有两种常用方法:
第一种方法
请看下面的代码示例:
DataTable objStudentTable = new DataTable("Students");
创建DataTable对象的实例,以表名字符串作为参数。
第二种方法
创建DataTable对象的实例,无参数。创建后,再修改TableName属性,给表设定表名。
此外,请看下面的代码示例:
DataSet studentDS = new DataSet();
DataTable objStudentTable = studentDS.Tables.Add("Students");
创建DataTable的实例,然后将其添加到数据集的Tables集合中。
实际编程中常用这种办法,一条代码完成多个任务。
2.DataColumn对象
即数据表的字段,表示DataTable中列的结构,所组成的集合即为DataTable对象中的Columns属性,是组成数据表的最基本单位,其中DataTable的Columns属性含有对DataColumn对象的引用。DataColumn对象常用的属性请参见所示:
DataColumn对象常用属性表
属性 | 说明 |
AllowDBNull | 表示一个值,指示对于该表中的行,此列是否允许null值 |
ColumnName | 表示指定DataColumn的名称 |
DataType | 表示指定DataColumn对象中存储的数据类型 |
DefaultValue | 表示新建行时该列的默认值 |
Table | 表示DataColumn所属的DataTable的名称 |
Unique | 表示DataColumn的值是否必须是唯一的 |
请看下面的使用示例代码:
DataTable objStudentTable = new DataTable("Students");
DataColumn objStudentNumber = objStudentTable.Columns.Add("StudentNo ", typeof(Int32));
objStudentNumber.AllowDBNull = false;
objStudentNumber.DefaultValue = 25;
objStudentTable.Columns.Add("StudentName", typeof(Int32));
objStudentTable.Columns.Add("StudentMarks", typeof(Double));
代码中使用多个DataColumn对象创建DataTable对象的数据结构。
3.DataRow对象
即数据表的元组行,DataRow对象表示DataTable中的一行数据,代表DataTable中的一行实际数据。DataRow对象常用的属性请参见表4-17所示:
表4-17 DataRow对象常用属性表
属性 | 说明 |
Item | 表示DataRow的指定列中存储的值 |
RowState | 表示行的当前状态 |
Table | 表示用于创建DataRow的DataTable的名称 |
DataRow对象常用的方法请参见表4-18所示:
表4-18 DataRow对象常用方法表
方法 | 说明 |
AcceptChanges() | 用于提交自上次调用了AcceptChanges()之后对该行所做的所有修改 |
Delete() | 用于删除DataRow |
RejectChanges() | 用于拒绝自上次调用了AcceptChanges()之后对DataRow所做的所有修改 |
请看下面的使用示例代码: //定义表结构,为Students表添加属性列
DataTable studt = new DataTable("student"); DataColumn sno = new DataColumn(); sno = studt.Columns.Add("sno", typeof(int));
sno.AllowDBNull = false;
sno.Unique = true; DataColumn sname = new DataColumn();
sname = studt.Columns.Add("sname", typeof(string));
sname.AllowDBNull = false;
sname.Unique = false; DataColumn ssex = new DataColumn();
ssex = studt.Columns.Add("ssex", typeof(string));
ssex.AllowDBNull = false;
ssex.Unique = false;
ssex.DefaultValue = "男"; DataColumn sbirthday = new DataColumn();
sbirthday = studt.Columns.Add("sbirthday", typeof(string));
sbirthday.DefaultValue = DateTime.Now.ToLongDateString();
studt.Columns.Add("sclass", typeof(string));
//添加数据
DataRow dr = studt.NewRow();
dr["sno"] = ;
dr["sname"] = "张三";
dr["ssex"] = "男";
dr["sbirthday"] = "1980-2-1";
dr["sclass"] = "";
//把数据加入到
studt.Rows.Add(dr);
//读出添加行的数据
for (int i = ; i < studt.Rows.Count; i++)
{
label1.Text = "编号:" + dr["sno"].ToString() + ";姓名:" + dr["sno"].ToString() + ";性别:" + dr["ssex"].ToString() + ";生日:" + dr["sbirthday"].ToString() + ";班级:" + dr["sclass"].ToString();
}
/*从代码中可以看出,是在DataTable对象中新建DataRow对象的,利用的是DataTable对象的NewRow()方法。 */
代码
4.如何定义Datatable的主键
根据数据库基本理论,所谓表中的主键用于对记录行进行唯一标识的属性或者属性集合的统称,同样DataTable的主键属性接受含有一个或多个DataColumn对象的数组。
设置单个列为DataTable的主键,请看下面的使用示例代码:
objStudentTable.PrimaryKey = new DataColumn[]{objStudentTable.Columns["StudentNo"]}
代码中将表objStudentTable的"StudentNo"列作为表的主键。
为DataTable对象设置复合主键,请看下面的使用示例代码:
objStudentTable.PrimaryKey = new DataColumn[]{objStudentTable.Columns["StudentNo"], objStudentTable.Columns["StudentName"]};
代码中将表objStudentTable的"StudentNo"列和"StudentName"的组合作为表的主键。
5.DataTable的约束
所谓关系型数据库的约束,实质是数据库理论中三个参照完成整性的规定:实体完整性(主属性非空唯一性),参照完整性(外键可以为空,一旦添加数据则必须受制于主表的主键约束)和用户定义完整性(用户自行规定的属性规则)。DataTable对象的属性Constraints就是用来进行对关系型数据表进行约束的,它里面可以包含若干Constraint对象,每个Constraint对象是这个DataTable对象的一个约束。约束的作用是用于维护数据的正确性和有效性。
其中ForeignKeyConstraint表示删除或更新某个值或行时,对主键/外键关系中一组列强制进行的操作限制。UniqueConstraint表示对一组列的限制,列中的所有值必须是唯一的。
6.DataView对象
这里,我们首先引入数据绑定的概念,数据绑定是为了在控件上显示数据库表中存储的数据,而将应用程序的控件与数据表的行进行绑定的过程。
DataView对象表示用于排序、筛选、搜索、编辑和导航的DataTable的可绑定数据的自定义视图。DataView对象的作用主要体现四个方面,
DataView对象常用的方法和属性请参见表4-19和表4-20所示:
表4-19 DataView对象常用属性表
属性 | 说明 |
Item | 用于从指定的表中获取一行数据 |
RowFilter | 用于获取或设置表达式,该表达式用于筛选可以在DataView中查看的行 |
RowStateFilter | 用于获取DataView的行状态筛选器 |
Table | 用于表示源DataTable |
表4-20 DataView对象常用方法表
方法 | 说明 |
AddNew() | 向DataView添加新行 |
Delete() | 用于删除指定索引处的行 |
DataView objStudentView = new DataView(objStudentTable);
objStudentView.RowFilter = "StudentMarks > 60";
for (int ctr = 0; ctr < objStudentView.Count; ctr++)
{
MessageBox.Show(objStudentView[ctr]["StudentNo"].ToString());
}
在上面的代码中,创建了DataView对象并对该视图应用某种筛选器。得到的DataView对象可能是objStudentTable表的一个子集,范围是"StudentMarks"字段值大于60的所有学生信息记录。
DataView类的构造函数重载表
名称 | 说明 |
DataView() | 初始化DataView类的新实例。 |
DataView(DataTable) | 用指定的DataTable初始化DataView类的新实例。 |
DataView(DataTable, String, String, DataViewRowState) | 用指定的DataTable、RowFilter、Sort和DataViewRowState初始化DataView类的新实例。 |
private void MakeDataView()
{
DataView view = new DataView();
view.Table = DataSet1.Tables["Suppliers"];
view.AllowDelete = true;
view.AllowEdit = true;
view.AllowNew = true;
view.RowFilter = "City = 'Berlin'";
view.RowStateFilter = DataViewRowState.ModifiedCurrent;
view.Sort = "CompanyName DESC";
//简单绑定到一个TextBox控件上
Text1.DataBindings.Add("Text", view, "CompanyName");
}
chengg
代码中用的是第一种构造函数实例化一个DataView对象,实例化后仍然需要为DataView对象指定数据表和RowFilter、Sort和RowStateFilter等属性。但如果用第三种构造函数实例化,在后续代码中就不需要设置上述属性。
DataView的一个主要功能是允许在Windows窗体和Web窗体上进行数据绑定。
另外,可自定义DataView来表示DataTable中数据的子集。此功能让您拥有绑定到同一DataTable、但显示不同数据版本的两个控件。例如,一个控件可能绑定到显示表中所有行的DataView,而另一个控件可能配置为只显示已从DataTable删除的行。DataTable也具有DefaultView属性。它返回表的默认DataView。例如,如果希望在表上创建自定义视图,请在DefaultView返回的DataView上设置RowFilter。
若要创建数据的筛选和排序视图,请设置RowFilter和Sort属性。然后,使用Item属性返回单个DataRowView。你还可使用AddNew()和Delete()方法从行的集合中进行添加和删除,而在使用这些方法时,可设置RowStateFilter属性以便指定只有已被删除的行或新行才可由DataView显示。
2-3 DataAdapter对象
前面的章节提到客户端应用程序去访问DataSet对象中的数据。那么,如何将数据库的数据放在DataSet中?这里就需要利用DataAdapter对象来实现这个功能。
从类比关系中可以看出,DataAdapter数据适配器就像大货车一样,可以将数据从数据库这个大仓库运输到DataSet数据集这个临时仓库。也可以把数据从数据库这个DataSet数据集这个临时仓库运输到大仓库。不过有一点要说明:生活中的仓库里面的货物被运走了,就没有了。但数据库里的数据被传输到客户端时,数据不会消失。这是信息世界与物质世界的不同。
1.DataAdapter对象概述
DataAdapter数据适配器用于在数据源和数据集之间交换数据。在许多应用程序中,这意味着从数据库将数据读入数据集,然后从数据集将已更改数据写回数据库。
这经常采用的形式是对SQL语句或存储过程的引用,这些语句或存储过程被调用时即可实现对数据库进行读写。
每个数据适配器DataAdapter都将在单个数据源表和数据集内的单个DataTable对象之间交换数据。如果数据集包含多个数据表,通常的策略是令多个数据适配器向数据集提供数据,并将其数据写回各个数据源表。
DataAdapter对象表示一组数据命令和一个数据库连接,用于填充DataSet对象和更新数据源。作为DataSet对象和数据源之间的桥接器,通过映射Fill()方法向DataSet填充数据,通过Update()方法向数据库更新DataSet对象中的变化。这些操作实际上是由DataAdapter对象包含的Select、Update、Insert、Delete四种Command命名对象实现的。也可以直接结合Command对象的使用来完成数据的操作。
在客户端应用程序需要处理数据源的数据时,客户端应用程序与数据源之间建立连接。引用数据命令的DataAdapter对象向数据源发送数据命令请求,这个请求是执行DataAdapter对象的Fill()方法来完成“填充”操作时发送并被数据源执行的。数据源的数据就会填充到客户端的DataSet对象,在DataSet对象内部形成具有跟数据源数据结构一致的数据表DataTable对象,而DataTable对象内部有包含表示数据结构的DataColumn对象集合和表示数据约束的Constraint对象集合,还含有表示数据记录的DataRow对象的集合。数据以及数据结构填充到DataSet对象后,DataSet数据集相当于一个脱机数据库,客户端应用程序操作的数据完全从DataSet数据集中获取。这是客户端DataSet数据集与数据源之间可以断开连接,也就是说它们之间的关系是非永久连接关系。只有客户端完成数据操作需要将数据回传给数据源时,再次建立连接。由DataAdapter对象再次向数据源发送数据命令请求,这个请求是执行DataAdapter对象的Update()方法来完成“更新”操作时发送并被数据源执行的。执行后,连接再次断开。.NET提供程序及其DataAdapter类,
个命名空间中的DataAdapter对象表
提供程序 | DataAdapter类 |
SQL数据提供程序 | SqlDataAdapter |
OLE DB数据提供程序 | OleDbDataAdapter |
Oracle数据提供程序 | OracleDataAdapter |
ODBC数据提供程序 | OdbcDataAdapter |
2.DataAdapter对象使用
(1)DataAdapter对象的属性和方法
DataAdapter对象常用的方法和属性请参见表4-23和表4-24所示:
表4-23 DataAdapter对象常用属性表
属性 | 说明 |
AcceptChangesDuringFill | 决定在把行复制到DataTable中时对行所做的修改是否可以接受 |
TableMappings | 容纳一个集合,该集合提供返回行和数据集之间的主映射 |
表4-24 DataAdapter对象常用方法表
方法 | 说明 |
Fill() | 用于添加或刷新数据集,以便使数据集与数据源匹配 |
FillSchema() | 用于在数据集中添加DataTable,以便与数据源的结构匹配 |
Update() | 将DataSet里面的数值存储到数据库服务器上 |
static private DataSet CreateCommandAndUpdate(string connectionString,string queryString)
{
DataSet dataSet = new DataSet();
using (OleDbConnection connection = new OleDbConnection(connectionString))
{
connection.Open();
OleDbDataAdapter dataAdapter = new OleDbDataAdapter();
dataAdapter.SelectCommand = new OleDbCommand(queryString, connection); OleDbCommandBuilder commandBuilder = new OleDbCommandBuilder(dataAdapter); /*首先利用dataAdapter.Fill()将数据从数据源填充到数据集dataSet;最后又利用dataAdapter.Update()将数据集dataSet中的数据回传至数据源。 */ dataAdapter.Fill(dataSet);
//这里填写修改数据集dataSet的代码
//如果没有使用OleDbCommandBuilder,这行会报错
dataAdapter.Update(dataSet);
}
return dataSet;
}
(2) 如何填充
使用DataAdapter对象填充数据集分两步:
第一步:使用Connection连接数据源;
第二步:使用Fill()方法填充DataSet中的表。
(3)如何保存DataSet中的数据
把数据集中修改过的数据再提交给数据源,
这里只是应用最简单的Update()一个表,通过SqlCommandBuilder对象来自动生成更新需要的相关命令,不用手动一个一个的写,简化操作。
SQLDataAdapter完成对数据库的删除修改和插入
本实验目标是要求编写一个应用程序,利用SQLDataAdapter对象实现可以添加、修改、删除学生基本信息的功能。