ADO.NET 的主要组件
ADO.NET 结构图
.NET 数据提供程序类型
.NET Framework 数据提供程序 | 说 明 |
SQL Server .NET 数据提供程序 | Microsoft SQL Server 数据源 System.Data.SqlClient 命名空间 |
OLE DB .NET 数据提供程序 | Access 、OLE DB 公开的数据源 System.Data.OleDb 命名空间 |
ODBC .NET 数据提供程序 | ODBC 公开的数据源 System.Data.Odbc 命名空间 |
Oracle .NET 数据提供程序 | Oracle 数据源 System.Data.OracleClient 命名空间 |
Connection 对象
命名空间 | 对应的 Connection 对象 |
System.Data.SqlClient | SqlConnection |
System.Data.OleDb | OleDbConnection |
System.Data.Odbc | OdbcConnection |
System.Data.OracleClient | OracleConnection |
1 // 定义数据库连接字符串 2 string connString = 3 "Data Source= . ;Initial Catalog=MySchool;User ID=jbit;pwd=bdqn"; 4 5 // 创建 Connection 对象 6 SqlConnection connection = new SqlConnection(connString); 7 8 // 打开数据库连接 9 connection.Open(); 10 Console.WriteLine("打开数据库连接成功"); 11 12 //关闭数据库连接 13 connection.Close(); 14 Console.WriteLine("关闭数据库连接成功");
Connection 主要成员
属性名称 | 说 明 |
ConnectionString | 连接字符串 |
方法 | 说 明 |
Open() | 打开数据库连接 |
Close() | 关闭数据库连接 |
必须显式关闭连接
另一种实现:自动关闭数据
using (SqlConnection conn = new SqlConnection(ConnStr)) { //代码块 }
tip:当执行完该using(){}后,数据库连接就会自动关闭
连接数据库步骤
使用ADO.NET连接数据库的步骤
1.定义连接字符串
Data Source=服务器名;Initial Catalog=数据库名; User ID=用户名;Pwd=密码
2. 创建 Connection 对象
SqlConnection connection = new SqlConnection(connString);
3. 打开与数据库的连接
connection.Open( );
示例代码:
// 连接字符串 string connString = "Data Source=.;Initial Catalog=pubs;User ID=sa"; // 创建Connection 对象 SqlConnection connection = new SqlConnection(connString); connection.Open( ); // 打开数据库连接 //…… connection.Close( ); // 关闭数据库连接
Command
Command 的主要成员
属性名称 | 说明 |
Connection | Command对象使用的数据库连接 |
CommandText | 执行的SQL语句 |
方法 | 说 明 |
ExecuteNonQuery() | 执行不返回行的语句,如UPDATE等 |
ExecuteReader() | 返回DataReader对象 |
ExecuteScalar() | 返回单个值,如执行带COUNT(*)的SQL语句 |
使用 Command 步骤
1. 创建数据库连接
2. 定义 SQL 语句
3. 创建 Command 对象(执行命令前,必须打开数据库连接!)
4. 执行命令
1 SqlConnection connection = new SqlConnection(connString); 2 string sql = "select count(*) from Admin where LoginId=' " + userName 3 + " ' and LoginPwd=' " + pwd + " ' "; 4 connection.Open(); // 打开数据库连接 5 SqlCommand command = new SqlCommand(sql, connection); 6 int num = (int)command.ExecuteScalar();
总结
一、.NET数据提供程序包括四个核心对象
Connection
Command
DataAdapter
DataReader
二、Connection对象用于建立应用程序和数据库之间的连接
三、Command对象的ExecuteScalar()方法可以检索数据库并返回一个值
四、数据库操作过程中可能出现异常,可以使用try-catch-finally语句处理异常
DataAdapter和DataReader的区别
SqlDataReader 高效,功能弱,只读访问
SqlDataAdapter 强大,要求资源也大一点
SqlDataReader 只能在保持跟数据库连接的状态下才可以读取。。。
SqlDataAdapter 大多情况下是一次性读取一个表,然后填充到DataSet中,然后就可以断开跟数据库的连接了。(可以理解查询出来的数据都放到的内存中)
两者区别主要是 在线 和 离线 的区别。。。。。
使用ADO.NET查询和操作数据
StringBuilder类
StringBuilder类: 用来定义可变字符串
方法 | 说明 |
StringBuilder Append(string value ) | 在结尾追加 |
StringBuilder Insert(int index, string value ) | 在指定位置插入指定字符串 |
StringBuilder Remove(int startIndex, int length ) | 移除指定字符串 |
以下SQL语句哪个可读性更高,更易修改?
代码一
SELECT SubjectNo,SubjectName,ClassHour,Grade FROM Subject
代码二
SELECT
[ SubjectNo ],
[ SubjectName ],
[ ClassHour ],
[ Grade ]
FROM
[ Subject ]
答案肯定是第二种
优势举例
常规
string strText = "Hello"; strText += "World"; Console.WriteLine( strText );
优化后
使用StringBuilder类修改上述代码
StringBuilder sbTest = new StringBuilder(); sbTest.Append("Hello"); sbTest.Append("World"); Console.WriteLine(sbTest .ToString ()); Console.ReadLine();
使用StringBuilder后,感觉代码更多了,我们为什么还要用它呢?
其实,我们在“常规”声明的string变量在2次赋值时,程序是给变量划分了2个内存空间,对计算机性能有损耗!
精准的说:“常规”每次修改strText,不是追加而是都要创建一个 新的字符串对象,如果用StringBuilder sbTest = new StringBuilder();创建对象做为变量,他不会有内存损耗,同样系统也不会多次创建对象。
DataReader读取数据库
DataReader 对象
1.从数据源中检索只读、只进的数据流
2.每次读取一行数据
命名空间 | 对应的 DataReader 对象 |
System.Data.SqlClient | System.Data.OracleClient |
System.Data.OleDb | OleDbDataReader |
System.Data.Odbc | OdbcDataReader |
System.Data.OracleClient | OracleDataReader |
要查询多行多列的数据,需要使用Command对象的ExecuteReader( )方法
1 SqlDataReader reader = comm.ExecuteReader();//获得DataReader对象 2 //… 3 //循环读取数据行并显示 4 while (reader.Read()) 5 { 6 sb1.AppendFormat("{0}\t{1}", reader["StudentNo"], 7 reader["StudentName"]); 8 Console.WriteLine(sb1); 9 sb1.Length = 0; 10 } 11 //… 12 reader.Close(); //关闭DataReader
DataReader 的主要成员
属性 | 说明 |
HasRows | 是否返回了结果 |
方法 | 说明 |
Read | 前进到下一行记录 |
Close | 关闭 DataReader 对象 |
DataReader 使用后必须关闭
DataReader 使用步骤
使用 DataReader 检索数据的步骤
1. 创建 Command 对象
2. 调用 ExecuteReader() 创建 DataReader 对象
3. 使用 DataReader 的 Read() 方法逐行读取数据
4. 读取某列的数据,(type)dataReader[ ]
5. 关闭 DataReader 对象
读取某列的数据,(type)dataReader[ ]
获取某列的值:
方法一:指定列的索引,从0开始
方法二:指定列名
操作数据
使用SqlCommand对象的ExecuteNonQuery() 方法向数据库增加记录
1 StringBuilder sb = new StringBuilder(); 2 sb.AppendLine("INSERT INTO"); 3 sb.AppendLine(" [Grade]"); 4 sb.AppendLine("VALUES"); 5 sb.AppendLine(" ('" + gradeName + "')"); 6 7 // 创建command对象 8 SqlCommand command = new SqlCommand(sb.ToString(), conn); 9 // 执行命令 10 command.ExecuteNonQuery(); 11 //……
ExecuteNonQuery()方法小结
1.该方法执行指定的 SQL 语句
2.返回受影响的行数
使用 ExecuteNonQuery() 的步骤
1.创建 Connection 对象
2.定义SQL语句
3.创建 Command 对象
4.执行 ExecuteNonQuery() 方法
5.根据返回的结果进行处理
总结
一、DataReader对象是一个只进、只读的数据流,每次从数据源中提取一条记录
二、通过Command对象的ExecuteReader()方法返回一个DataReader对象
三、使用Command对象的ExecuteNonQuery()方法可以执行数据源数据的增删改操作