数据库应用程序开发基础篇—— .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访问数据库的示意图如下所示:
ADO.NET的类由两部分组成:.NET数据提供程序(Data Provider)和数据集(Dataset)。数据提供程序负责与数据源的物理连接,而数据集则表示实际的数据,这两部分都可以与数据的使用程序进行通信
ADO.NET对象模型如下图所示:
由图可知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对象,兼谈数据库连接池》一文。
b.SqlCommand类
此类表示要对 SQL Server 数据库执行的一个 Transact-SQL 语句或存储过程。
此类重载有四个构造函数:
SqlCommand ()初始化 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;
建表及插入数据如下图所示:

b.利用C#语言结合SQL Server .NET类库访问SQL Server 2008数据库

(为了更好的学习几个类的使用使用控制台程序,暂未涉及windows窗体应用程序)
程序一:
[csharp] view plaincopy print?
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Data;
  6. using System.Data.SqlClient;
  7. namespace SQLServerEx1
  8. {
  9. class Program
  10. {
  11. static void Main(string[] args)
  12. {
  13. const string connStr = "server=WANGDINGQIAO-PC;database =DBTest;Integrated Security =true";//连接字符串
  14. SqlConnection mySqlConnection = new SqlConnection();
  15. mySqlConnection.ConnectionString = connStr;//新建连接对象并设置其连接字符串属性
  16. string sqlStr = "select Sno ,Sname from tbl_Student";//SQL语句
  17. try
  18. {
  19. mySqlConnection.Open();//打开连接
  20. SqlCommand mycmd = new SqlCommand(sqlStr, mySqlConnection);//新建SqlCommand对象
  21. SqlDataReader sdr = mycmd.ExecuteReader();//ExecuteReader方法将 CommandText 发送到 Connection 并生成一个 SqlDataReader
  22. Console.WriteLine("学号 \t\t\t姓名");
  23. while (sdr.Read())
  24. {
  25. Console.WriteLine("{0}\t\t{1}", sdr[0], sdr[1]);//循环读取数据
  26. }
  27. sdr.Close();//读取完毕即关闭
  28. }
  29. catch (SqlException ex)
  30. {
  31. Console.WriteLine(ex.Message);
  32. }
  33. catch (Exception ex)
  34. {
  35. Console.WriteLine(ex.Message);
  36. }
  37. finally
  38. {
  39. mySqlConnection.Close();//关闭连接
  40. }
  41. }
  42. }
  43. }

运行结果:


程序二:
[csharp] view plaincopy print?
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Data;
  6. using System.Data.SqlClient;
  7. namespace SQLServerEx2
  8. {
  9. class Program
  10. {
  11. static void Main(string[] args)
  12. {
  13. const string connStr = "server=WANGDINGQIAO-PC;database =DBTest;Integrated Security =true";
  14. SqlConnection mySqlConnection = new SqlConnection(connStr);//新建连接对象
  15. string sqlStr = "select * from tbl_Student";//SQL语句
  16. try
  17. {
  18. mySqlConnection.Open();//打开连接
  19. SqlDataAdapter sda = new SqlDataAdapter(sqlStr, mySqlConnection);//新建SqlDataAdapter对象
  20. DataSet ds = new DataSet();//新建Dataset对象
  21. sda.Fill(ds);//填充DataSet对象
  22. Console.WriteLine("姓名\t\t性别");
  23. int cnt = ds.Tables[0].Rows.Count;//读取行数
  24. for (int ix = 0; ix != cnt; ++ix)
  25. Console.WriteLine("{0}\t\t{1}", ds.Tables[0].Rows[ix].ItemArray[1],
  26. ds.Tables[0].Rows[ix].ItemArray[2]);//循环读取数据 注意索引范围
  27. }
  28. catch (SqlException ex)
  29. {
  30. Console.WriteLine(ex.Message);
  31. }
  32. catch (Exception ex)
  33. {
  34. Console.WriteLine(ex.Message);
  35. }
  36. finally
  37. {
  38. mySqlConnection.Close();//关闭连接
  39. }
  40. }
  41. }
  42. }
运行结果:

4.利用C#语言结合OLE DB .NET类库访问SQL Server 2008数据库

仍然采用上面建立的DBTest数据库。关于连接字符串的获取,可以参考《数据库开发基础篇——常见问题解决方法》一文。
程序代码:
[csharp] view plaincopy print?
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Data.OleDb;
  6. using System.Data;
  7. namespace SQLServerEx3
  8. {
  9. class Program
  10. {
  11. static void Main(string[] args)
  12. {
  13. const string connStr = "Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;"
  14. +"Initial Catalog=DBTest;Data Source=WANGDINGQIAO-PC";
  15. OleDbConnection myOleDbConnection = new OleDbConnection(connStr);//新建连接对象
  16. string sqlStr = "select * from tbl_Student";//SQL语句
  17. try
  18. {
  19. myOleDbConnection.Open();//打开连接
  20. OleDbCommand mycmd = new OleDbCommand(sqlStr, myOleDbConnection);//新建OleDbCommand对象
  21. OleDbDataReader Olesdr = mycmd.ExecuteReader();//将 CommandText 发送到 Connection 并生成一个 OleDbDataReader
  22. Console.WriteLine("姓名 \t\t所在系");
  23. while (Olesdr.Read())
  24. {
  25. Console.WriteLine("{0}\t\t{1}", Olesdr[1], Olesdr[4]);//循环读取数据 注意索引值
  26. }
  27. Olesdr.Close();//读取完毕即关闭
  28. }
  29. catch (OleDbException ex)
  30. {
  31. Console.WriteLine(ex.Message);
  32. }
  33. catch (Exception ex)
  34. {
  35. Console.WriteLine(ex.Message);
  36. }
  37. finally
  38. {
  39. myOleDbConnection.Close();//关闭连接
  40. }
  41. }
  42. }
  43. }
运行结果:

5.利用C#语言结合第三方与.NET类库连接器 访问MySQL数据库

访问MySQL数据的方法有多种,详情可参见开心笑的博客:《C#连接数据库》
这里使用 MySQL Connector/NET组件,下载地址:http://dev.mysql.com/downloads/connector/net/。

a.建立数据库、建表、插入数据
启动MySQL服务,执行如下图命令,即可完成类似SQL Server中相同任务:

完成后,查看表结构如下图所示:

b.利用OLE DB.NET类库访问MySQL数据库

下载安装MySQL Connector/NET组件后,导入安装目录下\Binaries\.NET2.0中的MySql.Data.dll,将该文件复制到项目的bin目录下。并且在项目中添加引用MySql.Data.dll,如下图所示:
引用成功后,可以浏览MySql.Data.dll中的类库,如下图所示:
实例程序代码:
[csharp] view plaincopy print?
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using MySql.Data.MySqlClient;
  6. using System.Data;
  7. namespace MySQLEx
  8. {
  9. class Program
  10. {
  11. static void Main(string[] args)
  12. {
  13. string conString = "server=localhost; Database=DBTest;user id=root; password=root;";
  14. MySqlConnection mySqlConn = new MySqlConnection(conString);
  15. string sqlStr = "select * from tbl_Student";//SQL语句
  16. try
  17. {
  18. mySqlConn.Open(); ;//打开连接
  19. MySqlDataAdapter msda = new MySqlDataAdapter(sqlStr, mySqlConn);//新建MySqlDataAdapter对象
  20. DataSet ds = new DataSet();//新建Dataset对象
  21. msda.Fill(ds);//填充DataSet对象
  22. Console.WriteLine("姓名\t\t年龄");
  23. int cnt = ds.Tables[0].Rows.Count;//读取行数
  24. for (int ix = 0; ix != cnt; ++ix)
  25. Console.WriteLine("{0}\t\t{1}", turnString(ds.Tables[0].Rows[ix].ItemArray[1].ToString()),
  26. turnString(ds.Tables[0].Rows[ix].ItemArray[3].ToString()));//循环读取数据 注意索引范围
  27. }
  28. catch (MySqlException ex)
  29. {
  30. Console.WriteLine(ex.Message);
  31. }
  32. catch (Exception ex)
  33. {
  34. Console.WriteLine(ex.Message);
  35. }
  36. finally
  37. {
  38. mySqlConn.Close();//关闭连接
  39. }
  40. }
  41. //乱码解决  转换函数
  42. public static string turnString(string source)
  43. {
  44. var en = System.Text.Encoding.GetEncoding("latin1");
  45. var bs = en.GetBytes(source);
  46. var a = System.Text.Encoding.Default.GetString(bs);
  47. return a;
  48. }
  49. }
  50. }

运行结果:

结束语:以上通过简单但是丰富的例子,练习了.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

转载于:https://www.cnblogs.com/songlinux/p/5837565.html

ADO.NET SQL相关推荐

  1. 【C#:WinForm+ADO.NET+SQL Server实现验证码登录】

    WinForm+ADO.NET+SQL Server实现验证码登录 1.最终效果 当用户输入的账户名.密码以及验证码都正确时,才可以登录系统.否则,提示相应的报错信息.下图为登录成功的效果. 2.解题 ...

  2. delphi使用ADO在sql数据库存取图片的方法

    delphi使用ADO在sql数据库存取图片的方法 新手参考,老鸟绕行 我一直不认为能把代码写的和天书一样的程序员是好的程序员,那不过是因为我真的对delphi也就是略懂皮毛,太深了看不懂. 网上查询 ...

  3. VC++使用ADO连接SQL Server数据库

    基本步骤: 1.创建一个基于对话框的应用程序ADODatabase. 2.创建一个用来连接的ADO类库.系统菜单中Insert->New Class项,class type选择Generic C ...

  4. 【转】MFC下用ADO连接SQL SERVER,保存图片,BLOB

    使用ADO实现BLOB数据的存取 一.前言 在实际的开发过程中我们常常需要存储较大的二进制数据对象,比如:图像.音频文件. 或其它二进制数据,这些数据我们称之为二进制大对象BLOB(Binary La ...

  5. vc通过ADO连接sql server 2000的核心代码

    建立一个mfc对话框工程,一切都默认然后完成,接下照我的方法做吧,一定可以的! 注: ***** 代表你所建立的工程名称 先在stdafx.h中导入#import  " c:\program ...

  6. MFC开发之使用ADO连接SQL Server

    "观千剑而后视器,操千曲而后晓声."--<文心雕龙> 最近在学C++一个框架--MFC,犯难了,搞了一周,阅读了不下百篇博主的文章,还询问了老师,重装了VS(甚至201 ...

  7. LabVIEW通过ADO连接SQL Server 方法二

    数据库连接方法2 一.数据源配置 1. 打开ODBC数据源管理器,点击"添加" 2. 选择SQL Server,点击"完成" 3. 输入名称,并选择服务器,点击 ...

  8. MFC使用ADO连接SQL SERVER数据库实现的高校教材管理系统

    摘 要 随着高校规模的扩大和教学的改革的深入,高校的教学水平和管理在稳步提高,而高校的教材管理环节起着为教学和科研提供软环境的重要作用,是与高校综合能力的增强相辅而成的.而现有的高校教材管理系统大多还 ...

  9. mfc中ado上传image到sql数据库

    mfc中ado上传image到sql server数据库 一.关于mfc的使用就不在此献丑了,直接讲ado连接sql server数据库.    1.我采用的是连接方法是调用一个udl文件中的数据库配 ...

最新文章

  1. 基于WinCE的I2C驱动程序设计
  2. 电子书下载:Moving to Microsoft Visual Studio 2010
  3. python为什么中文要encoding-python 中文编码问题如何解决?
  4. Git Submodule
  5. 2.6 动量梯度下降法-深度学习第二课《改善深层神经网络》-Stanford吴恩达教授
  6. vue.js2.0 新手开发_VueJs2.0建议学习路线
  7. keras:Sequential API 和 Function API
  8. oh-my-zsh upgrade problem
  9. Android一个自定义的进度环:ProgressChart
  10. java 数组赋值_自学JAVA每日记录(10)-欢迎指点欢迎共勉
  11. 揭秘 XR 开发难题,让虚拟现实不仅仅停留在好奇
  12. Java数据结构(1)---顺序表
  13. Linux支持运行3dmax,Mesa的Panfrost Gallium3D驱动程序现在可以使用新的DRM驱动程序
  14. 前端规范——前后端接口规范
  15. 通过网络爬虫采集大数据
  16. HMACSHA加密方法
  17. 五招教你做好企业年终绩效考核,太实用了!
  18. python爬取唐诗
  19. 为什么勒索软件攻击激增?
  20. STC89C52RC - 12 - 静、动数码管显示

热门文章

  1. 《统一沟通-微软-实战》-6-部署-2-中介服务器-1-定义中介服务器
  2. Delphi 的消息机制浅探三
  3. sql 备份.bat
  4. 20 个 Laravel Eloquent 必备的实用技巧
  5. 手机号中间四位处理为‘****’
  6. POJ 1733 Parity game(带权并查集)
  7. 夺命雷公狗---微信开发57----微网站之jquery_mobile之入门案例
  8. ElasticSearch大批量数据入库
  9. javascript jquery對form元素的常見操作
  10. Maatkit工具使用lt;一gt;之mysql主从数据校验工具