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对象。
3.对于Insert,Update,Delete等单向操作
首先,建立针对具体数据库的Connection对象,利用Connection对象的Open()方法打开数据库;然后,包含查询命令信息的Command对象和DataAdapter内伴生的SelectCommand对象都可以执行命令信息对应的命令,查询得到的数据可以通过DataReader对象获取或者被DataAdapter对象用Fill()方法填充在DataSet对象中;最后,利用Connection对象的Close()方法关闭数据库。
对象
|
说明
|
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提供程序
|
驱动程序
|
SQL Server
|
Microsoft ODBC for Oracle
|
Microsoft Access 驱动程序 (*.mdb)
|
各个对象属性介绍
1.Connection 对象
要开发数据库应用程序,首先需要建立与数据库的连接。在ADO.NET中,数据库连接是通过Connection对象管理的。此外,事务管理也通过Connection对象进行。
提供程序
|
Connection类
|
SQL数据提供程序
|
SqlConnection
|
OLE DB数据提供程序
|
OleDbConnection
|
Oracle数据提供程序
|
OracleConnection
|
ODBC数据提供程序
|
OdbcConnection
|
x
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开发。
方式一
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对象最常用的方法有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对象组件在默认情况下工具箱中是没有的,需要手动添加。
名称
|
说明
|
初始化SqlCommand类的新实例。
|
|
用查询文本初始化SqlCommand类的新实例。
|
|
初始化具有查询文本和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
例如在一个销售系统里,通过帐单处理模块完成对销售表的数据处理,客户端销售人员已经将库存货品销售出去,但与销售表相关的库存表尚未及时更新,结果娶她销售人员再读取库存数据就会出现数据不一致的现象。
所谓事务就是这样的一系列操作,这些操作被视为一个操作序列,要么全做,要么全部做,是一个不可分割的程序单元。在数据库数据处理中经常会发生数据更新事件,为了保证数据操作的安全与一致,大型数据库服务器都支持事务处理,以保证数据更新在可控的范围内进行。ADO.NET通过Connection对象的BeginTransaction()方法实现对事务处理的支持,该方法返回一个实现IDbTransaction接口的对象,而该对象是在System.Data中被定义的。
类
|
说明
|
OdbcTransaction
|
表示对Odbc数据源进行的SQL 事务处理。
|
OleDbTransaction
|
表示对OleDb数据源进行的SQL事务处理。
|
OracleTransaction
|
表示对Oracle数据库进行的事务处理。
|
SqlTransaction
|
表示要对SQL Server数据库进行的Transact-SQL事务处理。
|
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()方法回滚事务。 */
原文:https://www.cnblogs.com/zhenqk/p/11107728.html