数据库应用程序开发基础篇—— .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窗体应用程序)
程序一:
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 并生成一个 SqlDataReaderConsole.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();//关闭连接}}}
}

运行结果:


程序二:
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();//关闭连接}}}
}

运行结果:

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 并生成一个 OleDbDataReaderConsole.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();//关闭连接}}}
}

运行结果:

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中的类库,如下图所示:
实例程序代码:
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;}}
}

运行结果:

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

数据库应用程序开发基础篇—— .NET中SQL Server数据库的操作C#篇之一相关推荐

  1. 公司招聘软件研发程序员的一道考题--MS SQL Server数据库数据文件页面头部结构...

    有一次在招聘C++程序员时,出的一道考题,内容其实就是MS SQL Server数据库数据文件页面头部结构,如下: 有个file.a文件,这个文件以16sec[sec是扇区,每个sec包含512个By ...

  2. SQL Server无法删除数据库 xxx,因为该数据库当前正在使用(如何删除一个Sql Server数据库)

    1.一般情况下删除一个Sql Server数据库: 新建查询→输入"drop database xxx(xxx为数据库名)"→执行. 但有时会报错:无法删除数据库 "li ...

  3. .mdf数据库恢复mysql_从 mdf ldf 文件恢复sql server 数据库

    欢迎进入Windows社区论坛,与300万技术人员互动交流 >>进入 1: 无需新建数据库,直接运行 USE master; GO CREATE DATABASE test ON (FIL ...

  4. Sql Server数据库中的用户及权限配置,保障数据库安全

    最近有个朋友的网站被攻击,漏洞是比较过时的SQL注入,在帮修复的过程中,发现数据库用的是超级管理员用户sa,提高数据安全性和服务器安全性的措施之一便是降低web应用数据库用户的权限,回顾了一下Sql ...

  5. 在Android中使用SQL server数据库

    @[TOC]关于Android中SQL server数据库的使用 在Android中使用SQL server 在Android中,有内置的SQLlite数据库,属于本地存储,其他客户端无法访问,所以就 ...

  6. Sql Server数据库实现表中字段的列加密研究

    1.问题描述 去年6月份的时候做过一个系统,要对里面的一些敏感字段进行一下加密.Sqlserver列加密可以参考官方文档:SQL Server 技术文档 - SQL Server | Microsof ...

  7. 怎么从 SQL Server 数据库中导出 SQL 语句?

    同于直接/备份/恢复 或者 导入/导出 数据库操作. 新版本SQL Server客户端中还可以生成相对应的SQL语句. 非常方便与查看和与其他人共享. 操作步骤如下: 连接上数据库后, 右击数据库, ...

  8. sqlserver date类型和字符串比较_基于SQL Server数据库搭建主从复制实现读写分离实战演练...

    一.课程介绍 读写分离(主从同步)从字面意思就可以理解,就是把对数据库的读操作和写操作分离开.读写分离在网站发展初期可以一定程度上缓解读写并发时产生锁的问题,将读写压力分担到多台服务器上.读写分离的基 ...

  9. [转载]在SQL Server数据库之间进行数据导入导出,OPENDATASOURCE

    需要在c盘下先建立一个data.txt文件,然后在文件的第一行写上你要导出的列,不如说要导出id和name这两列,就在第一行写上 id,name 然后保存,使用下列SQL就可以了,你如果要保持原有的I ...

最新文章

  1. 2021年大数据Spark(二十一):Spark Core案例-SogouQ日志分析
  2. 新ITC提交APP常见问题与解决方法(Icon Alpha,Build version,AppIcon120x120)(2014-11-17)
  3. 正交频分复用(OFDM)初步(原理)
  4. 二分图-匈牙利算法模板
  5. VALSE 2020-18 《如何写/审AI领域的论文》笔记
  6. 变分自编码器系列:VAE + BN = 更好的VAE
  7. oracle查找异常中断的sqlid方法,Oracle查找锁定对象以及强制解除锁定的方法
  8. mac下的svn服务器建立
  9. 【数据结构与算法-java实现】三 Java数组类实现
  10. Vue文件在VsCode工具中红色波浪线的问题解决方法
  11. 【Kafka】Kafka Tool 2 使用教程 SASL_PLAINTEXT
  12. python中的断言
  13. phpstud使用教程_phpStudy2017使用教程,自定义php版本功能上线!
  14. Windows Server 2013 安装zune 4.8中文版
  15. html字数统计,html中利用javascript实现文本框字数的动态计算
  16. 【GPS】GPS测试环境
  17. Linux 文件系统与日志分析
  18. 如何获取彩色图像中的主色彩
  19. 全文检索服务ElasticSearch
  20. 基于Java毕业设计学生选拔系统源码+系统+mysql+lw文档+部署软件

热门文章

  1. 安卓讲课笔记2.1Activity概述——上机操作
  2. PLSQL 与 PLPGSQL
  3. 彻底解决不要脸的360更改浏览器主页【转载】
  4. Zephyr pinctrl
  5. html--样式的建立style,css样式
  6. 干货分享|数据可视化报表制作技巧
  7. linux学习什么?
  8. 【可见光室内定位】(一)概览
  9. 朋友圈(类似微信朋友圈)的显示
  10. 2023英语作文模板