zoukankan      html  css  js  c++  java
  • 数据库开发及ADO.NET

     

    SQL Server数据库

    数据库

    高效的存储和处理数据的介质(介质主要是两种:磁盘和内存)

    • 为什么用数据库
      • 海量存储数据
      • 查找速度快
      • 控制并发访问
      • 安全
      • 数据完整性
    • 分类
      • 关系型数据库SQL
      • 非关系型数据库
      • NoSQL:not only SQL
    • 常见数据库
      • 关系型数据库
        • 大型:Oracle、DB2
        • 中型:SQLserver、MySQL
        • 小型:access
      • 非关系型数据库
        • memcached、mongodb、redis(可同步到磁盘)
    • 两种数据库的区别
      • 关系型数据库:安全(存磁盘基本不可能丢失),容易理解,比较浪费空间
      • 非关系型数据库:效率高、不安全(断电丢失)
      • timer:3

    数据库基本操作

    • 插入数据
      //如果插入所有列则表名(列1,列2,列3)可以省略
      insert into 表名(列1,列2,列3) values(值1,值2,值3)
      
    • 删除数据
      //drop是删除整张表、delete是删除数据
      delete from 表名 where ...
      
    • 更新数据
      update 表名 set 列1=新值1,列2=新值2,... where 条件
      
    • 查询数据(数据检索)
      select 列1,列2,列3... from 表名 where 条件
      eg: select * from student where name like '张%'
      
      • 模糊查询
        • 通配符
          • _表示任意的单个字符
          • %表示匹配任意多个任意字符
          • []表示筛选、范围

    ADO.NET

    • ado.net组成
      • connection连接数据库
      • command执行SQL语句
    • C#连接SQLserver

      • 连接数据库的步骤:
        • 1.创建连接字符串
          //Data Source=服务器名;
          //Initial Catalog=数据库名;
          //Integrated Security=True;声明验证方式
          //用户名、密码方式
          string constr = "Data Source=localhost;Initial Catalog=zwt;uid=root;pwd=zwt";
          //集成式
          //string constr = "Data Source=localhost;Initial Catalog=zwt;integrated Security=true";
          
        • 2.创建连接对象
          using (SqlConnection con = new SqlConnection(constr))
          {
              //测试,打开连接
              //3.打开连接(如果打开数据连接没有问题,表示连接成功)
              con.Open();
              Console.WriteLine("数据库连接成功");
              //4.关闭连接,释放资源
              con.Close();
              //con.Dispose();
          }
          
    • C#操作SQLserver

      • 3个SqlCommand命令对象
        • cmd.ExecuteNonQuery();方法有一个int型的返回值,表示执行insert、delete、update语句后所影响的行数,并且只有执行这3种语句时返回影响的行数,其他语句都返回-1
        • cmd.ExecuteNonQuery();//执行insert、delete、update语句
        • cmd.ExecuteScalar();//执行返回单个结果
        • cmd.ExecuteReader();//查询出多行、多列结果
      • 增加数据
        • 1.创建连接字符串
          string constr = "Data Source=localhost;Initial Catalog=zwt;uid=root;pwd=zwt";
          
        • 2.创建连接对象
          using (SqlConnection con = new SqlConnection(constr))
          {
              //4.编写SQL语句
              string sql = "insert into zwt values('Tony',23,'男')";
              //5.创建一个执行sql语句的对象(命令对象)sqlcommand
              using (SqlCommand cmd = new SqlCommand(sql, con))
              {
                  //6.开始执行SQL语句
                  int r = cmd.ExecuteNonQuery();
                  //3.打开连接(连接对象最晚打开,最早关闭,节约资源)
                  con.Open();
                  Console.WriteLine("已成功插入{0}行数据",r);
              }
          }
          
      • 删除数据
        • 1.创建连接字符串
          string constr = "Data Source=localhost;Initial Catalog=zwt;Integrated Security=True";
          
        • 2.连接对象
          using (SqlConnection con =new SqlConnection(constr))
          {
              //3.sql语句
              string sql = "delete from zwttable where name=tony";
              //4.创建sqlcommand对象
              using (SqlCommand cmd = new SqlCommand(sql, con))
              {
                  //5.打开链接
                  con.Open();
                  //6.执行
                  int r = cmd.ExecuteNonQuery();
                  Console.WriteLine("成功删除了{0}行数据",r);
              }
          }
          Console.ReadKey();
          
      • 修改数据
        • 1.创建连接字符串
          string constr = "Data Source=localhost;Initial Catalog=zwt;Integrated Security=True";
          
        • 2.连接对象
          using (SqlConnection con = new SqlConnection(constr))
          {
              //3.sql语句
              string sql = "update zwttable set name=tony,age=26";
              //4.创建sqlcommand对象
              using (SqlCommand cmd = new SqlCommand(sql, con))
              {
                  //5.打开链接
                  con.Open();
                  //6.执行
                  int r = cmd.ExecuteNonQuery();
                  Console.WriteLine("成功更新了{0}行数据", r);
              }
          }
          
      • 查询一条数据
        • 1.创建连接字符串
          string constr = "Data Source=localhost;Initial Catalog=zwt;Integrated Security=True";
          
        • 2.连接对象
          using (SqlConnection con = new SqlConnection(constr))
          {
              //3.sql语句
              string sql = "select count(*) from zwttable";
              //4.创建sqlcommand对象
              using (SqlCommand cmd = new SqlCommand(sql, con))
              {
                  //5.打开链接
                  con.Open();
                  //6.执行
                  //sql语句执行时如果是聚合函数,ExecuteScalar()的返回不可能为null,如果不是聚合函数则需要判断是否为null
                  //object count = (int)cmd.ExecuteScalar();
                  //避免异常
                  object count = Convert.ToInt32(cmd.ExecuteScalar());
                  Console.WriteLine("zwttable表中共有{0}条数据", count);
              }
          }
          
      • 查询多条数据
        • 1.创建连接字符串
          string constr = "Data Source=localhost;Initial Catalog=zwt;Integrated Security=True";
          
        • 2.连接对象
          using (SqlConnection con = new SqlConnection(constr))
          {
              //3.sql语句
              string sql = "select * from zwttable";
              //4.创建sqlcommand对象
              using (SqlCommand cmd = new SqlCommand(sql, con))
              {
                  //5.打开链接
                  con.Open();
                  //通过调用ExecuteReader()方法,将给定的sql语句在服务器端执行
                  //执行完毕后,服务器端已经查好数据,但数据保存在数据库服务器内存里。并没有返回给应用程序,
                  //只是返回给应用程序一个reader对象,这个对象就是用来获取数据的对象
                  using (SqlDataReader reader = cmd.ExecuteReader())
                  {
                      //接下来就是要通过reader对象一条一条获取数据
                      //1.在获取数据前,先判断一下本次执行查询后,是否查到了数据
                      if(reader.HasRows)//如果有数据为true,否则为false
                      {
                          //2.如果有数据,那么接下来就要一条条获取数据
                          //每次获取数据之前,都要调用reader.Read()方法,向后移动一条数据,如果成功移动到了某条数据
                          //上,则返回true,否则返回false
                          while (reader.Read())
                          {
                              //获取当前reader指向的数据
                              //reader.FieldCount可以获取当前查询语句查询到的列数
                              for (int i = 0; i < reader.FieldCount; i++)
                              {
                                  Console.Write(reader[i]+"    |    ");
                              }
                              Console.WriteLine();
                          }
                      }
                      else
                      {
                          Console.WriteLine("没有查到数据");
                      }
                  }
              }
          }
          

    数据库开发及ADO.NET

    数据库管理系统(DBMS)特点

    • MySQL
      • 速度快,适合对数据要求并不是十分严谨的地方,去掉了很多中小型企业中不常用的功能
    • MSSQLServer
      • 与.net结合很好,只能运行在windows平台下,大数据量、大交易量表现不够好,功能比MySQL多
    • DB2(大型)、Oracle(大型)、Access(文件)、 SQLite(极其轻量级数据库) 、Sybase等
      • 对于开发人员来讲,大同小异
      • 除Access、SQLServerCE、SQLite等文件型数据库外,大部分数据库需数据库服务器才能运行。学习开发时连接本机数据库,上线时数据库运行在单独的服务器
      • SQL(语言)<>SQLServer<>MSSQLServer

    数据库:数据的仓库

    • 数据库文件
      • 数据库包含两个文件:主数据文件(.mdf)、日志文件(.ldf)
        • 除此之外还可包含:次要数据文件(.ndf)、其他日志文件(.ldf)
      • 数据库文件的分离和附加
        • 当前数据库中的表必须先进行分离才能拷贝到其他目录
        • 附加数据库文件,文件数据加载到该库下的表
          • 脱机、联机更加简便高效
          • 附加权限不足时:数据库文件->属性->安全性->编辑->添加“everyone”->允许->应用->确定
    • 表:关系表,排货架
      • column:列,字段
      • row:行,元组
      • primary key:主键,唯一标识表中的一条记录
        • 分类:业务主键、逻辑主键(推荐)
        • 选择依据
          • 不能重复
          • 不能为空或null
          • 稳定的列:保存的数据不经常改变
          • 与实际业务没有关系的列
          • 单列作为主键(不推荐组合主键)
          • 优先选择数字类型的列(不推荐字符串和数据类型大的列)
        • 表中只能有一个主键
          • 建立主键后默认会建立索引,磁盘储存顺序和主键列保持一致,因为实际物理顺序只有一种,所以一个表中只能有一个主键
      • 外键
        • 外键列:把数据拆分成两张表时每个表中都有自己的主键,其中一张表除主键外多了一列,这列用来引用另外一张表中的主键,这列就是第一张表的“外键列”
          • 外键列中的数据必须是在另一张表的主键列中已经存在的数据
        • 外键表:有外键列的表就叫做“外键表”
        • 主键表:主键被引用的那张表就叫做“主键表”
    • 数据冗余
      • 问题
        • 造成存储空间浪费
        • 更新异常、删除异常
      • 解决
        • 把原来表中的数据拆分成多个表来存储
          • 新问题
            • 如何将这两张表中的数据关联起来
              • 使用主外键将不同表中的数据关联起来
    • 设置数据更改保存权限
      • 工具->选项->Designers->“阻止保存要求重新创建表的更改”去掉钩

    sql server中的常用数据类型

    • image类型
      • 用来存储byte[]
    • 字符串类型
      • char、nchar、varchar、nvarchar、text、ntext、varchar(max)、nvarchar(max)
    • 带n和不带n的区别
      • 不带n的数据类型,存储中文等双字节字符,占用2个字节;存储英文,数字等每个字符占用1个字节
        • 不带n的这些数据类型,长度最长可以设置为8000
      • 带n的,无论存储中文、英文还是数字等,每个字符都是占用2个字节
        • 带n的这些数据类型,长度最长可以设置为4000
    • 带var和不带var的区别
      • 带var的表示可变长度
        • 可变长度会根据实际存储数据大小动态重新分配存储空间,节省存储空间
      • 不带var的表示固定长度,不够的自动补空格
        • 不用重新计算分配存储空间,更加高效
    • text|ntext、varchar(max)|nvarchar(max)区别
      • 前者为老版本数据库中的数据类型(2005之前)
      • 单列最多可存储4G大小,多用于论文等的存储
    • 帮助->索引->输入“数据类型”->SQL server数据类型中查看
    • 必须使用带n的情况
      • 当默认排序规则不是中文时,在保存数据时会出现乱码

    系统数据库:SQL Server共5个

    • master
      • 记录SQL Server的所有系统级信息,如:登陆账户信息、链接服务器和系统配置设置、其他数据库的数据文件的位置、初始化信息等
      • 如果master数据库不可用,则无法启动SQL Server
    • msdb
      • 用于代理计划警报和作业,数据库定时执行某些操作、数据库邮件等
    • model
      • 用作SQL Server实例上创建数据库的模板
      • 对model 数据库进行的修改(如数据库大小、排序规则、恢复模式和其他数据库选项)将应用于以后创建的所有数据库
      • 在model数据库中创建一张表,则以后每次创建数据库的时候都会有默认的一张同样的表。
    • tempdb
      • 一个工作空间,用于保存临时对象或中间结果集
      • 一个全局资源,可供连接到 SQL Server 实例的所有用户使用
      • 每次启动 SQL Server 时都会重新创建 tempdb
    • Resource
      • 一个只读数据库,包含 SQL Server 包括的系统对象
      • 系统对象在物理上保留在Resource数据库中,但在逻辑上显示在每个数据库的 sys架构中
      • Resource 数据库的物理文件名为 mssqlsystemresource.mdf 和 mssqlsystemresource.ldf
      • 这些文件位于 C:Program FilesMicrosoft SQL ServerMSSQL10_50.instance_nameMSSQLBinn 中
      • 每个 SQL Server 实例都具有一个(唯一一个)关联的 mssqlsystemresource.mdf 文件,并且实例间不共享此文件

    代码创建数据库和表

    • 创建的数据库(带参数)
      create database DataBaseName
      on primary(  --配置主数据文件的选项
          name='DataBaseName',--主数据文件的逻辑名称
          filename='c:DataBaseName.mdf',--主数据文件的实际保存路径
          size=5MB,
          maxsize=150MB,
          filegrowth=20%)
      log on(  --配置日志文件的选项
          name='DataBaseName',--日志文件的逻辑名称
          filename='c:DataBaseName_log.ldf',--日志文件的实际保存路径
          size=5mb,--日志文件的初始大小
          filegrowth=5mb)
      
    • 创建表
      use DataBaseName
      --员工Id,身份证号,姓名,性别,入职日期,年龄,地址,电话,所属部门、Email
      create table Employees(  ---创建一个员工表
          EmpID int identity(1,1) primary key,
          EmpIDCard varchar(18) not null,
          EmpName nvarchar(50) null,
          EmpGender bit not null,
          EmpJoinDate datetime,
          EmpAge int,
          EmpAddress nvarchar(300),
          EmpPhone varchar(100),
          DeptID int not null,
          EmpEmail varchar(100))
  • 相关阅读:
    undefined reference to `sqrt' 问题
    linux上开发minigui的配置过程
    linxu select 返回值
    Unix/Linux C静态库的使用
    ubuntu 默认pdf阅读器乱码
    文件锁使用原理及其方法
    fileno函数与ftruncate函数
    Linux下select函数的使用
    unix linux 文件锁
    iOS 基础笔试题
  • 原文地址:https://www.cnblogs.com/happyzwt/p/8150403.html
Copyright © 2011-2022 走看看