精华内容
下载资源
问答
  • 可接受的数据丢失量取决于数据对公司多重要以及什么资源可用于确保其生命。 4.2 允许用于恢复的时间量 恢复所需的时间量类似于高可用性的目标。它与高可用性解决方案之间的差异在于所防止的故障类型以及通常...
  • 数据库自2009年起5年的数据量。 数据库只保存近两年的数据。比如 2012-01—01 ~ 2014-01-01 首先将 2010-01-01 ~ 2012-01-01 的数据保存到大文件夹里【比如 D:\2010年及2011年数据】,以月份命名各个文件夹...
  • 使用mysql数据库

    2020-08-18 20:06:14
    删除表2.4删除一个数据库三、管理表中数据记录3.1插入数据记录3.2查询数据记录3.3修改、更新数据表中的数据记录3.4设置用户权限3.5跳密码登录3.6修改登录密码3.7删除数据记录3.8清空表3.8清空表 使用mysql数据库 ...

    使用mysql数据库

    一、查看数据库结构

    1.1查看当前服务器中包含的库

    SHOW DATABASES;

    mark

    1.2查看当前使用的库中包含的表

    MYSQL数据库的数据文件存放于/usr/local/mysql/data目录下,每个数据库对应一个子目录,用于存储数据表文件。每一个数据表文件对应三个文件,后缀名分别为.“frm” ".myd " “.myi”。

    少数以opt、csm 、csv、ibd结尾的。

    USE mysql; 切换到所使用的库
    SHOW TABLES;
    

    mark

    1.3有几个用户

    select user from user;

    mark

    1.4查看表的结构(字段)

    DESCRIBE 数据库名. 表名

    mark

    1.5SQL语言概述

    • SQL语言

      是Structured Query Language的缩写,及结构化查询语言

      是关系型数据库的标准语言

      用于维护管理数据库,如数据查询,数据更新,访问控制,对象管理等功能

    • SQL分类

      DDL:数据定义语言

      DML:数据操纵语言

      DQL:数据查询语言

      DCL:数据控制语言

    二、创建及删除库和表

    2.1创建新的库

    CREATE DATABASES 库名;

    mark

    2.2创建新的表

    CREATE TABLE表名(字段01名称字段01类型字段01约束,字段02名字段02类型字段02约束……)存储引擎,字符集

    字段01名称∶属性名称,自定义
    字段01类型∶
    int(5)整型 00000-99999 
    
    double 浮点型8字节
    decimal(5,2)有效数字是5位,小数点后面保留2位 100.00 099.50 
    
    float 单精度浮点4字节char(10)固定长度字符串
    
    varchar(50)可变长度字符串
    
    char 字符
    
    字段01约束∶
    
    非空约束∶内容不允许为空
    
    主键约束∶非空且唯一 标识
    
    默认值∶假如没有填数据,默认预先设定的值填写
    
    自增特性∶id 1234 auto_increment
    
    存储引擎∶myisam innodb 
    
    字符集∶UTF-8
    
    
    
    
    

    示例

    use school

    create table info (id int(3) not null primary key auto_increment,name varchar(10) not null,score decimal(5,2),address varchar(50) default’ 未知’);

    mark

    2.3 drop table 表名;删除表

    示例

    drop table tmp;

    mark

    2.4删除一个数据库

    DROP DATABASE score;

    mark

    三、管理表中数据记录

    3.1插入数据记录

    insert into 表名(字段1,字段2,…)values(字段1的值,字段2的值,…)

    insert into info (id,name,score,address) values (1,‘张三’ ,‘75.5’, ‘南京’ );

    mark

    不加字段,默认所有字段(必须写全)

    insert into info values (2,‘李四’,‘78’,‘上海’);

    mark

    insert into info (name,score,address) values (‘王五’,88,‘苏州’),(‘王二麻子’,60,default);

    mark

    default 默认字段为之前创建表时设置的约束字段

    3.2查询数据记录

    SELECT字段名1,字段名2…FROM表名 where 条件表达式

    '*'可以表示筛选所有字段,若显示所有数据记录可以省略WHERE条件语句

    示例

    select * from school.info;

    mark

    若依据特定条件查找记录时,WHERE条件语句必不可少。

    示例

    select * from info where score >80;

    mark

    把筛选出的内容创建成一张新表

    create table tmp as select * from info where score >75;

    mark

    3.3修改、更新数据表中的数据记录

    update 表名 set 字段名 1=值1[,字段名2=值2] where条件表达式

    示例

    将info表中address对应的"未知"改为常州

    update info set address=‘常州’ where name=‘王二麻子’;

    mark

    3.4设置用户权限

    • 若用户已存在,则更改用户密码
    • 若用户不存在,则新建用户
    • GRANT 权限列表 ON 数据库名.表名 TO 用户名@来源地址 [IDENTIFIED BY ‘密码′ ]
    mysql> grant all privileges on *.* to 'tom'@'%' identified by 'abc123' with grant option;
    '//all privileges:所有权限,%:所有终端'
    Query OK, 0 rows affected, 1 warning (0.00 sec)
    

    flush privileges;

    3.5跳过密码登录

    vim /etc/my.cnf

    skip-grant-tables 跳过表的加载

    mark

    mark

    3.6修改登录密码

    update mysql.user set authentication_string =password(‘1234567’) where user=‘tom’;

    mark

    3.7删除数据记录

    delete from 表名 where条件表达式

    示例 删除school库中tmp表中分数大于80的记录

    delete from school.tmp where score >80;

    mark

    注:不带where 条件情况下,删除整个表,慎用!!!!

    3.8清空表

    truncate table 表名  清空表内数据
    

    示例

    truncate table info;
    mark

    delect from 表名 删除表

    示例

    drop table tmp;

    [外链图片转存中…(img-oU3mFzDN-1597752357957)]

    注:不带where 条件情况下,删除整个表,慎用!!!!

    3.8清空表

    truncate table 表名  清空表内数据
    

    示例

    truncate table info;
    [外链图片转存中…(img-qo4zQOnO-1597752357958)]

    delect from 表名 删除表

    示例

    drop table tmp;

    mark

    展开全文
  • MySQL数据库管理

    2020-08-19 09:03:11
    文章目录一、基本使用概览1、查看数据库是否开启2、数据库3、查看数据库4、进入某个数据库5、查看系统中所有数据表6、查询某个数据表7、查询数据表中几个用户8、显示数据结构9、SQL语言10、SQL分类11、创建...

    一、基本使用概览

    1、查看数据库是否开启

    netstat -ntap | grep 3306

    2、数据库

    mysql -uroot -p

    3、查看数据库

    show databases;

    mark

    4、进入某个数据库

    use mysql;

    mark

    5、查看系统中所有数据表

    show tables;

    6、查询某个数据表

    select * from user;

    7、查询数据表中有几个用户

    select user from user;

    mark

    8、显示数据表的结构

    describe user;

    9、SQL语言

    • Structured Query Language的缩写,即结构化查询语言
    • 关系型数据库的标准语言
    • 用于维护管理数据库-----------包括数据查询、数据更新、访问控制、对象管理等功能

    10、SQL分类

    • DDL:数据定义语言
    • DML:数据操纵语言
    • DQL:数据查询语言
    • DCL:数据控制语言

    11、创建数据库和表

    • DDL语句可用于创建数据库对象,如库、表、索引等

    • 使用DDL语句新建库、表
      1、创建数据库
      CREATE DATABASE 数据库名
      2、创建数据表
      CREATE TABLE 表名 (字段定义…)

      例如:create table 表名(字段01名称 字段01类型 字段01约束,字段02名 字段02类型 字段02约束,。。。)

      字段01名称:属性名称,自定义

      字段01类型:

      ​ int(5) 整型 00000-99999

      ​ double 浮点型

      ​ decimal(5,2) 有效数字是5位,小数点后面保留2位 100.00 099.50

      ​ float 单精度浮点 4字节

      ​ char(10) 固定长度字符串

      ​ varchar(50) 可变长度字符串

      ​ char 字符

      字段01约束:

      ​ 非空约束:内容不允许为空

      ​ 主键约束:非空且唯一 标识

    ​ 默认值:假如没有填数据,默认预先设定的值填写

    ​ 自增特性:id 1 2 3 4 自动升降序 auto_increment

    ​ 存储引擎:myisam innodb

    ​ 字符集:UTF-8

    12、刷新数据库

    flush privileges;

    13、给数据库加权限

    grant all privileges on *.* to ‘root’@’%’ identified by ‘abc123’

    ##意思是给root用户,密码为abc123的用户添加管理所有数据库及表的权限。

    %:代表所有

    localhost:代表只有本地

    mark

    14、插入新的数据记录

    insert into 表名(字段1,字段2)

    ​ values(字段1的值,字段2的值)

    15、修改、更新数据表中的数据记录

    update 表名 set 字段名1=值1[,字段名2=值2] where 条件表达式

    16、跳过表的加载设置

    在文件/etc/my.cnf文件中,mysqld下面添加一行ship-grant-tables,意思是跳过表的加载

    17、数据库创建临时表

    create temporary table mytmp(id int(10) not null auto_increment,name varchar(32),primary key (id))ENGINE=InnoDB DEFAULT CHARSET=utf8;

    18、克隆表

    create table test like mytmp;

    insert into test select * from mytmp;

    19、查看表完整结构

    show create table mytmp\G;

    20、数据库用户授权

    GRANT select ON auth.* TO ‘xiaoqi’@‘localhost’ IDENTIFIED BY ‘123456’;

    ###xiaoqi用户,密码123456,可在本地访问auth库中所有表做查询操作

    21、查看用户的权限

    show grants for ‘dbuser’@‘192.168.4.19’;

    ##查看用户dbuser中,地址192.168.4.19的权限

    22、撤销用户的权限

    REVOKE all ON auth.* FROM ‘xiaoqi’@‘localhost’;

    ##撤销用户xiaoqi在本地访问数据库auth的权限

    23、查看所有权限

    show grants;

    24、授权及撤销的特点

    grant:当用户已存在时,直接提权

    ​ 当用户不存在时,先创建用户,再提权

    revoke:只撤销权限,不会删除用户

    mark

    展开全文
  • 4) 查询有不及格学生姓名和所在系 5) 查询所有成绩为优秀(大于90分)学生姓名 6) 查询既选修了2号课程又选修了3号课程学生姓名、学号; 7) 查询和刘晨同一年龄学生 8) 选修了课程名为“数据库”...
  • 9.2 分布式数据库设计的数据分片、复制和分配技术 182 9.2.1 数据分片 182 9.2.2 数据复制和分配 184 9.2.3 分片、分配和复制示例 185 9.3 分布式数据库系统的类型 187 9.4 分布式数据库中的...
  • ER模型和ER图,数据抽象和语义数据建模,UML类图表示法,基本关系模型,关系代数和关系演算,SQL,规范化,磁盘上组织记录文件主要方法,文件索引技术,查询处理与优化,以及物理数据库的设计与调优。...
  • MYSQL数据库总结

    2018-03-22 19:57:21
    数据类型 数据库database操作 ...表中不能重复的数据 过滤重复数据 统计表中重复数据 删除重复数据 SQL注入 执行顺序 数据类型 分为三种: 数值、字符串、日期 记录一些用的、比较特殊的吧:...

    数据类型

    分为三种: 数值、字符串、日期
    记录一些用过的、比较特殊的吧:

    • VARCHAR: 0-65535字节,变长字符串
    • BLOB: 0-65535字节,二进制形式的长文本
    • DATATIME: YYYY-MM-DD HH:MM:SS 混合日期和时间值
    • TIMESTAMP:YYYYMMDD HHMMSS 混合日期和时间值、时间戳
    • PRIMARY KEY()或者UNIQUE能够保证数据的唯一性

    数据库database操作

    创建数据库

    create DATABASE DATABASE_NAME;

    使用数据库

    use DATABASE_NAME;

    删除数据库

    drop database DATABASE_NAME;

    建表语句

    CREATE TABLE test(
       id INT UNSIGNED AUTO_INCREMENT,
       title VARCHAR(100) NOT NULL,
       author VARCHAR(40) NOT NULL,
       submission_date DATE,
       PRIMARY KEY (id)
    )ENGINE=InnoDB DEFAULT CHARSET=utf8;

    创建数据库

    • 如果你不想字段为 NULL 可以设置字段的属性为 NOT NULL, 在操作数据库时如果输入该字段的数据为 NULL,就会报错。
    • AUTO_INCREMENT 定义列为自增的属性,一般用于主键,数值会自动加1。
    • PRIMARY KEY关键字用于定义列为主键。 您可以使用多列来定义主键,列间以逗号分隔。
    • ENGINE 设置存储引擎,CHARSET 设置编码。

    获得这张表的描述

    desc test;

    查看表中各个属性的类型

    插入表

    INSERT INTO TEST1(title, author,submission_date)
    VALUES
    ("chinese","hgy",now() );

    插入数据

    查询数据库库表

    SELECT * FROM TABLE_NAME
    WHERE field = VALUE
    LIMIT N OFFSET M;
    查询关键词
    LIMIT :属性设定返回的记录数
    OFFSET :指定SELECT语句开始查询的数据偏移量
    WHERE子句
    - AND,OR
    - =,<>,!=,>,<=,>=
    - WHERE 子句也可以运用于 SQL 的 DELETE 或者 UPDATE 命令。
    - WHERE 子句类似于程序语言中的 if 条件,根据 MySQL 表中的字段值来读取指定的数据。

    BINARY 关键字区分大小写

    SELECT * FROM `TABLE_NAME` [WHERE BINARY Clause]
    binary的用法

    LIKE 包含某些字符的所有记录

    SELECT * FROM `TABLE_NAME` [WHERE ... LIKE ...]

    LIKE的用法

    • 如果没有%的时候,like可以跟等号=进行替换,
      LIKE与等号
    • 可以尝试用%,表示任意字符

    REGEXP操作符来进行正则化表达式的匹配

    符号 描述
    ^ 匹配输入字符串的开始位置。如果设置了 RegExp 对象的 Multiline 属性,^ 也匹配 \n\r 之后的位置。
    $ 匹配输入字符串的结束位置。如果设置了RegExp 对象的 Multiline 属性,$ 也匹配 \n\r 之前的位置。
    . 匹配除 \n 之外的任何单个字符。要匹配包括 \n 在内的任何字符,请使用象 [.\n] 的模式。
    [...] 字符集合。匹配所包含的任意一个字符。例如, '[abc]' 可以匹配 plain 中的 a
    [^...] 负值字符集合。匹配未包含的任意字符。例如, [^abc] 可以匹配 plain中的p
    * 匹配前面的子表达式零次或多次。例如,zo* 能匹配 “z” 以及 “zoo”。* 等价于{0,}。
    + 匹配前面的子表达式一次或多次。例如,’zo+’ 能匹配 “zo” 以及 “zoo”,但不能匹配 “z”。+ 等价于 {1,}。
    {n} n 是一个非负整数。匹配确定的 n 次。例如,’o{2}’ 不能匹配 “Bob” 中的 ‘o’,但是能匹配 “food” 中的两个 o。
    {n,m} m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。

    更新数据库表

    UPDATE TABLE_NAME SET field1= new_Value, field2=new_Value [WHERE Clause]

    更新数据库表

    删除表

    • delete:删除表中某些数据
    • drop: 删除表
    • truncate: 清除表内数据,但是保留表结构
    DELETE FROM TABLE_NAME [WHERE Clause];//如果没有WHERE Clause,会把所有记录都删除
    TRUNCATE TABLE TABLE_NAME;
    drop table TABLE_NAME;

    删除

    并集

    MySQL UNION 操作符用于连接两个以上的 SELECT 语句的结果组合到一个结果集合中。多个 SELECT 语句会删除重复的数据。

    SELECT expression1, expression2, ... expression_n
    FROM tables
    [WHERE conditions]
    UNION [ALL | DISTINCT]
    SELECT expression1, expression2, ... expression_n
    FROM tables
    [WHERE conditions];

    默认是 UNION DISTINCT 的,去除重复的部分。如果不想去重,加上 UNION ALL
    UNION用法

    排序

    SELECT field1, field2,...fieldN table_name1, table_name2...
    ORDER BY field1, [field2...] [ASC [DESC]]

    默认是升序排列
    ORDER BY用法

    分组

    GROUP BY根据某些属性进行分组统计,可以使用COUNT(),AVG(),SUM()等函数
    GROUP BY 用法
    GROUP BY + 函数

    WITH ROLLUP来进行对统计出来的值再进行相同的统计
    利用coalesce设置一个可以取代NULL的名称
    WITH ROLLUP

    连接

    • INNER JOIN:获取两个表中字段匹配关系的记录。感觉有点像交集。
      两种方法等价:
      INNER JOIN
    • LEFT JOIN:获取左表所有记录,即使右表没有对应匹配的记录。左表没有的属性,但在右表有的话就补充进去。如果右表没有的话,就填充为NULL。
    • RIGHT JOIN: 与 LEFT JOIN 相反,用于获取右表所有记录,即使左表没有对应匹配的记录。
      LEFT JOIN与RIGHT JOIN的区别

    修改

    ALTER TABLE testalter_tbl DROP i;//删除某个属性
    ALTER TABLE testalter_tbl ADD i INT FIRST;//添加某个属性

    alter的用法

    事务

    MYSQL事务用于处理操作量大,复杂度高的数据。比如说你在管理系统里面删除一个人员,需要删除他的相关信息,涉及到其他表其他属性,这些sql语句构成了一个事务。如果删到一半失败了,那么事务将执行不成功,数据库会ROLL BACK。
    四个特性ACID:原子性(A-tomicity)、一致性(C-onsistency)、隔离性(I-solation)、持久性(D-urability)

    • 原子性:一个事务中的所有操作要么执行,要么不执行,如果中途某个操作执行失败了,就会回滚到事务开始的状态
    • 一致性:在事务的开始和结束后,数据库的完整性没有被破坏。
    • 隔离性:数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)。
    • 持久性:处理成功事务后,对数据库的修改是持久的。

    控制语句
    BEGIN或者START TRANSACTION
    COMMIT
    ROLLBACK
    SAVEPOINT identifier
    RELEASE SAVEPOINT identifier
    ROLLBACK TO identifier
    SET TRANSACTION

    MYSQL 事务处理主要有两种方法

    1. 用 BEGIN, ROLLBACK, COMMIT来实现
      BEGIN 开始一个事务
      ROLLBACK 事务回滚
      COMMIT 事务确认
    2. 直接用 SET 来改变 MySQL 的自动提交模式:
      SET AUTOCOMMIT=0 禁止自动提交
      SET AUTOCOMMIT=1 开启自动提交

    索引

    索引可以提高MYSQL的检索速度。
    索引是应用在 SQL 查询语句的条件(一般作为 WHERE 子句的条件)。
    索引也是一张表,该表保存了主键与索引字段,并指向实体表的记录。

    • 单列索引(一个表可以有多个单列索引)
    • 组合索引(一个索引包含多列)
    • 唯一索引,索引列的值必须唯一,但允许有空值

    优点:
    提高数据检索效率,降低数据库的IO成本
    通过索引来排序,降低数据排序的成本,降低CPU消耗

    缺点:
    1. 索引降低了更新表的速度(insert、update和delete),不仅要保存数据,还要保存索引文件。
    2. 建立索引会占用磁盘空间的索引文件。

    MySQL索引结构

    • BTree索引
    • Hash索引
    • full-text全文索引
    • R-Tree索引
    ALTER table `tableName` ADD INDEX `indexName`(`columnName`);//建表后,创建索引
    CREATE TABLE mytable(  
        ID INT NOT NULL,   
        username VARCHAR(16) NOT NULL,  
        INDEX `indexName` (username(length))  
    );  
    DROP INDEX `indexName` ON mytable; //删除索引
    CREATE UNIQUE INDEX `indexName` ON mytable(username(length))
    SHOW INDEX FROM `table_name`;//显示所有的索引

    场景分析(对重复数据的处理)

    表中不能有重复的数据

    • 设置为主键
    • 设置为UNIQUE

    过滤重复数据

    SELECT DISTINCT first_name, last_name FROM person_tbl;
    SELECT first_name, last_name FROM person_tbl GROUP BY first_name, last_name;

    统计表中重复数据

    SELECT count(*) as num , first_name, last_name
    from person_tbl
    GROUP BY first_name, last_name
    HAVING num >1;

    删除重复数据

    • 建立临时表
    CREATE TABLE tmp SELECT last_name, first_name, sex FROM person_tbl  GROUP BY (last_name, first_name, sex);
    DROP TABLE person_tbl;
    ALTER TABLE tmp RENAME TO person_tbl;
    • 添加索引或者PRIMARY KEY
    ALTER IGNORE TABLE person_tbl
    ADD PRIMARY KEY (last_name, first_name);

    SQL注入

    定义:把sql语句插入到web表单递交输入域名或页面请求的查询字符串,最终达到欺骗服务器执行的恶意SQL命令。

    防止SQL注入,我们需要注意以下几个要点:

    1.永远 不要信任用户的输入。对用户的输入进行校验,可以通过正则表达式,或限制长度;对单引号和 双”-“进行转换等。
    2.永远 不要使用动态拼装sql,可以使用参数化的sql或者直接使用存储过程进行数据查询存取。
    3.永远 不要使用管理员权限的数据库连接,为每个应用使用单独的权限有限的数据库连接。
    4.不要把机密信息直接存放,加密或者hash掉密码和敏感的信息。
    5.应用的异常信息应该给出尽可能少的提示,最好 使用自定义的错误信息对原始错误信息进行包装
    6.sql注入的检测方法一般采取辅助软件或网站平台来检测,软件一般采用sql注入检测工具jsky,网站平台就有亿思网站安全平台检测工具。MDCSOFT SCAN等。采用MDCSOFT-IPS可以有效的防御SQL注入,XSS攻击等。

    LIKE语句注入
    like查询时,如果用户输入的值有_%,则会出现这种情况:用户本来只是想查询”abcd_”,查询结果中却有”abcd_”、”abcde”、”abcdf”等等

    执行顺序

    (1)from
    (3) join
    (2) on
    (4) where
    (5)group by(开始使用select中的别名,后面的语句中都可以使用)
    (6) avg,sum….
    (7)having
    (8) select
    (9) distinct
    (10) order by
    (11) limit

    • FORM: 对FROM的左边的表和右边的表计算笛卡尔积。产生虚表VT1
    • ON: 对虚表VT1进行ON筛选,只有那些符合的行才会被记录在虚表VT2中。
    • JOIN: 如果指定了OUTER JOIN(比如left join、 right join),那么保留表中未匹配的行就会作为外部行添加到虚拟表VT2中,产生虚拟表VT3, rug from子句中包含两个以上的表的话,那么就会对上一个join连接产生的结果VT3和下一个表重复执行步骤1~3这三个步骤,一直到处理完所有的表为止。
    • WHERE: 对虚拟表VT3进行WHERE条件过滤。只有符合的记录才会被插入到虚拟表VT4中。
    • GROUP BY: 根据group by子句中的列,对VT4中的记录进行分组操作,产生VT5.
      CUBE | ROLLUP: 对表VT5进行cube或者rollup操作,产生表VT6.
    • HAVING: 对虚拟表VT6应用having过滤,只有符合的记录才会被 插入到虚拟表VT7中。
    • SELECT: 执行select操作,选择指定的列,插入到虚拟表VT8中。
    • DISTINCT: 对VT8中的记录进行去重。产生虚拟表VT9.
    • ORDER BY: 将虚拟表VT9中的记录按照进行排序操作,产生虚拟表VT10.
    • LIMIT:取出指定行的记录,产生虚拟表VT11, 并将结果返回。
    展开全文
  • 最近在项目中使用中碰到了这样一种情况,查询的数据是从Oracle中获取的,但是记录下来的数据是存在Sql Server中(企业Oracle数据库管理太严,没办法操作)。而且我在之前的工作中也碰到使用SQLite数据库,就借这次...

    最近在项目中使用中碰到了这样一种情况,查询的数据是从Oracle中获取的,但是记录下来的数据是存在Sql Server中(企业Oracle数据库管理太严,没办法操作)。而且我在之前的工作中也碰到过使用SQLite数据库,就借这次机会写一个通用的类库。

    我在网上搜到了一篇利用工厂模式实现的通用类库,我在参考该文章基础上,做了一些修改。本文最好有一些Ado.net的基础。

    感谢埋头前进的码农 https://www.cnblogs.com/lifeil/archive/2013/04/16/3024161.html的文章。

    1.首先创建数据库的枚举类型

     1   public enum DbProviderType : byte
     2        {
     3            // <summary>
     4            /// 微软 SqlServer 数据库
     5            /// </summary>
     6            SqlServer,
     7 
     8            /// <summary>
     9            /// 开源 MySql数据库
    10            /// </summary>
    11            MySql,
    12 
    13            /// <summary>
    14            /// 嵌入式轻型数据库 SQLite
    15            /// </summary>
    16            SQLite,
    17 
    18            /// <summary>
    19            /// 甲骨文 Oracle
    20            /// </summary>
    21            Oracle,
    22 
    23              /// <summary>
    24            /// 旧版微软的oracle组件,目前已经废弃
    25            /// </summary>
    26            OracleClient,
    27 
    28            /// <summary>
    29            /// 开放数据库互连
    30            /// </summary>
    31            ODBC,
    32 
    33            /// <summary>
    34            /// 面向不同的数据源的低级应用程序接口
    35            /// </summary>
    36            OleDb,
    37 
    38            /// <summary>
    39            /// 跨平台的关系数据库系统 Firebird
    40            /// </summary>
    41            Firebird,
    42 
    43            /// <summary>
    44            ///加州大学伯克利分校计算机系开发的关系型数据库 PostgreSql
    45            /// </summary>
    46            PostgreSql,
    47 
    48            /// <summary>
    49            /// IBM出口的一系列关系型数据库管理系统 DB2
    50            /// </summary>
    51            DB2,
    52 
    53            /// <summary>
    54            /// IBM公司出品的关系数据库管理系统(RDBMS)家族  Informix
    55            /// </summary>
    56            Informix,
    57 
    58            /// <summary>
    59            /// 微软推出的一个适用于嵌入到移动应用的精简数据库产品 SqlServerCe
    60            /// </summary>
    61            SqlServerCe
    62        }

    2.创建好后,我们再设计一个ProviderFactory类,该类可以根据传过来的DbProviderType,创建不同的DbProviderFactory 对象,该对象用于一般的数据库操作。

     1  public  class ProviderFactory
     2     {
     3       /// <summary>
     4       /// 保存每种数据访问方式对应的程序集名称
     5       /// </summary>
     6       private static Dictionary<MyHelper.Define.DbProviderType,string> providerInvariantNames =new   Dictionary<MyHelper.Define.DbProviderType,string>();
     7 
     8       /// <summary>
     9       /// 保存已经生成的DbProviderFactory对象
    10       /// </summary>
    11       private readonly static Dictionary<MyHelper.Define.DbProviderType, DbProviderFactory> providerFactoies = new Dictionary<MyHelper.Define.DbProviderType, DbProviderFactory>(20);
    12 
    13       /// <summary>
    14       /// 加载已知的访问类型与名称
    15       /// </summary>
    16       static ProviderFactory()
    17       {
    18           providerInvariantNames.Add(MyHelper.Define.DbProviderType.SqlServer, "System.Data.SqlClient");
    19           providerInvariantNames.Add(MyHelper.Define.DbProviderType.OleDb, "System.Data.OleDb");
    20           providerInvariantNames.Add(MyHelper.Define.DbProviderType.ODBC, "System.Data.ODBC");
    21           providerInvariantNames.Add(MyHelper.Define.DbProviderType.OracleClient, "System.Data.OracleClient");//已经废弃
    22           providerInvariantNames.Add(MyHelper.Define.DbProviderType.Oracle, "Oracle.ManagedDataAccess.Client"); //需要安装Oracle.ManagedDataAccess插件,否则无效
    23           providerInvariantNames.Add(MyHelper.Define.DbProviderType.MySql, "MySql.Data.MySqlClient");
    24           providerInvariantNames.Add(MyHelper.Define.DbProviderType.SQLite, "System.Data.SQLite"); //注意在Nuget加入SQLite程序集
    25           //出现错误的话,参考https://www.cnblogs.com/leleroyn/archive/2011/03/24/1993627.html
    26           //<remove invariant="System.Data.SQLite"/>
    27           //<add name="SQLite Data Provider" invariant="System.Data.SQLite" description=".Net Framework Data Provider for SQLite" type="System.Data.SQLite.SQLiteFactory, System.Data.SQLite" />
    28           providerInvariantNames.Add(MyHelper.Define.DbProviderType.Firebird, "FirebirdSql.Data.Firebird");
    29           providerInvariantNames.Add(MyHelper.Define.DbProviderType.PostgreSql, "Npgsql");
    30           providerInvariantNames.Add(MyHelper.Define.DbProviderType.DB2, "IBM.Data.DB2.iSeries");
    31           providerInvariantNames.Add(MyHelper.Define.DbProviderType.Informix, "IBM.Data.Informix");
    32           providerInvariantNames.Add(MyHelper.Define.DbProviderType.SqlServerCe, "System.Data.SqlServerCe");
    33       }
    34 
    35       public  static DbProviderFactory GetDbProviderFactory(MyHelper.Define.DbProviderType providerType)
    36       {
    37           if (!providerFactoies.ContainsKey(providerType))
    38           {
    39               var factory = BuildDbProviderFactory(providerType); //生成DbProviderFactory对象
    40               providerFactoies.Add(providerType, factory); //加入到字典中
    41           }
    42           return providerFactoies[providerType];
    43       }
    44 
    45       /// <summary>
    46       /// 生成DbProviderFactory对象
    47       /// </summary>
    48       /// <param name="providerType"></param>
    49       /// <returns></returns>
    50       private static DbProviderFactory BuildDbProviderFactory(MyHelper.Define.DbProviderType providerType)
    51       {
    52           string provideName = providerInvariantNames[providerType]; //程序集名称;
    53           DbProviderFactory factory = null;
    54           try
    55           {
    56               factory = DbProviderFactories.GetFactory(provideName);
    57           }
    58           catch (Exception ex)
    59           {
    60               factory = null;
    61           }
    62           return factory;
    63       }

    3.创建DbHelper类。

      1 public  class DbHelper
      2     {
      3       private  DbProviderFactory _providerFactory;
      4       private string _connectionString = null; //保存连接字符串
      5 
      6       /// <summary>
      7       /// 生成DbProviderFactory对象
      8       /// </summary>
      9       /// <param name="connectionString">连接字符串</param>
     10       /// <param name="providerType">需要生成的DbProviderFactory对象</param>
     11       public DbHelper(string connectionString,MyHelper.Define.DbProviderType providerType)
     12       {
     13           if (string.IsNullOrEmpty(connectionString)) //连接字符串不能为空
     14           {
     15               throw new ArgumentException("connectionString is not null");
     16           }
     17           _providerFactory = ProviderFactory.GetDbProviderFactory(providerType);  //获取到生成的DbProviderFactory对象
     18           _connectionString = connectionString;
     19           if (_providerFactory == null)
     20           {
     21               throw new ArgumentException("can't build DbProviderFactory, please check DbProviderType ");
     22           }
     23       }
     24 
     25       /// <summary>
     26       /// 判断数据库是否可以打开
     27       /// </summary>
     28       /// <returns></returns>
     29       public bool CanOpen()
     30       {
     31             var dbConnection= _providerFactory.CreateConnection();
     32             dbConnection.ConnectionString = _connectionString;
     33             try
     34             {
     35                 dbConnection.Open(); //打开连接
     36                 return true;
     37 
     38             }
     39             catch (Exception ex)
     40             {
     41                 return false;
     42             }
     43             finally
     44             {
     45                 dbConnection.Close();  //关闭连接
     46             }
     47       }
     48 
     49       /// <summary>
     50       /// 
     51       /// </summary>
     52       /// <returns></returns>
     53       public DbConnection GetDbConnection()
     54       {
     55         var connection=  _providerFactory.CreateConnection();
     56         connection.ConnectionString = _connectionString;
     57         return connection;
     58       }
     59 
     60       /// <summary>
     61       /// 执行增删改的方法
     62       /// </summary>
     63       /// <param name="sqlString">sql语句</param>
     64       /// <param name="dbParameters">参数</param>
     65       /// <param name="commandType">执行方式,是Sql语句还是存储过程</param>
     66       /// <returns></returns>
     67       public int ExecuteNonQuery(string sqlString ,DbParameter[] dbParameters,CommandType commandType)
     68       {
     69           int result;
     70           using (DbConnection connection = GetDbConnection())
     71           {
     72               using (DbCommand command = CreateDbQueryCommand(connection, sqlString, dbParameters, commandType))
     73               {
     74                   connection.Open();
     75                   result= command.ExecuteNonQuery();
     76                   connection.Close();
     77               }
     78           }
     79 
     80           return result;
     81       }
     82 
     83 
     84       /// <summary>
     85       /// 执行查询语句,返回DataSet
     86       /// </summary>
     87       /// <param name="sqlString"></param>
     88       /// <param name="dbParameters"></param>
     89       /// <param name="commandType"></param>
     90       /// <returns></returns>
     91       public DataSet ExecuteQuery(string sqlString, DbParameter[] dbParameters, CommandType commandType)
     92       {
     93           DataSet dataSet=new DataSet();
     94           using (DbConnection connection = GetDbConnection())
     95           {
     96               using(DbDataAdapter adapter=_providerFactory.CreateDataAdapter())
     97               {
     98                   adapter.SelectCommand=CreateDbQueryCommand(connection,sqlString,dbParameters,commandType);
     99                   connection.Open();
    100                   adapter.Fill(dataSet);
    101                   connection.Close();
    102               }
    103           }
    104           return dataSet;
    105       }
    106 
    107       private DbCommand CreateDbQueryCommand(DbConnection connection, string sqlString, IDbDataParameter[] dbParameters, CommandType commandType)
    108       {
    109         return   CreateDbCommand(connection, sqlString, dbParameters, commandType, null);
    110       }
    111 
    112       /// <summary>
    113       /// 创建DbCommand对象
    114       /// </summary>
    115       /// <param name="connection">DbConnection对象</param>
    116       /// <param name="sqlString">查询语句</param>
    117       /// <param name="dbParameters">参数</param>
    118       /// <param name="commandType">类型</param>
    119       /// <param name="dbTransaction">事务</param>
    120       /// <returns></returns>
    121       public  DbCommand CreateDbCommand(DbConnection connection, string sqlString, IDbDataParameter[] dbParameters, CommandType commandType,DbTransaction dbTransaction)
    122       {
    123           DbCommand command = _providerFactory.CreateCommand();
    124           if (dbTransaction != null)
    125           {
    126               command.Transaction = dbTransaction;
    127           }
    128           command.CommandText = sqlString;
    129           command.CommandType = commandType;
    130           command.Connection = connection;
    131           if (dbParameters != null)
    132           {
    133               command.Parameters.AddRange(dbParameters);
    134           }
    135           return command;
    136       }
    137 
    138 
    139       /// <summary>
    140       /// 返回第一行第一列的数据,一般用于执行聚合操作的语句
    141       /// </summary>
    142       /// <param name="sqlString">查询语句</param>
    143       /// <param name="dbParameters">参数</param>
    144       /// <param name="commandType">Sql语句还是存储过程</param>
    145       /// <returns></returns>
    146       public object ExecuteScalar(string sqlString, DbParameter[] dbParameters, CommandType commandType)
    147       {
    148           object result;
    149           using (DbConnection connection = GetDbConnection())
    150           {
    151               using (DbCommand command = CreateDbQueryCommand(connection, sqlString, dbParameters, commandType))
    152               {
    153                   connection.Open();
    154                   result = command.ExecuteScalar();
    155                   connection.Close();
    156               }
    157           }
    158           return result;
    159       }

    方法的说明已经的很清楚了,有点Ado.net基础的同学应该都能看的懂。

    下面进入我们的测试阶段,在这儿我们重点以Sql Server做测试,也会测试一下Oracle数据库和SQLite数据库。

    首先我们创建一个TestDb的数据库,再创建一张Users表。

    我们在创建一个存储过程,该存过过程根据传进来的ID值,返回Name字段。

    下面是存储过程的代码:

    1 Create procedure [dbo].[GetUser]
    2  @id    varchar(30),
    3  @name varchar(30) output
    4  as
    5  begin
    6     select @name=name  from Users where id=@id
    7  end

    现在开始测试。

    首先我们先执行ExecuteQuery方法,该方法返回DataSet对象。

     1  var connectionString = @"Server=.;Initial Catalog=TestDB;User ID=sa;Password=123456;";
     2             DbHelper dbHelper = new DbHelper(connectionString, MyHelper.Define.DbProviderType.SqlServer);
     3             string text = "select * from users ";
     4 
     5             var usersDataSet = dbHelper.ExecuteQuery(text, null, CommandType.Text);
     6 
     7             for (int i = 0; i < usersDataSet.Tables[0].Rows.Count; i++)
     8             {
     9                 Console.WriteLine("ID:{0},名字:{1}", usersDataSet.Tables[0].Rows[i][0], usersDataSet.Tables[0].Rows[i][1]);
    10             }
    11 
    12 
    13             Console.ReadKey();

    结果:

    执行ExecuteScalar方法,这儿我们查询出Users这张表的总数量。

    1   var connectionString = @"Server=.;Initial Catalog=TestDB;User ID=sa;Password=123456;";
    2             DbHelper dbHelper = new DbHelper(connectionString, MyHelper.Define.DbProviderType.SqlServer);
    3             string text = "select  count(*) from  users ";
    4 
    5             var count = (int)dbHelper.ExecuteScalar(text, null, CommandType.Text);
    6             Console.WriteLine("总数量:" + count.ToString());
    7 
    8             Console.ReadKey();

    结果

    执行ExecuteNonQuery方法,在这儿我们执行带有返回参数的存储过程。

     1    var connectionString = @"Server=.;Initial Catalog=TestDB;User ID=sa;Password=123456;";
     2             DbHelper dbHelper = new DbHelper(connectionString, MyHelper.Define.DbProviderType.SqlServer);
     3             string text = "GetUser ";
     4             DbParameter[] parameters = new DbParameter[]
     5              {
     6                  new SqlParameter("@id", SqlDbType.VarChar){ Value="1"},
     7                  new SqlParameter("@name", SqlDbType.VarChar){ Direction=ParameterDirection.Output,Size=30}
     8              };
     9             dbHelper.ExecuteNonQuery(text, parameters, CommandType.StoredProcedure);
    10             Console.WriteLine("名字:" + parameters[1].Value);
    11 
    12             Console.ReadKey();

    上面的三种方法,我们都已经测试完成,没有任何问题。

    下面我们来替换使用其他数据库继续测试。

    Oracle数据库:

    在测试前需要在Nuget中加入Oracle.ManagedDataAccess程序集,否则会出现错误。

     

     

     

     

     1   var connectionString = @"Password=lisi;User ID=lisi;Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.229.138)
     2                                                     (PORT=1521)))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=MLDN)))";
     3             DbHelper dbHelper = new DbHelper(connectionString, MyHelper.Define.DbProviderType.Oracle);
     4             string text = "select * from users ";
     5 
     6             var usersDataSet = dbHelper.ExecuteQuery(text, null, CommandType.Text);
     7 
     8             for (int i = 0; i < usersDataSet.Tables[0].Rows.Count; i++)
     9             {
    10                 Console.WriteLine("ID:{0},名字:{1}", usersDataSet.Tables[0].Rows[i][0], usersDataSet.Tables[0].Rows[i][1]);
    11             }
    12 
    13 
    14             Console.ReadKey();

    结果

    OK,Oracle也没问题。

    下面试试看SQLite数据库。

    该方法也需要在Nuget中加入SQLite的的插件:

    如果不加入的话,会出现以下错误:

    在装好后,不一定能使用起来,还是出现以上错误

    则在Config文件DbProviderFactories节点中加入一段代码就可以了。

      <remove invariant="System.Data.SQLite"/>
          <add name="SQLite Data Provider" invariant="System.Data.SQLite" description=".Net Framework Data Provider for SQLite" type="System.Data.SQLite.SQLiteFactory, System.Data.SQLite" />

     

    代码:

     1      var connectionString = @"data source=mydb.db";
     2             DbHelper dbHelper = new DbHelper(connectionString, MyHelper.Define.DbProviderType.SQLite);
     3 
     4             //string text = "create table users(id varchar(20),name varchar(20)); ";
     5             //dbHelper.ExecuteNonQuery(text, null, CommandType.Text); //创建表
     6 
     7             //string sql1 = "insert into users values('1','zhangsan')";
     8             //string sql2 = "insert into users values('2','lisi')";
     9             //dbHelper.ExecuteNonQuery(sql1, null, CommandType.Text); //创建表
    10             //dbHelper.ExecuteNonQuery(sql2, null, CommandType.Text); //创建表
    11 
    12             string selectSql = "select * from users";
    13             var usersDataSet = dbHelper.ExecuteQuery(selectSql, null, CommandType.Text);
    14             for (int i = 0; i < usersDataSet.Tables[0].Rows.Count; i++)
    15             {
    16                 Console.WriteLine("ID:{0},名字:{1}", usersDataSet.Tables[0].Rows[i][0], usersDataSet.Tables[0].Rows[i][1]);
    17             }
    18 
    19             Console.ReadKey();

    在代码中我加入了创建表和插入数据的语句,该段代码被我注释了,如果想要测试的话,执行一次就可以了。

    以上初步测试了SQL Server,Oracle和SQLite三种数据库。

    参考文章:

    https://www.cnblogs.com/leleroyn/archive/2011/03/24/1993627.html

    https://www.cnblogs.com/gguozhenqian/p/4262813.html

    https://www.cnblogs.com/lifeil/archive/2013/04/16/3024161.html

     

     

     

     

     

     

     

     

     

    
    

     

    转载于:https://www.cnblogs.com/wujiadexingfu/p/8525722.html

    展开全文
  • 一个好用的数据库

    2008-05-14 08:36:06
    */ <br> /*下面的循环用于向列表框中插入数据, set.m_coldata是一个COL_DATA_ODBC的结构, 当含有当前行的数据值,数据值的长度信息,这样就实现了从记录集中取数据的功能。*/ int iRow = 0; while...
  • Flutter(二十八)——SQLite数据库

    千次阅读 2020-03-25 18:02:34
    本文目录前言sqflite依赖库sqflite基本用法获取和删除database创建数据库数据表插入数据修改数据查询数据删除数据计算总记录数关闭数据库 前言 做手机端应用开发人,都应该知道SQLite数据库,它是手机端上最...
  • 我们在使用oracle进行数据处理时候,有时需要对查询出来的记录进行锁定,禁止其他进程对这些记录进行修改操作。 oracle数据库提供了一种利用SELECTFOR UPDATE子句实现方法(可能sqlserver也这个功能,但是...
  • oracle数据库经典题目

    2011-02-17 15:05:20
    19.视图是一个表示表的数据数据库对象,它允许用户从一个表或一组表中通过一定的查询语句建立一个“虚表”。 20.序列是一种可被多个用户使用的用于产生一系列唯一数字的数据库对象。尤其适合多用户环境中,可以...
  • 其他说明:这套源码,已经对数据库进行优化,查询速度提升好几倍,500万条记录的mysql数据库完全无压力!并且,已经对PC站和WAP站模板重新整理优化,界面简洁大方,功能更完善更强大!程序采用08CMS v3.4最新版本,...
  • 通过作者历时3年写作,本书介绍了Oracle安装及卸载、数据库的启动关闭、表空间和数据文件管理、Oracle网络管理、口令文件管理、内存管理、进程管理、用户管理、数据的导入导出、备份与恢复、模式对象管理...
  • 通过作者历时3年写作,本书介绍了Oracle安装及卸载、数据库的启动关闭、表空间和数据文件管理、Oracle网络管理、口令文件管理、内存管理、进程管理、用户管理、数据的导入导出、备份与恢复、模式对象管理...
  • 1、**数据库读取增加查询读取时间间隔,查询一般是很消耗服务器资源,为了公平使用资源和保证服务端高性能。 2、**读取附件增加缓存记录,只要远端附件没有变化,读一次就不会反复读取,系统会自动加载缓存...
  • 现供职于支付宝(中国)网络技术有限公司,担任商业智能部门的数据仓库工程师.关注BI架构与设计、数据库和操作系统技术,常沉浸其中,偶所得亦欣然自喜.平时好读书,爬山,骑车,四处走走.愿行万里路,交天下朋友.  ...
  •  本书还提供了dba完成本职工作必备基本uniix、sql、pl/sql和数据建模知识,也给出了许多富有趣味性例子,通过这些实例详细、循序渐进地说明了oracle database 11g数据库的各个概念和特性。 作译者  Sam...
  • 数据库概述1.1 数据库概述什么是数据库数据库就是存储数据的仓库,其本质是一个文件系统,数据按照特定的格式将数据存储起来,用户可以对数据库的数据进行增加,修改,删除及查询操作一个小例子假设我们现在没有...
  • 当然,你可以将这个配置项设为1以外的值来换取更高的性能,但是在系统崩溃的时候,你将会丢失1秒的数据。 # 设为0的话,mysqld进程崩溃的时候,就会丢失最后1秒的事务。设为2,只有在操作系统崩溃或者断电的时候才会...
  • 因为这样可以避免 top的字段如果是逻辑索引的,查询的结果后实际表中的不一致(逻辑索引中的数据有可能和数据表中的不一致,而查询时如果处在索引则首先查询索引) 14、说明:前10条记录 select top 10 * form ...
  • 医药销售管理系统 数据库课程设计

    热门讨论 2009-07-05 18:26:53
    本系统采用C#和SQL SERVER相结合方法,所有数据信息储存都由数据库来完成,而这些数据信息调用由C#完成。系统采用C/S模式,与传统主机/终端模式和文件服务器相比,既能够降低对服务器要求要求,又能大大...
  • 由于“区块分割”从理论上,在边界上误差和错误必然发生,于是“区块分割管理法”要求把每一个区块和与它所有相邻的区块动态的作为一个相对较大的区域来管理:当在查询某一个区块内的数据的时候与他所有相邻的区块内...
  • 大量写,少量读,查询一般查询一个时间段的数据; MongoDB的固定集合很好的满足了这个需求,但是MongoDB占内存比较大,点儿火穿蚊子,小题大做的感觉。 WawaDB的思路是每写入1000条日志,在一个索引文件里记录下...
  • 数据库、主机、存储等领域丰富经验,主导了主机性能评估模型、数据库水平拆分、基于数据库日志解析的数据同步、基于ISCSI 的廉价存储等项目,目前专注于大规模数据的并行计算和存储、用户行为研究与风险控制领域...
  • 14.5.1 并行DDL和使用外部表的数据加载 567 14.5.2 并行DDL和区段截断 568 14.6 并行恢复 576 14.7 过程并行化 577 14.7.1 并行管道函数 578 14.7.2 DIY并行化 580 14.7.3 老式DIY并行化 583 14.8 小结 587 ...
  • 5.3.1 用Enterprise Manager Database Control进行透明的数据加密 196 5.3.2 用Database Control进行表空间加密 196 5.3.3 Policy Trend Overview 198 5.3.4 Database Control中的其他安全管理集成 199 5.4 UTL...
  • 一、查询数据库是否存在关联关系丢失数据。如果下面SQL语句查出有数据,则表明存在关联关系丢失情况。 SELECT BMI.FENTRYID , BMI.FINVPTYID , BM.FMasterId FROM T_BD_MATERIAL BM INNER JOIN T_BD_...

空空如也

空空如也

1 2 3 4 5 ... 10
收藏数 198
精华内容 79
关键字:

数据库查询有过修改记录的数据