C#程序设计.唐大仕.12.访问数据库

访问数据库

数据库基本知识

  • 数据库 DataBase
  • 数据库管理系统 DBMS
    • 常见 DBMS:Oracle、MS SQL Server
  • 数据库系统的优点
    • 共享性、独立性、完整性和冗余数据少
  • 管理功能
    • 数据定义/操纵/完整/安全/并发

常用 DBMS

  • 微软
    • MS SQL Server
    • MS Access(小型桌面数据库)
  • 其他
    • Oracle
    • MySQL

关系型数据库

  • 关系型数据库(RDBMS)
  • 二维表的形式组织数据
  • 表 DataTable
  • 行 DataRow(记录 Record)
  • 列 DataColumn(字段 Field)
  • 主键:primary key

数据库表的设计

实体关系图

  • E-R 图
  • 实体——关系图
  • Entity-Relation

使用数据库

  • 可视化界面
    • navicat(MySQL)
  • SQL 语句
    • 增、删、查、改

SQL

  • SQL (Structured Query Language),即结构化查询语言
  • 是数据库的标准操作语言
  • SQL包含数据定义、查询操纵和控制等多种功能
  • 最常用的语句就是:增删改查
  • 英文中叫 CRUD
    • Create
    • Retrieve
    • Update
    • Delelte
  • 一些示例

SQL 编程

  • Client/Server 模式 (客户/服务模式)
    • 数据库提供服务,称为 Server
    • 程序是客户端,称为 Client
    • 客户端通过 SQL 命令来向服务端发出请求
  • 编程的任务
    • 通过用户界面获取参数,并形成 SQL 语句
    • 建立与数据库的连接
    • 向数据库管理系统发出命令(SQL)
    • 从数据库得到数据并显示到用户界面

ADO.NET

1
using System.Data;
  • 这种访问数据库的技术叫 ADO.NET
  • ADO.NET 实现数据库的访问
    • 提供标准的 CRUD 接口
    • 对不同的数据库提供统一的访问接口
  • 发展历程
    • ODBC(Open Database Connection)
    • DAO(Data Access Object)
    • ADO(ActiveX Data Object)
    • ADO.NET

数据访问层

重要对象

对象 说明
Connection 建立与特定数据源的连接
Command 对数据源执行命令。
公开 Parameters,
并且可以从Connection在 Transaction 的范围内执行
DataReader 从数据源中读取只进且只读的数据流
DataAdapter 用数据源填充 DataSet,并解析更新
保证内存中的数据和数据库中的数据是一致的

供应程序 Provider

  • Provider 是一些托管的应用程序集
    • 包含了对特定数据元的访问代码
1
2
3
4
5
6
7
8
// SqlServer
using System.Data.SqlClient;
// Access
using System.Data.OleDb;
// ODBC
using System.Data.Odbc;
// Oracle
using System.Data.OracleClient;
  • 不同 Provide下面类的命名可能不太一样
    • Adapter 为例
1
2
3
4
5
// SqlServer
System.Data.sqlClient.SqlDataAdapter da1;

// Access
System.Data.OleDb.OleDbDataAdapter da2;

ADO.NET 体系结构

  • 内存中的数据很容易和 XML 互相转化

数据库访问方法

  • 方式 1: DataAdapter 及 DataSet
    • 适合于 “离线” 处理
      • 把数据库整个抽取到内存中
    • 自动建立 Command 对象
  • 方式 2:DataReader
    • 适合于只读数据,效率较高
  • 它们都要使用 Connection 及 Command
  • 不同的数据库有不同的命名空间,如下以 SqlServer 为例

Connection 对象

1
2
3
4
5
using System.Data;
using System.Data.SqlClient;

string connString = "server=localhost;database=pubs;uid=sa;pwd=aaa";
SqlConnection Conn = new SqlConnection(connString);
  • SqlConnection
    • Open() 方法
      • SQL Provider 使用它来与 SQL Server 数据库进行连接
    • ConnectionString 属性
      • 指定连接字符串参数

连接字符串

  • 不同数据库的 connection string 写法也会有所区别
  • SqlServer \(\to\) SqlServer Provider
1
2
3
4
data source=MyServer;
initial catalog=MyDataBase;
user id=MyUser;
password=MyPassword
  • 早期的 Access 数据库 mdb 文件或 Excel 文件 \(\to\) Microsoft.Jet.OLEDB.4.0
1
2
3
4
Provider=Microsoft.Jet.OLEDB.4.0;
Password="xxx";
User ID= Admin;
Data Source=D:\CsExample\ch10\BIBLIO.MDB
  • 新版的 Access 数据库 accdb 文件或 Excel 文件 \(\to\) Microsoft.ACE.OLEDB.12.0
1
2
3
4
Provider=Microsoft.ACE.OLEDB.12.0;
Data Source=c:\myFile.xIxs;
Excel 12.0 Xml;
HDR=YES;
  • Oracle \(\to\) Oracle Provider
1
2
3
4
Provider=MSDAORA;
DataSource=oracle db;
User ID=scott;
Password=tiger;
  • Mysql \(\to\) MySql.Data.dll
1
2
3
4
5
6
Data Source='localhost';
Database='wp';
User Id='root';
Password='root';
charset='utf8;
pooling=true;

Command 对象

  • 建立数据连接以后,可以利用 Command 对象来执行命令并从数据源返回结果
    • ExecuteReader()
      • 得到 Reader 对象,单向只读
    • ExecuteScalar()
      • 得到单一的量,如 sum、avg 等的结果
    • ExecuteNonQuery()
      • 执行非查询性的命令(如Update/Delete/Insert)
      • 返回的是它所影响的记录数

使用参数

  • 使用参数
1
2
3
4
cmd.CommandText =
"INSERT INTO Nations(CName, EName, FName) VALUES(@CName, @EName, @FName)";
cmd.Connection = this.sqlConnection1;
cmd.Parameters.Add("@CName", SqlDbType.VarChar, 60).Value ="aaaaaa";
  • 拼字符串
1
cmd.CommandText = "Insert into Nataions(CName) Values('" + name + "')";
  • 使用参数比直接用字符串相加更安全,更清晰
    • sql 注入攻击

Command 和 DataReader

DataAdapter 和 DataSet

  • 流程
    • 使用 DataAdapter 来填充 DataSet
    • 取得 DataSet 中的数据
    • 修改 DataSet 中的数据
    • 添加和删除行
    • 在 DataTable 中查找数据
    • 接受和拒绝更改
    • 保存对 DataSet 的改变返回数据库
  • 可以自动产生 Command
1
2
OleDbCommandBuilder cmdbld
= new OleDbCommandBuilder(daAdapter);
  • DataSet 对象模型

应用程序

界面及数据绑定

  • DataGridView 控件
1
2
DataGridView a = new DataGridView();
a.DataSource = myDataTable;

自定义工具类

酒店管理系统

  • 分层架构
    • UI:用户界面层(user graphical interface)
    • BLL:业务逻辑层(business logic layer)
    • DAL:数据访问层(data access layer)
    • Model:数据模型
  • ORMapping(Object-Relation Mapping)
    • 对象 - 关系(数据库表)映射
  • 代码

Sqlite

  • Sqlite是一个小型的数据库,一个文件就可以包含库的内容,现在用得越来越多。在C#中使用也很方便。
    • 使用Sqlite,需要安装System.Data.SQLite.Core
    • 在visual studio中,工具--NuGet包管理器--管理解决方案的NuGet程序包--浏览
    • 搜索Sqlite就可以看见System.Data.SQLite.Core,然后选安装(安装时,项目名要打勾)