数据库应用程序开发基础篇—— .NET中SQL Server数据库的操作C#篇之一
写在前面:前面介绍了数据库系统的基本概念,SQl语句基本使用方法,接下来通过学习具体语言和具体数据库结合的应用开发来体会数据库原理及其应用。关于ADO.NET及基于此平台的开发内容太多,我们要做的是从最简单的开始,本文将会给出使用ADO.NET类库访问SQL Server2008的实例。
1.ADO.NET对象模型简介
ADO.NET 是一组向 .NET 程序员公开数据访问服务的类。
ADO.NET 为创建分布式数据共享应用程序提供了一组丰富的组件。
它提供了对关系数据、XML 和应用程序数据的访问,因此是 .NET Framework 中不可缺少的一部分。
ADO.NET 支持多种开发需求,包括创建由应用程序、工具、语言或 Internet 浏览器使用的前端数据库客户端和中间层业务对象。
ADO.NET访问数据库的示意图如下所示:
![](https://img-my.csdn.net/uploads/201303/14/1363254708_7211.png)
ADO.NET的类由两部分组成:.NET数据提供程序(Data Provider)和数据集(Dataset)。数据提供程序负责与数据源的物理连接,而数据集则表示实际的数据,这两部分都可以与数据的使用程序进行通信。
ADO.NET对象模型如下图所示:
![](https://img-my.csdn.net/uploads/201303/14/1363254920_4975.png)
由图可知ADO.NET对象模型中有5个主要的组件,分别是Connection对象、Command对象,DataAdapter对象,DataReader对象和DataSet对象。下面部分将会依次讲解并以实例说明其用法。
2.ADO.NET中4个核心组件
首先通过下面这张表有个整体认识:
对象 | 说明 | 特点 |
Connection | 建立于特定数据库的连接 | 可以自己创建,也可由其他对象自动产生(如DataAdapter) |
Command | 对数据源执行命令 | 透过Connection对象来下达命令,Connection的指向决定操作对象 |
DataAdapter | 用数据源中的查询结果填充DataSet对象 | DataAdapter填充到DataSet中的是断开连接的脱机数据 |
DataReader | 从数据源中读取只读的数据流 | DataReader读取数据必须在维持数据库连接的前提下进行 |
NET框架主要包括SQL Server.NET数据提供程序(用于Microsoft SQL Server)和OLE DB.NET数据提供程序。
第一套类库专门用于存取SQL Server数据库;第二套类库可以存取所有基于OLE DB提供的数据库,如SQL Server、Access、Oracle等。具体的类名如下表所示:
类 | SQL类 | OLE DB类 |
Connection | SqlConnection | OleDbConnection |
Command | SqlCommand | OleDbCommand |
DataAdapter | SqlDataAdapter | OleDbDataAdapter |
DataReader | SqlDataReader | OleDbDataReader |
关于两种类库的比较这一话题,作为入门暂时不做讨论,以后再做研究。
3.实例练习SQL Server.NET类库
1)SQL Server.NET类中库上述四个核心类的用法
上述四个核心类均位于System.Data.SqlClient命名空间下。
a.SqlConnection 类
此类表示
SQL Server 数据库的一个打开的连接,该类无法继承。SqlConnection 对象表示与 SQL Server 数据源的一个唯一的会话(对于所有第三方 SQL 服务器产品以及其他支持 OLE DB 的数据源,请使用OleDbConnection。)。对于客户端/服务器数据库系统,它等效于到服务器的网络连接。SqlConnection 与 SqlDataAdapter 和SqlCommand 一起使用,可以在连接 Microsoft SQL Server 数据库时提高性能。
SqlConnection重载有两个构造函数分别为:
SqlConnection ()
初始化 SqlConnection 类的新实例。
SqlConnection (String) 如果给定包含连接字符串的字符串,则初始化 SqlConnection 类的新实例。
SqlConnection (String) 如果给定包含连接字符串的字符串,则初始化 SqlConnection 类的新实例。
一般在处理完事务后就可以关闭该链接,关于什么时候适合关闭链接的话题超出基础篇部分,留待以后研究。
读者可参考:《
正确使用SqlConnection对象,兼谈数据库连接池》一文。
b.SqlCommand类
此类
表示要对 SQL Server 数据库执行的一个 Transact-SQL 语句或存储过程。
此类重载有四个构造函数:
SqlCommand ()初始化 SqlCommand 类的新实例。
SqlCommand (String) 用查询文本初始化 SqlCommand 类的新实例。
SqlCommand (String, SqlConnection) 初始化具有查询文本和 SqlConnection 的 SqlCommand 类的新实例。
SqlCommand (String, SqlConnection, SqlTransaction) 使用查询文本、一个 SqlConnection 以及 SqlTransaction 来初始化 SqlCommand 类的新实例。
SqlCommand (String) 用查询文本初始化 SqlCommand 类的新实例。
SqlCommand (String, SqlConnection) 初始化具有查询文本和 SqlConnection 的 SqlCommand 类的新实例。
SqlCommand (String, SqlConnection, SqlTransaction) 使用查询文本、一个 SqlConnection 以及 SqlTransaction 来初始化 SqlCommand 类的新实例。
c.SqlDataReader 类
此类提供一种从 SQL Server 数据库自上而下地读取数据源中的数据,而且这些数据是只读的,不允许进行其他操作。
注意:若要创建 SqlDataReader,必须调用 SqlCommand 对象的 ExecuteReader 方法,而不要直接使用构造函数。后文实例中将有所体现。
在使用 SqlDataReader 时,关联的 SqlConnection 正忙于为 SqlDataReader 服务,对 SqlConnection 无法执行任何其他操作,只能将其关闭。除非调用 SqlDataReader的 Close 方法,否则会一直处于此状态。例如,在调用 Close 之前,无法检索输出参数。因此一般在读取操作结束后就需要调用Close方法使SqlConnection可以执行其他操作。
d.SqlDataAdapter类
此类
表示用于填充 DataSet
和更新 SQL Server 数据库的一组数据命令和一个数据库连接。SqlDataAdapter是DataSet和SQL Server数据库之间的桥接器,用于检索和保存数据。
SqlDataAdapter通过对数据源使用适当的Transact-SQL 语句映射Fill(它可更改DataSet中的数据以匹配数据源中的数据)和Update(它可更改数据源中的数据以匹配DataSet中的数据)来提供这一桥接。
还要介绍一个类即
Dataset类。
该类可以看做是一个暂时存放在内存中的数据库,它包含一些DataTable(DataSet对象中的每一个表)和DataView等对象。
假若有ds对象,可以使用以下方式来访问一个表中的第I行J列的数据:
ds.Tables[0].Rows[i].ItemArray[j]。数据表、行、列的对象索引均从0开始计数。
2)实例练习——利用上述类访问SQL Server数据库DBTest中的tbl_Student表
a.创建数据库、建表、插入数据
建立数据库,在SQL Server 2008中执行语句:
Create database DBTest;
建表及插入数据如下图所示:
![](https://img-my.csdn.net/uploads/201303/14/1363269424_7748.png)
b.利用C#语言结合SQL Server .NET类库访问SQL Server 2008数据库
(
为了更好的学习几个类的使用使用控制台程序,暂未涉及windows窗体应用程序)
程序一:
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Data;
- using System.Data.SqlClient;
- namespace SQLServerEx1
- {
- class Program
- {
- static void Main(string[] args)
- {
- const string connStr = "server=WANGDINGQIAO-PC;database =DBTest;Integrated Security =true";//连接字符串
- SqlConnection mySqlConnection = new SqlConnection();
- mySqlConnection.ConnectionString = connStr;//新建连接对象并设置其连接字符串属性
- string sqlStr = "select Sno ,Sname from tbl_Student";//SQL语句
- try
- {
- mySqlConnection.Open();//打开连接
- SqlCommand mycmd = new SqlCommand(sqlStr, mySqlConnection);//新建SqlCommand对象
- SqlDataReader sdr = mycmd.ExecuteReader();//ExecuteReader方法将 CommandText 发送到 Connection 并生成一个 SqlDataReader
- Console.WriteLine("学号 \t\t\t姓名");
- while (sdr.Read())
- {
- Console.WriteLine("{0}\t\t{1}", sdr[0], sdr[1]);//循环读取数据
- }
- sdr.Close();//读取完毕即关闭
- }
- catch (SqlException ex)
- {
- Console.WriteLine(ex.Message);
- }
- catch (Exception ex)
- {
- Console.WriteLine(ex.Message);
- }
- finally
- {
- mySqlConnection.Close();//关闭连接
- }
- }
- }
- }
![](https://img-my.csdn.net/uploads/201303/15/1363316782_9428.png)
程序二:
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Data;
- using System.Data.SqlClient;
- namespace SQLServerEx2
- {
- class Program
- {
- static void Main(string[] args)
- {
- const string connStr = "server=WANGDINGQIAO-PC;database =DBTest;Integrated Security =true";
- SqlConnection mySqlConnection = new SqlConnection(connStr);//新建连接对象
- string sqlStr = "select * from tbl_Student";//SQL语句
- try
- {
- mySqlConnection.Open();//打开连接
- SqlDataAdapter sda = new SqlDataAdapter(sqlStr, mySqlConnection);//新建SqlDataAdapter对象
- DataSet ds = new DataSet();//新建Dataset对象
- sda.Fill(ds);//填充DataSet对象
- Console.WriteLine("姓名\t\t性别");
- int cnt = ds.Tables[0].Rows.Count;//读取行数
- for (int ix = 0; ix != cnt; ++ix)
- Console.WriteLine("{0}\t\t{1}", ds.Tables[0].Rows[ix].ItemArray[1],
- ds.Tables[0].Rows[ix].ItemArray[2]);//循环读取数据 注意索引范围
- }
- catch (SqlException ex)
- {
- Console.WriteLine(ex.Message);
- }
- catch (Exception ex)
- {
- Console.WriteLine(ex.Message);
- }
- finally
- {
- mySqlConnection.Close();//关闭连接
- }
- }
- }
- }
运行结果:
![](https://img-my.csdn.net/uploads/201303/15/1363316911_8376.png)
4.利用C#语言结合OLE DB .NET类库访问SQL Server 2008数据库
仍然采用上面建立的DBTest数据库。关于连接字符串的获取,可以参考《
数据库开发基础篇——常见问题解决方法》一文。
程序代码:
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Data.OleDb;
- using System.Data;
- namespace SQLServerEx3
- {
- class Program
- {
- static void Main(string[] args)
- {
- const string connStr = "Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;"
- +"Initial Catalog=DBTest;Data Source=WANGDINGQIAO-PC";
- OleDbConnection myOleDbConnection = new OleDbConnection(connStr);//新建连接对象
- string sqlStr = "select * from tbl_Student";//SQL语句
- try
- {
- myOleDbConnection.Open();//打开连接
- OleDbCommand mycmd = new OleDbCommand(sqlStr, myOleDbConnection);//新建OleDbCommand对象
- OleDbDataReader Olesdr = mycmd.ExecuteReader();//将 CommandText 发送到 Connection 并生成一个 OleDbDataReader
- Console.WriteLine("姓名 \t\t所在系");
- while (Olesdr.Read())
- {
- Console.WriteLine("{0}\t\t{1}", Olesdr[1], Olesdr[4]);//循环读取数据 注意索引值
- }
- Olesdr.Close();//读取完毕即关闭
- }
- catch (OleDbException ex)
- {
- Console.WriteLine(ex.Message);
- }
- catch (Exception ex)
- {
- Console.WriteLine(ex.Message);
- }
- finally
- {
- myOleDbConnection.Close();//关闭连接
- }
- }
- }
- }
运行结果:
![](https://img-my.csdn.net/uploads/201303/15/1363317226_3151.png)
5.利用C#语言结合第三方与.NET类库连接器 访问MySQL数据库
访问MySQL数据的方法有多种,详情可参见
开心笑的博客:《
C#连接数据库》
这里使用 MySQL Connector/NET组件,下载地址:
http://dev.mysql.com/downloads/connector/net/。
a.建立数据库、建表、插入数据
启动MySQL服务,执行如下图命令,即可完成类似SQL Server中相同任务:
![](https://img-my.csdn.net/uploads/201303/14/1363273631_6094.png)
完成后,查看表结构如下图所示:
![](https://img-my.csdn.net/uploads/201303/14/1363273659_2893.png)
b.利用OLE DB.NET类库访问MySQL数据库
下载安装MySQL Connector/NET组件后,导入安装目录下\Binaries\.NET2.0中的MySql.Data.dll,将该文件复制到项目的bin目录下。并且在项目中添加引用MySql.Data.dll,如下图所示:
![](https://img-my.csdn.net/uploads/201303/15/1363325209_3009.png)
引用成功后,可以浏览MySql.Data.dll中的类库,如下图所示:
![](https://img-my.csdn.net/uploads/201303/15/1363325310_4876.png)
实例程序代码:
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using MySql.Data.MySqlClient;
- using System.Data;
- namespace MySQLEx
- {
- class Program
- {
- static void Main(string[] args)
- {
- string conString = "server=localhost; Database=DBTest;user id=root; password=root;";
- MySqlConnection mySqlConn = new MySqlConnection(conString);
- string sqlStr = "select * from tbl_Student";//SQL语句
- try
- {
- mySqlConn.Open(); ;//打开连接
- MySqlDataAdapter msda = new MySqlDataAdapter(sqlStr, mySqlConn);//新建MySqlDataAdapter对象
- DataSet ds = new DataSet();//新建Dataset对象
- msda.Fill(ds);//填充DataSet对象
- Console.WriteLine("姓名\t\t年龄");
- int cnt = ds.Tables[0].Rows.Count;//读取行数
- for (int ix = 0; ix != cnt; ++ix)
- Console.WriteLine("{0}\t\t{1}", turnString(ds.Tables[0].Rows[ix].ItemArray[1].ToString()),
- turnString(ds.Tables[0].Rows[ix].ItemArray[3].ToString()));//循环读取数据 注意索引范围
- }
- catch (MySqlException ex)
- {
- Console.WriteLine(ex.Message);
- }
- catch (Exception ex)
- {
- Console.WriteLine(ex.Message);
- }
- finally
- {
- mySqlConn.Close();//关闭连接
- }
- }
- //乱码解决 转换函数
- public static string turnString(string source)
- {
- var en = System.Text.Encoding.GetEncoding("latin1");
- var bs = en.GetBytes(source);
- var a = System.Text.Encoding.Default.GetString(bs);
- return a;
- }
- }
- }
![](https://img-my.csdn.net/uploads/201303/15/1363325367_3793.png)
结束语:以上通过简单但是丰富的例子,练习了.NET框架下访问数据库的方法,作为练习使用控制台应用程序有助于理解几个类的使用方法。关于复杂的SQL语句、windows开发、数据库开发的高级话题在这里暂不做讨论,留待入门后进阶时继续学习。
6.参考资料
(1)《Visual C# 2008数据库编程实训教程》 清华大学出版社 李志中等编著
(2)System.Data.SqlClient 命名空间 http://msdn.microsoft.com/zh-cn/library/8t72t3k4(v=vs.80).aspx
(3)C#连接数据库 http://blog.csdn.net/candy1232009/article/details/7654927
(4)c#连接mysql中文乱码解决方案 http://ljl-xyf.iteye.com/blog/1340294
(5)c#连mysql的latin1编码乱码问题 http://www.51laifu.cn/archives/2012/316/article-3797.html
(6)System.Data.OleDb 命名空间 http://msdn.microsoft.com/zh-cn/library/6d9ew87b(v=vs.80).aspx