c# 窗体开发4 数据库访问技术
ADO.NET的名称起源于ADO(ACTIVEX DATA OBJECTS)
1 USING SYSTEM; 2 USING SYSTEM.COLLECTIONS.GENERIC; 3 USING SYSTEM.DATA; 4 USING SYSTEM.DATA.SQLCLIENT; 5 6 CLASS PROGRAM 7 { 8 STATIC VOID MAIN() 9 { 10 STRING CONNECTIONSTRING = GETCONNECTIONSTRING(); 11 STRING QUERYSTRING = "SELECT CATEGORYID, CATEGORYNAME FROM DBO.CATEGORIES;"; 12 USING (SQLCONNECTION CONNECTION = NEW SQLCONNECTION(CONNECTIONSTRING)) 13 { 14 SQLCOMMAND COMMAND = CONNECTION.CREATECOMMAND(); 15 COMMAND.COMMANDTEXT = QUERYSTRING; 16 TRY 17 { 18 CONNECTION.OPEN(); 19 SQLDATAREADER READER = COMMAND.EXECUTEREADER(); 20 WHILE (READER.READ()) 21 { 22 CONSOLE.WRITELINE("\T{0}\T{1}",READER[0], READER[1]); 23 } 24 CONSOLE.READKEY(); 25 READER.CLOSE(); 26 } 27 CATCH (EXCEPTION EX) 28 { 29 CONSOLE.WRITELINE(EX.MESSAGE); 30 } 31 } 32 } 33 34 STATIC PRIVATE STRING GETCONNECTIONSTRING() 35 { 36 // TO AVOID STORING THE CONNECTION STRING IN YOUR CODE, 37 // YOU CAN RETRIEVE IT FROM A CONFIGURATION FILE. 38 RETURN "DATA SOURCE=(LOCAL);INITIAL CATALOG=NORTHWIND;"+ "INTEGRATED SECURITY=SSPI"; 39 } 40 }
ADO.NET 对象模型中有五个主要的组件,分别是Connection对象、Command对象、DataAdapter对象、DataSet对象以及DataReader对象。
ADO.NET对数据库的访问
1.断开式数据库访问连接
3.对于Insert,Update,Delete等单向操作
4.对于Select的双向操作
首先,建立针对具体数据库的Connection对象,利用Connection对象的Open()方法打开数据库;然后,包含查询命令信息的Command对象和DataAdapter内伴生的SelectCommand对象都可以执行命令信息对应的命令,查询得到的数据可以通过DataReader对象获取或者被DataAdapter对象用Fill()方法填充在DataSet对象中;最后,利用Connection对象的Close()方法关闭数据库。
-1-4 ADO.NET连接数据库管理系统
1.ADO.NET连接数据库的类型及方法
对象
|
说明
|
Connection
|
建立与特定数据源的连接。所有Connection对象的基类均为DbConnection类。
|
Command
|
对数据源执行命令。公开Parameters,并且可以通过Connection在Transaction的范围内执行。所有Command对象的基类均为DbCommand类。
|
DataReader
|
从数据源中读取只进且只读的数据流。所有DataReader对象的基类均为DbDataReader类。
|
DataAdapter
|
用数据源填充DataSet并解析更新。所有DataAdapter对象的基类均为DbDataAdapter类。
|
对象
|
说明
|
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;
using System.Data.OracleClient;
access 数据库 头文件
using System.Data.OleDb;
驱动程序
|
提供程序
|
SQLOLEDB
|
用于SQL Server的Microsoft OLE DB提供程序
|
MSDAORA
|
用于Oracle的Microsoft OLE DB提供程序
|
Microsoft.Jet.OLEDB.4.0
|
用于Microsoft Jet的OLE DB提供程序
|
ADO.NET与ODBC的关联
驱动程序
|
SQL Server
|
Microsoft ODBC for Oracle
|
Microsoft Access 驱动程序 (*.mdb)
|
ADO.NET与Oracle的关联
各个对象属性介绍
1.Connection 对象
要开发数据库应用程序,首先需要建立与数据库的连接。在ADO.NET中,数据库连接是通过Connection对象管理的。此外,事务管理也通过Connection对象进行。
提供程序
|
Connection类
|
SQL数据提供程序
|
SqlConnection
|
OLE DB数据提供程序
|
OleDbConnection
|
Oracle数据提供程序
|
OracleConnection
|
ODBC数据提供程序
|
OdbcConnection
|
x
Connection对象的使用
Connection对象最常用的方法有Open()和Close()。其中Open()方法使用ConnectionString所指定的属性设置打开数据库连接。如果SqlConnection超出范围,则不会将其关闭。因此,必须通过调用Close显式关闭该连接。Close()方法用来关闭与数据库的连接。这是关闭任何打开连接的首选方法。
1 private static void OpenSqlConnection(string connectionString) 2 { 3 using (SqlConnection connection = new SqlConnection(connectionString)) 4 { 5 connection.Open(); 6 Console.WriteLine("ServerVersion: {0}", connection.ServerVersion); 7 Console.WriteLine("State: {0}", connection.State); 8 } 9 }
(2)可以通过图形来实现
.NET开发平台将一部分对象做成可视化的对象组件,程序员在编程的时候可以不用编写大量代码去定义和使用,只需要在工具箱中拖拽一个组件到窗体上,就可以进行配置使用。这种方式大幅的提高了编程效率,降低了出错率,但是在实际项目开发中不建议采取这种拖拽的形式进行ADO.NET开发。
通过拖拽形式建立Connection对象的数据库连接实验
方式一
SqlConnection sql=new SqlConnection("Data Source=10.5.0.30;Initial Catalog=TTDB;
方式二
2. Command对象
数据库连接建立好以后,要操作数据库就得向数据库发送命令信息。所谓命令信息就是指SQL语句或者存储过程名称。除了增删查改数据外,命令信息还可以对数据源执行一些不返回结果集的查询,以及改变数据源结构的数据定义命令信息,如DDL语言。
在ADO.NET中,命令信息是通过Command对象管理的。与数据库建立连接之后,可以使用Command对象执行命令并从数据源返回结果。
提供程序
|
Command类
|
SQL数据提供程序
|
SqlCommand
|
OLE DB数据提供程序
|
OleDbCommand
|
Oracle数据提供程序
|
OracleCommand
|
ODBC数据提供程序
|
OdbcCommand
|
Command对象的使用
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.
1 //参数 执行的sql 语句 ,连接字符串 2 private static void CreateCommand(string queryString,string connectionString) 3 { 4 using (SqlConnection connection = new SqlConnection(connectionString)) 5 { 6 SqlCommand command = new SqlCommand(); 7 8 command.Connection = connection; 9 10 command.CommandTimeout = 15; 11 command.CommandType = CommandType.Text; 12 command.CommandText = queryString; 13 connection.Open(); 14 //查询 15 SqlDataReader reader = command.ExecuteReader(); 16 while (reader.Read()) 17 { 18 Console.WriteLine(String.Format("{0}, {1}",reader[0], reader[1])); 19 } 20 } 21 }
实训 向窗体添加Command对象组件并配置实验
Sqlconnection,SqlCommand,oledbconnection,oledbcommand对象组件在默认情况下工具箱中是没有的,需要手动添加。
学习2:通过编写代码来设置Command对象实验
名称
|
说明
|
初始化SqlCommand类的新实例。
|
|
用查询文本初始化SqlCommand类的新实例。
|
|
SqlCommand(String, SqlConnection)
|
初始化具有查询文本和SqlConnection的SqlCommand类的新实例。
|
使用查询文本、一个SqlConnection以及SqlTransaction来初始化SqlCommand类的新实例。
|
单击button按钮后,向school数据库的student表之中插入一条数据。
1 private void button1_Click(object sender, EventArgs e) 2 { 3 SqlConnection conn = new SqlConnection(); 4 conn.ConnectionString = "Data Source=(local);Initial Catalog=school;User ID=sa"; 5 conn.Open(); 6 //开始事务 7 SqlTransaction sqltran = conn.BeginTransaction(); 8 string sqlstring = "insert into student(sno,sname) values(3390220,'张三')"; 9 SqlCommand comm = new SqlCommand(sqlstring, conn); 10 comm.Transaction = sqltran; 11 int p = comm.ExecuteNonQuery(); 12 //事务提交 13 sqltran.Commit(); 14 comm.Dispose(); 15 comm.Clone(); 16 conn.Dispose(); 17 conn.Close(); 18 }
事务代码
1 static void Main(string[] args) 2 { 3 4 SqlConnection sqlConn = new SqlConnection( 5 ConfigurationManager.ConnectionStrings["ConnStr"].ConnectionString); 6 SqlTransaction sqlTrans = null; 7 try 8 { 9 sqlConn.Open(); 10 sqlTrans = sqlConn.BeginTransaction();//事务开始 11 SqlCommand sqlComm = new SqlCommand("", sqlConn, sqlTrans); 12 sqlComm.CommandTimeout = 120; 13 sqlComm.CommandType = System.Data.CommandType.Text; 14 15 string insertSql = "insert into dbo.TransTestTable values (66,'66');"; 16 string updateSql = "update dbo.TransTestTable set [Name] = '77' where [Id] = 66;"; 17 18 sqlComm.CommandText = insertSql; 19 sqlComm.ExecuteNonQuery();//执行insert 20 21 sqlComm.CommandText = updateSql; 22 sqlComm.ExecuteNonQuery();//执行update 23 //throw new Exception("test exception.the transaction must rollback"); 24 25 sqlTrans.Commit();//事务提交 26 } 27 catch (Exception ex) 28 { 29 sqlTrans.Rollback();//事务回滚 30 Console.WriteLine(ex.Message); 31 } 32 finally 33 { 34 if (sqlConn.State != System.Data.ConnectionState.Closed) 35 sqlConn.Close(); 36 } 37 38 Console.ReadLine(); 39 }
sql 函数大全
https://www.cnblogs.com/ldy_ai/p/3644619.html
7 .NET中的事务处理
例如在一个销售系统里,通过帐单处理模块完成对销售表的数据处理,客户端销售人员已经将库存货品销售出去,但与销售表相关的库存表尚未及时更新,结果娶她销售人员再读取库存数据就会出现数据不一致的现象。
所谓事务就是这样的一系列操作,这些操作被视为一个操作序列,要么全做,要么全部做,是一个不可分割的程序单元。在数据库数据处理中经常会发生数据更新事件,为了保证数据操作的安全与一致,大型数据库服务器都支持事务处理,以保证数据更新在可控的范围内进行。ADO.NET通过Connection对象的BeginTransaction()方法实现对事务处理的支持,该方法返回一个实现IDbTransaction接口的对象,而该对象是在System.Data中被定义的。
1.事务处理命令
类
|
说明
|
OdbcTransaction
|
表示对Odbc数据源进行的SQL 事务处理。
|
OleDbTransaction
|
表示对OleDb数据源进行的SQL事务处理。
|
OracleTransaction
|
表示对Oracle数据库进行的事务处理。
|
SqlTransaction
|
表示要对SQL Server数据库进行的Transact-SQL事务处理。
|
SqlTransaction对象的使用
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 查询和检索数据
-1 DataSet对象
1.数据集DataSet概述
2.DataSet的结构,常用属性及方法
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”、性别为“女”。
属性
|
说明
|
DataSetName
|
用于获取或设置当前数据集的名称
|
Tables
|
用于检索数据集中包含的表集合
|
方法
|
说明
|
Clear()
|
清除数据集中包含的所有表的所有行
|
HasChanges()
|
返回一个布尔值,指示数据集是否更改了
|
3.数据集的工作原理
案例学习:通过编码创建DataSet对象
1 private void Form5_Load(object sender, EventArgs e) 2 { 3 //建立SQL Server数据库连接 4 string connstring = "Data Source=(local);Initial Catalog=school;User ID=sa"; 5 SqlConnection connection = new SqlConnection(connstring); 6 connection.Open(); 7 string sqlstring = "select * from student"; 8 SqlCommand mycom = new SqlCommand(sqlstring, connection); 9 SqlDataAdapter adapter = new SqlDataAdapter(); 10 adapter.SelectCommand = mycom; 11 //创建DataSet对象 12 DataSet SQLds = new DataSet(); 13 adapter.Fill(SQLds);//通过SqlDataAdapter对象填充DataSet对象 14 //释放数据库连接资源。要养成了好的编程习惯,操作完数据后记住打扫垃圾! 15 connection.Dispose(); 16 connection.Close(); 17 connection = null; 18 }
案例学习:数据集的类型——通过图形化界面生成类型化数据集
数据集的类型——通过图形化界面生成非类型化数据集
1. 案例学习:数据集的类型——编码实现非类型化数据集
1 private void Form1_Load(object sender, EventArgs e) 2 { 3 string connstring = "Server=10.87.12.251,1433;DataBase=ccut_soft;User ID=sa;PWD=123456"; 4 SqlConnection connection = new SqlConnection(connstring); 5 connection.Open(); 6 string sqlstring = "select * from soft_student"; 7 SqlCommand mycom = new SqlCommand(sqlstring, connection); 8 SqlDataAdapter adapter = new SqlDataAdapter(); 9 adapter.SelectCommand = mycom; 10 //设置DataSet对象 11 DataSet ds = new DataSet(); 12 adapter.Fill(ds); 13 //开始循环读取DataSet中的数据表信息 14 label1.Text = ""; 15 for (int i = 0; i < ds.Tables[0].Rows.Count; i++) 16 { 17 //label1.Text += ds.Tables[0].Rows[i]["sname"].ToString()+"\n"; 18 label1.Text +=ds.Tables[0].Rows[i][1].ToString() + "\n"; 19 } 20 //释放数据库连接资源 21 connection.Dispose(); 22 connection.Close(); 23 connection = null; 24 }
2-2 DataTable、DataColumn和DataRow对象
1.DataTable对象
属性
|
说明
|
Columns
|
表示列的集合或DataTable包含的DataColumn
|
Constraints
|
表示特定DataTable的约束集合
|
DataSet
|
表示DataTable所属的数据集
|
PrimaryKey
|
表示作为DataTable主键的字段或DataColumn
|
Rows
|
表示行的集合或DataTable包含的DataRow
|
HasChanges
|
返回一个布尔值,指示数据集是否更改了
|
方法
|
说明
|
AcceptChanges()
|
提交对该表所做的所有修改
|
NewRow()
|
添加新的DataRow
|
事件
|
说明
|
ColumnChanged
|
修改该列中的值时激发该事件
|
RowChanged
|
成功编辑行后激发该事件
|
RowDeleted
|
成功删除行时激发该事件
|
2.DataColumn对象
属性
|
说明
|
AllowDBNull
|
表示一个值,指示对于该表中的行,此列是否允许null值
|
ColumnName
|
表示指定DataColumn的名称
|
DataType
|
表示指定DataColumn对象中存储的数据类型
|
DefaultValue
|
表示新建行时该列的默认值
|
Table
|
表示DataColumn所属的DataTable的名称
|
Unique
|
表示DataColumn的值是否必须是唯一的
|
3.DataRow对象
属性
|
说明
|
Item
|
表示DataRow的指定列中存储的值
|
RowState
|
表示行的当前状态
|
Table
|
表示用于创建DataRow的DataTable的名称
|
方法
|
说明
|
AcceptChanges()
|
用于提交自上次调用了AcceptChanges()之后对该行所做的所有修改
|
Delete()
|
用于删除DataRow
|
RejectChanges()
|
用于拒绝自上次调用了AcceptChanges()之后对DataRow所做的所有修改
|
1 请看下面的使用示例代码: 2 3 //定义表结构,为Students表添加属性列 4 DataTable studt = new DataTable("student"); 5 6 DataColumn sno = new DataColumn(); 7 8 sno = studt.Columns.Add("sno", typeof(int)); 9 sno.AllowDBNull = false; 10 sno.Unique = true; 11 12 DataColumn sname = new DataColumn(); 13 sname = studt.Columns.Add("sname", typeof(string)); 14 sname.AllowDBNull = false; 15 sname.Unique = false; 16 17 DataColumn ssex = new DataColumn(); 18 ssex = studt.Columns.Add("ssex", typeof(string)); 19 ssex.AllowDBNull = false; 20 ssex.Unique = false; 21 ssex.DefaultValue = "男"; 22 23 DataColumn sbirthday = new DataColumn(); 24 sbirthday = studt.Columns.Add("sbirthday", typeof(string)); 25 sbirthday.DefaultValue = DateTime.Now.ToLongDateString(); 26 studt.Columns.Add("sclass", typeof(string)); 27 //添加数据 28 DataRow dr = studt.NewRow(); 29 dr["sno"] = 1001; 30 dr["sname"] = "张三"; 31 dr["ssex"] = "男"; 32 dr["sbirthday"] = "1980-2-1"; 33 dr["sclass"] = "98002"; 34 //把数据加入到 35 studt.Rows.Add(dr); 36 //读出添加行的数据 37 for (int i = 0; i < studt.Rows.Count; i++) 38 { 39 label1.Text = "编号:" + dr["sno"].ToString() + ";姓名:" + dr["sno"].ToString() + ";性别:" + dr["ssex"].ToString() + ";生日:" + dr["sbirthday"].ToString() + ";班级:" + dr["sclass"].ToString(); 40 } 41 /*从代码中可以看出,是在DataTable对象中新建DataRow对象的,利用的是DataTable对象的NewRow()方法。 */
4.如何定义Datatable的主键
5.DataTable的约束
其中ForeignKeyConstraint表示删除或更新某个值或行时,对主键/外键关系中一组列强制进行的操作限制。UniqueConstraint表示对一组列的限制,列中的所有值必须是唯一的。
6.DataView对象
属性
|
说明
|
Item
|
用于从指定的表中获取一行数据
|
RowFilter
|
用于获取或设置表达式,该表达式用于筛选可以在DataView中查看的行
|
RowStateFilter
|
用于获取DataView的行状态筛选器
|
Table
|
用于表示源DataTable
|
方法
|
说明
|
AddNew()
|
向DataView添加新行
|
Delete()
|
用于删除指定索引处的行
|
}
在上面的代码中,创建了DataView对象并对该视图应用某种筛选器。得到的DataView对象可能是objStudentTable表的一个子集,范围是"StudentMarks"字段值大于60的所有学生信息记录。
名称
|
说明
|
初始化DataView类的新实例。
|
|
用指定的DataTable初始化DataView类的新实例。
|
|
用指定的DataTable、RowFilter、Sort和DataViewRowState初始化DataView类的新实例。
|
1 private void MakeDataView() 2 { 3 DataView view = new DataView(); 4 view.Table = DataSet1.Tables["Suppliers"]; 5 view.AllowDelete = true; 6 view.AllowEdit = true; 7 view.AllowNew = true; 8 view.RowFilter = "City = 'Berlin'"; 9 view.RowStateFilter = DataViewRowState.ModifiedCurrent; 10 view.Sort = "CompanyName DESC"; 11 //简单绑定到一个TextBox控件上 12 Text1.DataBindings.Add("Text", view, "CompanyName"); 13 }
2-3 DataAdapter对象
从类比关系中可以看出,DataAdapter数据适配器就像大货车一样,可以将数据从数据库这个大仓库运输到DataSet数据集这个临时仓库。也可以把数据从数据库这个DataSet数据集这个临时仓库运输到大仓库。不过有一点要说明:生活中的仓库里面的货物被运走了,就没有了。但数据库里的数据被传输到客户端时,数据不会消失。这是信息世界与物质世界的不同。
1.DataAdapter对象概述
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类
|
SQL数据提供程序
|
SqlDataAdapter
|
OLE DB数据提供程序
|
OleDbDataAdapter
|
Oracle数据提供程序
|
OracleDataAdapter
|
ODBC数据提供程序
|
OdbcDataAdapter
|
2.DataAdapter对象使用
属性
|
说明
|
AcceptChangesDuringFill
|
决定在把行复制到DataTable中时对行所做的修改是否可以接受
|
TableMappings
|
容纳一个集合,该集合提供返回行和数据集之间的主映射
|
方法
|
说明
|
Fill()
|
用于添加或刷新数据集,以便使数据集与数据源匹配
|
FillSchema()
|
用于在数据集中添加DataTable,以便与数据源的结构匹配
|
Update()
|
将DataSet里面的数值存储到数据库服务器上
|
1 static private DataSet CreateCommandAndUpdate(string connectionString,string queryString) 2 { 3 DataSet dataSet = new DataSet(); 4 using (OleDbConnection connection = new OleDbConnection(connectionString)) 5 { 6 connection.Open(); 7 OleDbDataAdapter dataAdapter = new OleDbDataAdapter(); 8 dataAdapter.SelectCommand = new OleDbCommand(queryString, connection); 9 10 OleDbCommandBuilder commandBuilder = new OleDbCommandBuilder(dataAdapter); 11 12 /*首先利用dataAdapter.Fill()将数据从数据源填充到数据集dataSet;最后又利用dataAdapter.Update()将数据集dataSet中的数据回传至数据源。 */ 13 14 dataAdapter.Fill(dataSet); 15 //这里填写修改数据集dataSet的代码 16 //如果没有使用OleDbCommandBuilder,这行会报错 17 dataAdapter.Update(dataSet); 18 } 19 return dataSet; 20 }
(2) 如何填充
这里只是应用最简单的Update()一个表,通过SqlCommandBuilder对象来自动生成更新需要的相关命令,不用手动一个一个的写,简化操作。
SQLDataAdapter完成对数据库的删除修改和插入
本实验目标是要求编写一个应用程序,利用SQLDataAdapter对象实现可以添加、修改、删除学生基本信息的功能。