c# 窗体开发4 数据库访问技术
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.断开式数据库访问连接
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的关联
using System.Data.OracleClient;
各个对象属性介绍
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()方法用来关闭与数据库的连接。这是关闭任何打开连接的首选方法。
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 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.
//参数 执行的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对象组件在默认情况下工具箱中是没有的,需要手动添加。
学习2:通过编写代码来设置Command对象实验
名称
|
说明
|
初始化SqlCommand类的新实例。
|
|
用查询文本初始化SqlCommand类的新实例。
|
|
SqlCommand(String, SqlConnection)
|
初始化具有查询文本和SqlConnection的SqlCommand类的新实例。
|
使用查询文本、一个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.事务处理命令
类
|
说明
|
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对象
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;
}
编程
employeeName = dsEmployees.Emp[0].EmpName;
employeeName = dsEmployees.Tables["Emp"].Rows[0]["EmpName"];
案例学习:数据集的类型——通过图形化界面生成类型化数据集
数据集的类型——通过图形化界面生成非类型化数据集
其中Cascade表示级联操作,当父表键列发生更新、删除以及接受/拒绝操作时,子表的外键列也发生相应的操作。None表示无操作,当父表键列发生更新、删除以及接受/拒绝操作时,子表的外键列不采取任何操作。SetNull表示置空操作,当父表键列发生更新、删除操作时,子表的外键列相关行中的值置空。SetDefault表示置默认值操作,当父表键列发生更新、删除操作时,子表的外键列相关行中的值置DefaultValue属性中默认的值。
1. 案例学习:数据集的类型——编码实现非类型化数据集
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对象
属性
|
说明
|
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的值是否必须是唯一的
|
objStudentTable.Columns.Add("StudentMarks", typeof(Double));
3.DataRow对象
属性
|
说明
|
Item
|
表示DataRow的指定列中存储的值
|
RowState
|
表示行的当前状态
|
Table
|
表示用于创建DataRow的DataTable的名称
|
方法
|
说明
|
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的主键
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类的新实例。
|
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
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里面的数值存储到数据库服务器上
|
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) 如何填充
这里只是应用最简单的Update()一个表,通过SqlCommandBuilder对象来自动生成更新需要的相关命令,不用手动一个一个的写,简化操作。
SQLDataAdapter完成对数据库的删除修改和插入
本实验目标是要求编写一个应用程序,利用SQLDataAdapter对象实现可以添加、修改、删除学生基本信息的功能。
c# 窗体开发4 数据库访问技术的更多相关文章
- C#与数据库访问技术总结(十八)
ADO.NET 代码综合示例 前面已经介绍过OLE DB.NET和SQL Server.NET数据提供者可以用来连接不同的数据源. 以下代码不仅综合演示了使用ADO.NET的这两种数据提供者访问数据库 ...
- C#-数据库访问技术 ado.net——创建 数据库连接类 与 数据库操作方法 以及简单的数据的添加、删除、修改、查看
数据库访问技术 ado.net 将数据库中的数据,提取到内存中,展示给用户看还可以将内存中的数据写入数据库中去 并不是唯一的数据库访问技术,但是它是最底层的数据库访问技术 1.创建数据库,并设置主外键 ...
- 数据库访问技术 odbc dao rdo uda jet oledb
一.UDA(UniversalDataAccess) 这是微软提供的通用数据访问策略.包括ADO.OLEDB和ODBC.它不光提供了数据库的访 问能力,对于其它的数据存储技术也同样支持,如目录服务.E ...
- C#与数据库访问技术总结(七)综合示例
综合示例 说明:前面介绍了那么多,光说不练假把式,还是做个实例吧. 表:首先你要准备一张表,这个自己准备吧.我们以学生表为例. 1.ExecuteScalar方法 ExecuteScalar方法执行返 ...
- c# 窗体开发3 文件处理技术
以字节形式向磁盘写入数据通常称为字节流(比特流) 常常使用System.Io 常用的类 类 说明 File 提供用于创建.复制.删除.移动和打开文件的静态方法,并协助创建 FileStream 对象. ...
- C#与数据库访问技术总结(十七)
使用DataSet对象访问数据库 当对DataSet对象进行操作时,DataSet对象会产生副本,所以对DataSet里的数据进行编辑操作不会直接对数据库产生影响,而是将DataRow的状态设置为ad ...
- C#与数据库访问技术总结(十六)之 DataSet对象
DataSet对象 DataSet对象可以用来存储从数据库查询到的数据结果,由于它在获得数据或更新数据后立即与数据库断开,所以程序员能用此高效地访问和操作数据库. 并且,由于DataSet对象具有离线 ...
- C#与数据库访问技术总结(十五)之 DataAdapter对象代码示例
DataAdapter对象代码示例 下面的代码将说明如何利用DataAdapter对象填充DataSet对象. private static string strConnect=" data ...
- C#与数据库访问技术总结(十四)之DataAdapter对象
DataAdapter对象 DataAdapter对象主要用来承接Connection和DataSet对象. DataSet对象只关心访问操作数据,而不关心自身包含的数据信息来自哪个Connectio ...
随机推荐
- [07/18NOIP模拟测试5]超级树
鬼能想到的dp定义:dp[i][j]表示在一棵i级超级树中,有j条路径同时存在且这j条路径没有公共点时,可能的情况数 刚开始我也没看懂,所以举个例子 如一个2级的超级树,父节点为1,左右儿子为2,3 ...
- 求矩阵最少(或最多)路径和(python实现)
1.递归方式 求最短,最终状态即右下角 f(v, i, j) = min(f(v, i - 1, j), f(v, i, j - 1)) + v[i][j] 最长只需将min改为max即可 impor ...
- day 2 上午 消失之物 背包
#include<iostream> using namespace std; long long n,m; ]; ]; ]; int main() { cin>>n>& ...
- 大数据之路week01--自学之集合_2(列表迭代器 ListIterator)
列表迭代器: ListIterator listerator():List集合特有的迭代器 该迭代器继承了Iterator迭代器,所以,就可以直接使用hasNext()和next()方法 特有功能: ...
- Cpython和Jython的对比介绍
CPython 当我们从Python官方网站下载并安装好Python 3.x后,我们就直接获得了一个官方版本的解释器:CPython.这个解释器是用C语言开发的,所以叫CPython.在命令行下运行p ...
- 从代码的视角深入浅出理解DevOps
对于DevOps的理解大家众说纷纭,就连维基百科(Wikipedia)都没有给出一个统一的定义.一般的解释都是从字面上来理解,就是把开发(Development)和运维(Operations)整合到一 ...
- spring 是如何注入对象的和bean 创建过程分析
文章目录: beanFactory 及 bean 生命周期起步 BeanFactory refresh 全过程 BeanFactoryPostProcessor 和 BeanPostProcessor ...
- 解决 scp 和rsync 同步失败【rsync error: unexplained error (code 255) at io.c(226) [sender=3.1.2]】
解决 scp 和rsync 同步失败 报错信息截图: 解决问题的步骤: 1.检查对方的scp和rsync 是否能使用. rsync 在使用的时候,需要客户端和服务端都有rsync工具.scp 和 rs ...
- [LC]530题 二叉搜索树的最小绝对差
①题目 给定一个所有节点为非负值的二叉搜索树,求树中任意两节点的差的绝对值的最小值. 示例 : 输入: 1 \ 3 / 2 输出:1 解释:最小绝对差为1,其中 2 和 1 的差的绝对值为 ...
- [剑指offer]第1题,二维数组中的查找
①题目 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. ...