数据集 数据源数据源如何选择MySQL

Posts - 90,
Articles - 0,
Comments - 498
求真、务实。
02:54 by wid, ... 阅读,
21分钟 MySQL 入门教程
MySQL的相关概念介绍
MySQL 为关系型数据库(Relational Database Management System), 这种所谓的"关系型"可以理解为"表格"的概念, 一个关系型数据库由一个或数个表格组成, 如图所示的一个表格:
表头(header): 每一列的名称;
列(row): 具有相同数据类型的数据的集合;
行(col): 每一行用来描述某个人/物的具体信息;
值(value): 行的具体信息, 每个值必须与该列的数据类型相同;
键(key): 表中用来识别某个特定的人\物的方法, 键的值在当前列中具有唯一性。
Windows下MySQL的配置
以 MySQL 5.1 免安装版为例, 下载 mysql-noinstall-5.1.69-win32.zip ( 官方下载页:
1. 将下载的 mysql-noinstall-5.1.69-win32.zip 解压至需要安装的位置, 如: C:\Program F
2. 在安装文件夹下找到 my-small.ini 配置文件, 将其重命名为 my.ini , 打开进行编辑, 在 [client] 与 [mysqld] 下均添加一行: default-character-set = gbk
3. 打开 Windows 环境变量设置, 新建变量名 MYSQL_HOME , 变量值为 MySQL 安装目录路径, 这里为 C:\Program Files\mysql-5.1.69-win32
4. 在 环境变量 的 Path 变量中添加 ;%MYSQL_HOME%\
5. 安装 MySQL 服务, 打开Windows命令提示符, 执行命令: mysqld --install MySQL --defaults-file="my.ini" 提示"Service successfully installed."表示成功;
MySQL服务的启动、停止与卸载
在 Windows 命令提示符下运行:
启动: net start MySQL
停止: net stop MySQL
卸载: sc delete MySQL
MySQL脚本的基本组成
与常规的脚本语言类似, MySQL 也具有一套对字符、单词以及特殊符号的使用规定, MySQL 通过执行 SQL 脚本来完成对数据库的操作, 该脚本由一条或多条MySQL语句(SQL语句 + 扩展语句)组成, 保存时脚本文件后缀名一般为 .sql。在控制台下, MySQL 客户端也可以对语句进行单句的执行而不用保存为.sql文件。
标识符用来命名一些对象, 如数据库、表、列、变量等, 以便在脚本中的其他地方引用。MySQL标识符命名规则稍微有点繁琐, 这里我们使用万能命名规则: 标识符由字母、数字或下划线(_)组成, 且第一个字符必须是字母或下划线。
对于标识符是否区分大小写取决于当前的操作系统, Windows下是不敏感的, 但对于大多数 linux\unix 系统来说, 这些标识符大小写是敏感的。
MySQL的关键字众多, 这里不一一列出, 在学习中学习。 这些关键字有自己特定的含义, 尽量避免作为标识符。
MySQL语句是组成MySQL脚本的基本单位, 每条语句能完成特定的操作, 他是由 SQL 标准语句 + MySQL 扩展语句组成。
MySQL函数用来实现数据库操作的一些高级功能, 这些函数大致分为以下几类: 字符串函数、数学函数、日期时间函数、搜索函数、加密函数、信息函数。
MySQL中的数据类型
MySQL有三大类数据类型, 分别为数字、日期\时间、字符串, 这三大类中又更细致的划分了许多子类型:
整数: tinyint、smallint、mediumint、int、bigint
浮点数: float、double、real、decimal
日期和时间: date、time、datetime、timestamp、year
字符串类型
字符串: char、varchar
文本: tinytext、text、mediumtext、longtext
二进制(可用来存储图片、音乐等): tinyblob、blob、mediumblob、longblob
这里不能详细对这些类型进行介绍了, 篇幅可能会很长, 详细介绍参见:
使用MySQL数据库
登录到MySQL
当 MySQL 服务已经运行时, 我们可以通过MySQL自带的客户端工具登录到MySQL数据库中, 首先打开命令提示符, 输入以下格式的命名:
mysql -h 主机名 -u 用户名 -p
-h : 该命令用于指定客户端所要登录的MySQL主机名, 登录当前机器该参数可以省略;
-u : 所要登录的用户名;
-p : 告诉服务器将会使用一个密码来登录, 如果所要登录的用户名密码为空, 可以忽略此选项。
以登录刚刚安装在本机的MySQL数据库为例, 在命令行下输入 mysql -u root -p 按回车确认, 如果安装正确且MySQL正在运行, 会得到以下响应:
Enter password:
若密码存在, 输入密码登录, 不存在则直接按回车登录, 按照本文中的安装方法, 默认 root 账号是无密码的。登录成功后你将会看到 Welecome to the MySQL monitor... 的提示语。
然后命令提示符会一直以 mysql& 加一个闪烁的光标等待命令的输入, 输入 exit 或 quit 退出登录。
创建一个数据库
使用 create database 语句可完成对数据库的创建, 创建命令的格式如下:
create database 数据库名 [其他选项];
例如我们需要创建一个名为 samp_db 的数据库, 在命令行下执行以下命令:
create database samp_
为了便于在命令提示符下显示中文, 在创建时通过 character set gbk 将数据库字符编码指定为 gbk。创建成功时会得到 Query OK, 1 row affected(0.02 sec) 的响应。
注意: MySQL语句以分号(;)作为语句的结束, 若在语句结尾不添加分号时, 命令提示符会以 -& 提示你继续输入(有个别特例, 但加分号是一定不会错的);
提示: 可以使用 命令查看已经创建了哪些数据库。
选择所要操作的数据库
要对一个数据库进行操作, 必须先选择该数据库, 否则会提示错误:
ERROR ): No database selected
两种方式对数据库进行使用的选择:
一: 在登录数据库时指定, 命令: mysql -D 所选择的数据库名 -h 主机名 -u 用户名 -p
例如登录时选择刚刚创建的数据库: mysql -D samp_db -u root -p
二: 在登录后使用 use 语句指定, 命令: use 数据库名;
use 语句可以不加分号, 执行 use samp_db 来选择刚刚创建的数据库, 选择成功后会提示: Database changed
创建数据库表
使用 create table 语句可完成对表的创建, create table 的常见形式:
create table 表名称(列声明);
以创建 students 表为例, 表中将存放 学号(id)、姓名(name)、性别(sex)、年龄(age)、联系电话(tel) 这些内容:
create table students
id int unsigned not null auto_increment primary key,
name char(8) not null,
sex char(4) not null,
age tinyint unsigned not null,
tel char(13) null default "-"
对于一些较长的语句在命令提示符下可能容易输错, 因此我们可以通过任何文本编辑器将语句输入好后保存为 createtable.sql 的文件中, 通过命令提示符下的文件重定向执行执行该脚本。
打开命令提示符, 输入: mysql -D samp_db -u root -p & createtable.sql
(提示: 1.如果连接远程主机请加上 -h 指令; 2. createtable.sql 文件若不在当前工作目录下需指定文件的完整路径。)
create table tablename(columns) 为创建数据库表的命令, 列的名称以及该列的数据类型将在括号内完成;
括号内声明了5列内容, id、name、sex、age、tel为每列的名称, 后面跟的是数据类型描述, 列与列的描述之间用逗号(,)隔开;
以 "id int unsigned not null auto_increment primary key" 行进行介绍:
"id" 为列的名称;
"int" 指定该列的类型为 int(取值范围为 -88607), 在后面我们又用 "unsigned" 加以修饰, 表示该类型为无符号型, 此时该列的取值范围为 0到;
"not null" 说明该列的值不能为空, 必须要填, 如果不指定该属性, 默认可为空;
"auto_increment" 需在整数列中使用, 其作用是在插入数据时若该列为 NULL, MySQL将自动产生一个比现存值更大的唯一标识符值。在每张表中仅能有一个这样的值且所在列必须为索引列。
"primary key" 表示该列是表的主键, 本列的值必须唯一, MySQL将自动索引该列。
下面的 char(8) 表示存储的字符长度为8, tinyint的取值范围为 -127到128, default 属性指定当该列值为空时的默认值。
更多的数据类型请参阅
提示: 1. 使用 命令可查看已创建了表的名称; 2. 使用 describe 表名; 命令可查看已创建的表的详细信息。
操作MySQL数据库
向表中插入数据
insert 语句可以用来将一行或多行数据插到数据库表中, 使用的一般形式如下:
insert [into] 表名 [(列名1, 列名2, 列名3, ...)] values (值1, 值2, 值3, ...);
其中 [] 内的内容是可选的, 例如, 要给 samp_db 数据库中的 students 表插入一条记录, 执行语句:
insert into students values(NULL, "王刚", "男", 20, "");
按回车键确认后若提示 Query Ok, 1 row affected (0.05 sec) 表示数据插入成功。 若插入失败请检查是否已选择需要操作的数据库。
有时我们只需要插入部分数据, 或者不按照列的顺序进行插入, 可以使用这样的形式进行插入:
insert into students (name, sex, age) values("孙丽华", "女", 21);
查询表中的数据
select 语句常用来根据一定的查询规则到数据库中获取数据, 其基本的用法为:
select 列名称 from 表名称 [查询条件];
例如要查询 students 表中所有学生的名字和年龄, 输入语句 select name, 执行结果如下:
mysql& select name,
+--------+-----+
+--------+-----+
| 孙丽华 |
| 王永恒 |
| 郑俊杰 |
| 张伟朋 |
+--------+-----+
6 rows in set (0.00 sec)
也可以使用通配符 * 查询表中所有的内容, 语句: select *
按特定条件查询:
where 关键词用于指定查询条件, 用法形式为: select 列名称 from 表名称 where 条件;
以查询所有性别为女的信息为例, 输入查询语句: select * from students where sex="女";
where 子句不仅仅支持 "where 列名 = 值" 这种名等于值的查询形式, 对一般的比较运算的运算符都是支持的, 例如 =、&、&、&=、&、!= 以及一些扩展运算符 is [not] null、in、like 等等。 还可以对查询条件使用 or 和 and 进行组合查询, 以后还会学到更加高级的条件查询方式, 这里不再多做介绍。
查询年龄在21岁以上的所有人信息: select * from students where age & 21;
查询名字中带有 "王" 字的所有人信息: select * from students where name like "%王%";
查询id小于5且年龄大于20的所有人信息: select * from students where id&5 and age&20;
更新表中的数据
update 语句可用来修改表中的数据, 基本的使用形式为:
update 表名称 set 列名称=新值 where 更新条件;
将id为5的手机号改为默认的"-": update students set tel=default where id=5;
将所有人的年龄增加1: update students set age=age+1;
将手机号为
的姓名改为 "张伟鹏", 年龄改为 19: update students set name="张伟鹏", age=19 where tel="";
删除表中的数据
delete 语句用于删除表中的数据, 基本用法为:
delete from 表名称 where 删除条件;
删除id为2的行: delete from students where id=2;
删除所有年龄小于21岁的数据: delete from students where age&20;
删除表中的所有数据:
创建后表的修改
alter table 语句用于创建后对表的修改, 基础用法如下:
基本形式: alter table 表名 add 列名 列数据类型 [after 插入位置];
在表的最后追加列 address: alter table students add address char(60);
在名为 age 的列后插入列 birthday: alter table students add bir
基本形式: alter table 表名 change 列名称 列新名称 新数据类型;
将表 tel 列改名为 telphone: alter table students change tel telphone char(13) default "-";
将 name 列的数据类型改为 char(16): alter table students change name name char(16)
基本形式: alter table 表名 drop 列名称;
删除 birthday 列: alter table st
基本形式: alter table 表名 rename 新表名;
重命名 students 表为 workmates: alter table stude
删除整张表
基本形式: drop table 表名;
示例: 删除 workmates 表:
删除整个数据库
基本形式: drop database 数据库名;
示例: 删除 samp_db 数据库: drop database samp_
修改 root 用户密码
按照本文的安装方式, root 用户默认是没有密码的, 重设 root 密码的方式也较多, 这里仅介绍一种较常用的方式。
使用 mysqladmin 方式:
打开命令提示符界面, 执行命令: mysqladmin -u root -p password 新密码
执行后提示输入旧密码完成密码修改, 当旧密码为空时直接按回车键确认即可。
可视化管理工具 MySQL Workbench
尽管我们可以在命令提示符下通过一行行的输入或者通过重定向文件来执行mysql语句, 但该方式效率较低, 由于没有执行前的语法自动检查, 输入失误造成的一些错误的可能性会大大增加, 这时不妨试试一些可视化的MySQL数据库管理工具, MySQL Workbench 就是 MySQL 官方 为 MySQL 提供的一款可视化管理工具, 你可以在里面通过可视化的方式直接管理数据库中的内容, 并且 MySQL Workbench 的 SQL 脚本编辑器支持语法高亮以及输入时的语法检查, 当然, 它的功能强大, 绝不仅限于这两点。
MySQL Workbench官方介绍:
MySQL Workbench 下载页:
--------------------EF添加ADO.NET实体模型处直接选择Mysql数据源
最近想到EF是连接多数据库的orm框架,于是就想测试下。查了一堆网上资料后,测试连接mysql成功。步骤如下:
1、在你项目Model层中nuget安装MySql.Data.Entity
如果没安装这个provider 就进行下面的步骤。就会出现:
2、MySql官网下载mysql-installer-community-5.7.13.0
我这边是没安装过mysql,所以是安装全部,第一个选项,MySql Installer。主要目的除了安装mysql,就是安装mysql对于vs的数据源驱动,便于我们在新建ADO.NET实体模型的时候,选择对应的数据源(MySQL Database)。
3、安装好后,我这个传说中的window程序员必须要下个图形化管理界面。
然后里面新建个数据库,测试用。
4、接下来就可以进行测试啦~~~
首先在VS中新建个类库,这个不多说了,新建项目--&ADO.NET实体模型
更改数据源
选择MySQL Database
Server name:localhost
用户名密码就不多说了。
然后就开始选择表进行实体映射,然后问题就出来了~~~
很奇怪哦,我们压根没这个TableDetails这个表,又哪儿来的主键类型为null。
百度!无所不能的网友给出了个解决问题的网址&&&stakoverflow:
老外回答简洁,靠谱。
根据这回答咋操作呢?直接扔截图吧。
打开mysql的cmd窗口
set global optimizer_switch='derived_merge=OFF';
问题解决~~~~
这里注意(对于不熟悉mysql命令行的同志,比如我):结尾一定加分号!!!
上文测试用的数据库test下的school表就映射成功勒
提问:对于oracle,postgresql,这些数据库我也下载了,可能选择更改数据源的时候没有出来这些选项,这是需要我们单独去安装的吗?哪儿安装?找不到....
&相关节点配置(个人纪录):
1、UI的webconfig配置数据库连接字符串肯定是少不了的。(连接字符串在我们Model层创建ADO.NET实体模型的时候就自动生成在了Model层的APPCONFIG中,拷贝过来即可)
&connectionStrings&
&!--mysql的数据库连接字符串--&
&add name="MysqlEntities" connectionString="metadata=res://*/ModelMysql.csdl|res://*/ModelMysql.ssdl|res://*/ModelMysql.provider=MySql.Data.MySqlCprovider connection string="server=user id=password=persistsecurityinfo=Tdatabase=test"" providerName="System.Data.EntityClient" /&
&/connectionStrings&
2、nuget安装MySql.Data.Entity只需在Model层中进行,但是跟连接字符串一样,得再webconfig中定义一个节点,节点里面写路径方便程序去读取相关信息。
在entityFramework节点下添加MySql.Data.MySqlClient(System.Data.SqlClient是我们在UI nuget EntityFramework的时候自动加载的,sqlserver的驱动信息)
MySql.Data.MySqlClient同样我们在Model层nuget&MySql.Data.Entity后就加进了APPCONFIG中,拷贝到UI的webconfig即可。(若嫌麻烦,就直接在UI层也nuget&MySql.Data.Entity,节点就自动加上去了)
&entityFramework&
&defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework"&
&parameters&
&parameter value="mssqllocaldb" /&
&/parameters&
&/defaultConnectionFactory&
&providers&
&provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" /&
&provider invariantName="MySql.Data.MySqlClient" type="MySql.Data.MySqlClient.MySqlProviderServices, MySql.Data.Entity.EF6, Version=6.9.8.0, Culture=neutral, PublicKeyToken=cc44d" /&
&/providers&
&/entityFramework&
如果您认为这篇文章还不错或者有所收获,可以点击右下角的【推荐】按钮,因为你的支持是我继续写作,分享的最大动力!
声明:本博客原创文字只代表本人工作中在某一时间内总结的观点或结论。非商业,未授权,贴子请以现状保留,转载时必须保留此段声明,且在文章页面明显位置给出原文连接。
阅读(...) 评论()net 数据库连接详解 相当经典啊 - moss_tan_jun - 博客园
posts - 443, comments - 156, trackbacks - 0, articles - 0
& ADO.NET与抽水的故事
ADO.NET是微软新一代.NET数据库的访问架构,ADO是ActiveX Data Objects的缩写。ADO.NET是数据库应用程序和数据源之间沟通的桥梁,主要提供一个面向对象的数据访问架构,用来开发数据库应用程序。
5.1.1& ADO.NET的定义
ADO.NET是为.NET框架而创建的,它提供对 Microsoft SQL Server、Oracle等数据源及通过OLE DB和XML公开的数据源的一致访问。应用程序可以使用ADO.NET来连接到这些数据源,并检索、操作和更新数据。ADO.NET是对Microsoft ActiveX Data Objects(ADO)的一个跨时代的改进,是一种全新的数据访问方法,是一项新技术、新设计。它提供了平台互用性和可伸缩的数据访问。由于传送的数据都是XML格式的,因此任何能够读取XML格式的应用程序都可以进行数据处理。事实上,接受数据的组件不一定要是ADO .NET组件,它可以是一个基于Microsoft Visual Studio的解决方案,也可以是任何运行在其他平台上的应用程序。
简单地讲,ADO.NET是用于和数据源打交道的.NET技术,是一组向 .NET 程序员公开数据访问服务的类。ADO.NET提供了一个统一的编程模式和一组公用的类来进行任何类型的数据访问,而不管你用何种语言来开发代码。
ADO.NET有两个重要组成部分:.NET数据提供程序(.NET Data Provider)和数据集(DataSet)。
1..NET数据提供程序(.NET Data Provider)
.NET数据提供程序是一个类集,用于连接到数据库、执行命令和检索结果。可以直接处理检索到的结果,或将其放入DataSet对象中。它可以被认为是数据库与应用程序的一个接口件或中间件。由于现在使用的数据源有多种(SQL Server、OLEDB 、ODBC 、Oracle),在编写应用程序的时候就要针对不同的数据源编写不同的接口代码,这很麻烦,效率也不高,针对这一问题Data Provider向上(应用程序)提供了统一的编程模型,向下(数据源)提供了多种数据源的接口,这样一来就可以使应用程序不需关心什么数据源,即对数据源进行了屏蔽,其好处是无论什么样的数据源,对于应用程序来说都只需提供一种编程模式即可。
针对不同的数据源,目前在.NET平台中包含如下.NET数据提供程序。
l&&&&&&&& SQL Server .NET数据提供程序:提供专门针对SQL Server 7.0版或更高版本的数据访问。使用 System.Data.SqlClient 命名空间。
l&&&&&&&& OLEDB .NET数据提供程序:适合于使用 OLE DB 公开的数据源。使用 System.Data.OleDb 命名空间。
l&&&&&&&& ODBC .NET数据提供程序:针对一些老式的数据源的访问。
l&&&&&&&& Oracle .NET数据提供程序:针对Oracle数据库的访问(需要Oracle Client的支持)。
l&&&&&&&& MySQL .NET数据提供程序:针对MySQL的数据访问(需要MySQL&Connector/Net 的支持)。
l&&&&&&&& SQLite .NET数据提供程序(非官方,由提供)。
l&&&&&&&& PostgreSQL .NET数据提供程序(非官方,由pgfoundry.org/projects/npgsql提供)。
OLE DB 是一种技术标准,目的是提供一种统一的数据访问接口,这里所说的“数据”,除了标准的关系型数据库中的数据之外,还包括邮件数据、Web 上的文本或图形、目录服务(Directory Services),以及主机系统中的IMS 和VSAM 数据。OLE DB 标准的核心内容就是要求对以上这些各种各样的数据存储提供一种相同的访问接口,使得数据的使用者(应用程序)可以使用同样的方法访问各种格式的数据,而不用考虑数据的具体存储地点、格式或类型。
使用OLE DB的方法可以通过新建一个后缀是udl的文本文件进行编辑,如图5-1所示。
图5-1& OLE DB设置
虽然OLE DB .NET数据提供程序可以访问任何数据源且比较通用,但专门针对特定数据库类型设计的.NET数据提供程序(如SQL Server .NET数据提供程序、Oracle .NET数据提供程序)具有相应的性能优化设计,相比之下OLE DB .NET数据提供程序的访问速度更慢。所以,建议能尽量用特定的数据提供程序的就尽量用数据提供程序。
.NET数据提供程序有以下几个核心对象。
l&&&&&&&& Connection 对象:用于连接数据源。
l&&&&&&&& Command 对象:对数据源执行命令。
l&&&&&&&& DataReader 对象:在只读和只写的连接模式下从数据源读取数据。
l&&&&&&&& DataAdapter 对象:从数据源读取数据并使用所读取的数据填充数据集对象。
所有.NET数据提供程序都实现了这几个对象各自的版本,附加了它们各自的前缀。
2.数据集(DataSet)
DataSet专门为独立于任何数据源的数据访问而设计。因此,它可以用于多种不同的数据源,用于XML数据,或用于管理应用程序本地的数据。DataSet包含一个或多个对象的集合,这些对象由数据行和数据列,以及有关DataTable对象中数据的主键、外键、约束和关系信息组成。
我们可以看一下ADO.NET的多数据库连通性的特点,如图5-2所示。
图5-2& ADO.NET的多数据库连通性
多个类型数据库,上层共享单一DataSet对象,实现单应用程序下多数据库底层支持。
本章不再使用大量篇幅来阐述ADO.NET的原理细节,而从实际项目应用的角度言简意赅地说明ADO.NET的使用方法和常见问题。
5.1.2& 趣味理解ADO.NET对象模型
为了更好地理解ADO.NET的架构模型的各个组成部分,我们可以对ADO.NET中的相关对象进行图示理解,如图5-3所示的是ADO.NET中数据库对象的关系图。
图5-3& ADO.NET对象模型
我们可以用趣味形象化的方式理解ADO.NET对象模型的各个部分,如图5-4所示,可以看出这些对象所处的地位和对象间的逻辑关系。
图5-4& ADO.NET趣味理解图
对比ADO.NET的数据库对象的关系图,我们可以用对比的方法来形象地理解每个对象的作用,如图5-4所示。
l&&&&&&&& 数据库好比水源,存储了大量的数据。
l&&&&&&&& Connection好比伸入水中的进水笼头,保持与水的接触,只有它与水进行了“连接”,其他对象才可以抽到水。
l&&&&&&&& Command则像抽水机,为抽水提供动力和执行方法,通过“水龙头”,然后把水返给上面的“水管”。
l&&&&&&&& DataAdapter、DataReader就像输水管,担任着水的传输任务,并起着桥梁的作用。二者是有不同的,后面章节中将详细介绍。
l&&&&&&&& DataSet则是一个大水库,把抽上来的水按一定关系的池子进行存放。即使撤掉“抽水装置”(断开连接,离线状态),也可以保持“水”的存在。这也正是ADO.NET的核心。
l&&&&&&&& DataTable则像水库中的每个独立的水池子,分别存放不同种类的水。一个大水库由一个或多个这样的水池子组成。
5.1.3& 进水笼头——建立Connection
Connection表示与数据源之间的连接。可根据Connection对象的各种不同属性来指定数据源的类型、位置及其他属性,可用它来与数据库建立连接或断开连接。其他对象如DataAdapter和Command对象通过它与数据库通信。根据.NET Framework 数据提供程序的不同,也有几种不同的Connection,如针对SQL Server的SqlConnection、针对Oracle的OracleConnection、针对MySQL的MySqlConnection、针对OLEDB的OleDbConnection等。(本节代码示例位置:光盘\code\ch05\01)
1.用SqlConnection连接SQL Server
(1)加入命名空间:
using System.Data.SqlC
(2)连接数据库:
string conString = "data source=127.0.0.1;Database=user id=password=";
SqlConnection myConnection = new SqlConnection(conString);
myConnection.Open();
2.用OracleConnection连接Oracle
首先添加OracleClient的引用,如图5-5所示。
图5-5& 添加OracleClient的引用
(1)加入命名空间:
using System.Data.OracleC
(2)连接数据库:
string conString = "Data Source=User ID=Password=user123";
OracleConnection myConnection = new OracleConnection(conString);
myConnection.Open();
3.用MySqlConnection连接MySQL
在.NET中连接MySQL数据库有两种方法:MySQL Connector/ODBC 和 MySQL Connector/NET,ODBC连接器是符合ODBC标准的交互平台,是.NET访问MySQL数据库的最好的选择。
首先,我们下载安装MySql-connector-net-5.1.5.Data.msi这个组件。如果是默认安装,则可以在C:\Program Files\MySQL\MySQL Connector Net 5.1.5\Binaries\.NET 2.0(这里安装的是MySQL Connector/Net 5.1.5,老的1.1版本是:C:\Program Files\MySQL\MySQL Connector Net 1.0.4\bin\.NET 1.1\)中找到MySql.Data.dll,将该文件复制到项目的bin目录下。
然后在项目引用中添加MySql.Data.dll的引用,如图5-6所示。
图5-6& 添加MySql.Data.dll的引用
实现代码如下。
(1)加入命名空间:
using MySql.Data.MySqlC
(2)连接数据库:
string conString = "server=127.0.0.1;database=user id=password=123";
MySqlConnection myConnection = new MySqlConnection(conString);
myConnection.Open();
4.用OleDbConnection连接各种数据源
由于数据源不同,相应的连接字符串也会不同。
(1)加入命名空间:
using System.Data.OleDb;
(2)连接SQL Server:
string conString = " Provider=SQLOLEDB.1;Persist Security Info=F
&&&&&&& User ID=Database=CData Source=COMPUTER";
OleDbConnection myConnection = new OleDbConnection(conString);
myConnection.Open();
(3)连接Access(可通过建立.udl文件来获得字符串):
string conString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source
=C:\\Database1.Persist Security Info=False";
(4)连接Oracle(也可通过OracleConnection连接):
string conString = "Provider=MSDAORA.1;User ID= Password=123;
Data Source=Persist Security Info=False";
从以上几个对象实例对比来看,几个.NET数据提供程序组件模型的基本编程模式相同,只是组件对象的前缀有所区别,正是这种统一编程模型,让我们在做不同类型数据库开发时,变得非常简单。
5.1.4& 抽水机——Command
Command对象封装了与用户想要完成的动作相关的数据库命令。在一般情况下这些命令就是SQL语句。
1.构造SqlCommand
(1)初始化SqlCommand类的新实例。
string conString = "data source=127.0.0.1;Database=user id=
&&&&&&& password=";
SqlConnection myConnection = new SqlConnection(conString);
&&&&&&&&&&&
SqlCommand myCommand = new SqlCommand();
myCommand.Connection = myC
mandText = "update P_Product set Name='电脑1' where Id=52";
myConnection.Open();
int rows = myCommand.ExecuteNonQuery();
myConnection.Close();
(2)初始化具有查询文本的 SqlCommand 类的新实例。
string conString& = "data source=127.0.0.1;Database=user id=
&&&&&&& password=";
SqlConnection myConnection = new SqlConnection(conString );
string strSql = "update P_Product set Name='电脑2' where Id=52";
SqlCommand myCommand = new SqlCommand(strSql);
myCommand.Connection = myC&&&&&&&&&&
myConnection.Open();
int rows = myCommand.ExecuteNonQuery();
myConnection.Close();
(3)初始化具有查询文本和 SqlConnection 的SqlCommand类实例。
string conString& = "data source=127.0.0.1;Database=user id=
&&&&&&& password=";
SqlConnection myConnection = new SqlConnection(conString );
string strSql = "update P_Product set Name='电脑3' where Id=52";
SqlCommand myCommand = new SqlCommand(strSql, myConnection);
myConnection.Open();
int rows = myCommand.ExecuteNonQuery();
myConnection.Close();
(4)初始化具有查询文本、SqlConnection 和 Transaction 的 SqlCommand 类实例。
string conString& = "data source=127.0.0.1;Database=user id=
&&&&&&& password=";
SqlConnection myConnection = new SqlConnection(conString );
string strSql = "update P_Product set Name='电脑4' where Id=52";
string strSql2 = "update P_Product set Name='数码4' where Id=53";
myConnection.Open();
SqlTransaction myTrans = myConnection.BeginTransaction();
SqlCommand myCommand = new SqlCommand(strSql, myConnection, myTrans);
&&& int rows = myCommand.ExecuteNonQuery();
&&& mandText = strSql2;
&&& rows = myCommand.ExecuteNonQuery();
&&& mit();
&&& myConnection.Close();
&&& myTrans.Rollback();&&&&&&&&&&&&&&&
2.建立SqlCommand与SqlConnection的关联
myCommand.Connection = myC
SqlCommand myCommand = myConnection.CreateC
3.设置SqlCommand的查询文本
mandText = "SELECT * FROM P_Product ";
//或者第2种构造:
SqlCommand myCommand = new SqlCommand(strSql);
4.执行命令
SqlCommand方法如表5-1所示。
表5-1& SqlCommand方法
ExecuteReader
返回一行或多行。多用于SELECT查询数据
ExecuteNonQuery
对Connection 执行 SQL 语句,并返回受影响的行数(int),多用于INSERT、UPDATE、DELETE、CREATE等操作
ExecuteScalar
返回单个值。返回结果集中第一行的第一列。忽略额外的列或行
ExecuteXmlReader
将 CommandText 发送到 Connection 并生成一个 XmlReader 对象
string conString = "data source=127.0.0.1;Database=user id=
&&&&&&& password=";
SqlConnection myConnection = new SqlConnection(conString);
SqlCommand cmd = myConnection.CreateCommand();
mandText = "SELECT * FROM P_Product";
myConnection.Open();
SqlDataReader dr = cmd.ExecuteReader();
//SqlDataReader dr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
while (dr.Read())//循环读取数据
&&& Response.Write(dr.GetInt32(0).ToString() + ", " + dr.GetString(1) +
&&&&&&&&&&&& "&br&");
dr.Close();
myConnection.Close();
string conString = "data source=127.0.0.1;Database=user id=
&& password=";
SqlConnection myConnection = new SqlConnection(conString);
string strSql = "select count(*) from P_Product";
SqlCommand myCommand = new SqlCommand(strSql, myConnection);
myConnection.Open();
int count = (int)myCommand.ExecuteScalar();
myConnection.Close();
Response.Write(count);
很多数据库支持将多条命令合并或批处理成一条单一命令执行。例如,SQL Server使你可以用分号“;”分隔命令。将多条命令合并成单一命令,能减少到服务器的行程数,并提高应用程序的性能。例如,可以将所有预定的删除在应用程序中本地存储起来,然后再发出一条批处理命令调用,从数据源删除它们。
虽然这样做确实能提高性能,但是当对DataSet中的数据更新进行管理时,可能会增加应用程序的复杂性。要保持简单,需要在DataSet中为每个DataTable创建一个DataAdapter。
使用SqlCommand执行存储过程的快速提示:如果调用存储过程,则需将SqlCommand的CommandType属性指定为StoredProcedure。这样在将该命令显式标识为存储过程时,就不需要在执行之前分析命令了。
5.1.5& 输水管——DataAdapter
DataAdapter提供连接DataSet对象和数据源的桥梁。DataAdapter使用Command对象在数据源中执行SQL命令,以便将数据加载到DataSet中,并使DataSet中数据的更改与数据源保持一致。
DataAdapter就像一根输水管,通过发动机,把水从水源输送到水库里进行保存。
1.创建SqlDataAdapter
(1)初始化SqlDataAdapter类的新实例。
string conString = "data source=127.0.0.1;Database=user id=
&&&&&&& password=";
SqlConnection myConnection = new SqlConnection(conString);
SqlCommand cmd = myConnection.CreateCommand();
mandText = "SELECT * FROM P_Product";
DataSet ds = new DataSet();
myConnection.Open();
SqlDataAdapter adapter = new SqlDataAdapter();
adapter.SelectCommand =
adapter.Fill(ds, "ds");
myConnection.Close();
(2)使用指定的 SqlCommand 初始化 SqlDataAdapter 类的新实例。
string conString = "data source=127.0.0.1;Database=user id=
&&&&&&& password=";
SqlConnection myConnection = new SqlConnection(conString);
DataSet ds = new DataSet();
SqlCommand cmd = myConnection.CreateCommand();
mandText = "SELECT * FROM P_Product";
myConnection.Open();
SqlDataAdapter adapter = new SqlDataAdapter(cmd);
adapter.Fill(ds, "ds");
myConnection.Close();
(3)使用selectcommand字符串 和 SqlConnection对象初始化SqlDataAdapter 类的新实例。
string conString = "data source=127.0.0.1;Database=user id=
password=";
string strSQL = "SELECT * FROM P_Product";
SqlConnection myConnection = new SqlConnection(conString);
DataSet ds = new DataSet();
myConnection.Open();
SqlDataAdapter adapter = new SqlDataAdapter(strSQL, myConnection);
adapter.Fill(ds, "ds");
myConnection.Close();
(4)使用selectcommand字符串和一个连接字符串初始化SqlDataAdapter类的新实例。
string conString = "data source=127.0.0.1;Database=user id=
password=";
string strSQL = "SELECT * FROM P_Product";&&&&&&&&&&&
DataSet ds = new DataSet();&&&&&&&&&&&
SqlDataAdapter adapter = new SqlDataAdapter(strSQL, conString);
adapter.Fill(ds, "ds");
2.DataAdapter和SqlConnection、SqlCommand建立关联
方式1:DataAdapter在构造参数时建立。
方式2:通过SelectCommand属性建立。
SqlDataAdapter adapter = new SqlDataAdapter();
adapter.SelectCommand = new SqlCommand(strSQL, myConnection);
5.1.6& 输水管——DataReader
通过执行ExecuteReader方法可以返回一个DataReader 对象。DataReader以只进、只读方式返回数据,从而提高应用程序的性能。这样可以节省 DataSet 所使用的内存,并省去创建 DataSet 并填充其内容所需的处理。
DataReader 也是一种水管,和DataAdapter不同的是,DataReader不把水输送到水库里面,而是单向地直接把水送到需要水的用户那里或田地里,所以要比在水库中转一下更快。
(1)遍历DataReader结果集。
SqlDataReader dr = cmd.ExecuteReader();&&&&&&&&&&&
while (dr.Read())
&&& Response.Write(dr.GetInt32(0).ToString()+ ", "+ dr.GetString(1) + "&br&");
dr.Close();
(2)使用序数索引器。
SqlDataReader dr = cmd.ExecuteReader();
while (dr.Read())
&&& Response.Write(dr[0].ToString() + ", " + dr[1].ToString() + "&br&");
dr.Close();
(3)使用列名索引器。
SqlDataReader dr = cmd.ExecuteReader();
while (dr.Read())
&&& Response.Write(dr["ProductId"].ToString()+", "+dr["Name"].ToString());
dr.Close();
(4)使用类型访问器。
public char GetChar(int i); 获取指定列的单个字符串形式的值
public DateTime GetDateTime(int i); 获取指定列的 DateTime 对象形式的值
public short GetInt16(int i); 获取指定列的 16 位有符号整数形式的值
public string GetString(int i); 获取指定列的字符串形式的值
(5)得到DataReader的列信息。
dr.FieldCount&&&& 获取当前行中的列数
dr.GetFieldType(序号)&& 获取是对象的数据类型的 Type
dr.GetDataTypeName(序号)& 获取源数据类型的名称
dr.GetName(序号)&&&& 获取指定列的名称
dr.GetOrdinal(序号)&& 在给定列名称的情况下获取列序号
(6)得到数据表的信息。
DataTable dt=dr.GetSchemaTable();
(7)操作多个结果集。
SqlDataReader dr = cmd.ExecuteReader();&&&&
&&& while (dr.Read())
&&&&&&& Response.Write(dr.GetInt32(0).ToString()+", "+dr.GetString(1));
while(myReader.NextResult());//使数据读取器前进到下一个结果集
dr.Close();
下面是一些使用DataReader获得最佳性能的技巧。
l&&&&&&&& 在使用带参数的Command前,必须关闭DataReader。
l&&&&&&&& 完成读数据之后一定要关闭DataReader。如果使用Connection只返回DataReader,那么关闭DataReader之后立刻关闭它。另外一个显式关闭Connection的方法是将CommandBehavior.CloseConnection传递给ExecuteReader方法,以确保关闭DataReader时相应的连接也被关闭。如果从一个方法返回DataReader,而且不能控制DataReader的相关连接的关闭,则这样做特别有用。
l&&&&&&&& 不能在层之间远程访问DataReader。DataReader是为已连接好的数据访问而设计的。
l&&&&&&&& 当访问列数据时,使用类型化访问器,例如GetString、GetInt32等。这使你不用将GetValue返回的Object强制转换成特定类型。
l&&&&&&&& 一个单一连接每次只能打开一个DataReader。如果想在相同的数据存储区上同时打开两个DataReader,则必须显式创建两个连接,每个DataReader一个。这是ADO.NET为池化连接的使用提供更多控制的一种方法。
l&&&&&&&& 在默认情况下,DataReader每次Read时都要将整行加载到内存。这允许在当前行内随机访问列。如果不需要这种随机访问,为了提高性能,则将CommandBehavior.SequentialAccess传递给ExecuteReader调用。这将DataReader的默认行为更改为仅在请求时将数据加载到内存。注意,CommandBehavior. SequentialAccess要求顺序访问返回的列。也就是说,一旦读过返回的列,就不能再读它的值了。
l&&&&&&&& 如果已经读取了来自DataReader的数据,但仍然有大量挂起的未读结果,则在关闭DataReader之前先要取消Command。因为取消Command可使服务器放弃这些结果,从而释放服务器的资源。
5.1.7& 随用随关,释放资源
对于C#程序员来说,确保始终关闭Connection和DataReader对象的一个方便的方法就是使用using语句。using语句在离开自己的作用范围时,会自动调用被“使用”的对象的Dispose。例如:
string connectionString = "data source=127.0.0.1;Database=
user id=password=";
using (SqlConnection myConnection = new SqlConnection(connectionString))
&&& SqlCommand cmd = myConnection.CreateCommand();
&&& mandText = "SELECT * FROM P_Product";
&&& myConnection.Open();
&&& using (SqlDataReader dr = cmd.ExecuteReader())
&&&&&&& while (dr.Read())
&&&&&&&&&&& Response.Write(dr.GetInt32(0).ToString()+","+dr.GetString(1)+"&br&");
5.1.8& 水库管理——DataSet
DataSet是ADO.NET中最核心的成员之一,是各种基于.NET平台程序语言(如VB.NET、C#.NET、C++.NET)的数据库应用程序开发最常接触的类,这是因为DataSet在ADO.NET实现从数据库中抽取数据的作用。数据抽取后,DataSet就是数据的存放地,它是各种数据源(SQL Server 、OLE DB等)的数据在计算机内存的缓存,所以有时说DataSet可以看成是一个数据容器(又称数据集)。在客户端通过对DataSet的数据集读取、更新等操作,从而实现对数据源的同等操作。
DataSet的最大优点是离线(断开)和连接。DataSet既可以以离线方式,也可以以实时连接方式来操作数据库中的数据。这样的好处是大大减少了服务器端数据库的连接线程,从而大大地减少了服务器端的运行压力。所以,在数据量不大的情况下,使用DataSet是最好的选择。
DataSet的基本工作过程:应用程序一般并不直接对数据库进行操作(直接在程序中调用存储过程等除外),而是先完成和数据库的连接,接着通过数据适配器(DataAdapter)把数据库中的数据填入DataSet对象,然后客户端再通过读取DataSet来获得需要的数据,同样,在更新数据库中的数据时,也是首先更新DataSet,然后再通过DataSet和数据适配器将更新的数据同步地解释入数据库中。
下面列出了DataSet的一些常用操作。
1.创建DataSet 对象
初始化DataSet类的新实例。
public DataSet();
用给定名称初始化DataSet类的新实例。
public DataSet(string);
2.用DataAdapter填充DataSet
DataSet ds = new DataSet();
adapter.Fill(ds);
adapter.Fill(ds, "表名"); //用一个表去填充DataSet.
3.合并两个DataSet
string conString="data source=127.0.0.1;database=user id=
password=";&&&&&&&&&&&
SqlConnection myConnection = new SqlConnection(conString);
myConnection.Open();
string strSQL = "SELECT * FROM P_Product";
DataSet ds1 = new DataSet();&&&&&&&&&&&
SqlDataAdapter adapter1 = new SqlDataAdapter(strSQL, myConnection);
adapter1.Fill(ds1, "Product");

我要回帖

更多关于 数据集 数据源 的文章

 

随机推荐