一、数据源
数据源是数据的来源和访问该数据所需的连接信息。数据来源的示例有 Microsoft Access、Microsoft SQL Server、Oracle RDBMS、电子表格以及文本文件。连接信息的示例包括服务器位置、数据库名称、登录 ID、密码和各种各样描述如何连接到数据源的 ODBC 驱动程序选项。
ODBC管理器(Administrator)它负责安装驱动程序,管理数据源,并帮助程序员跟踪ODBC的函数调用。在ODBC中,应用程序不能直接存取数据库,它必须通过管理器和数据库交换信息。ODBC管理器负责将应用程序的SQL语句及其他信息传递给驱动程序,而驱动程序则负责将运行结果送回应用程序。运行32bit ODBC管理器后,出现一个主对话框,它的主要内容是要求用户输入一个数据源,所谓数据源就是数据库位置、数据库类型以及ODBC驱动程序等信息的集成。数据源负责将运行结果送回应用程序。应用程序、ODBC管理在使用之前必须通过ODBC管理器进行登记和连接,启动ODBC管理器后,选取Add按钮,根据自己的数据库类型,选择相应的ODBC驱动程序,然后输入数据源名(Data Source Name)和数据库文件名(Database Name),完成这些步骤后,以后的应用程序就能够通过ODBC管理器的数据源直接操纵数据库。
在Window95或者98下,ODBC管理器在控制面板里面的32bit ODBC。而在WINDOW2000下,ODBC管理器是在程序à管理工具à数据源(ODBC)中。第一次找它费了我好大的力气。后来动用了搜索才找到的。(想想自己还真够笨的。L)
下面以Window2000下的ODBC管理器为例,介绍一下每一页的用途:
1、 用户DSN:ODBC用户数据源存贮了如何与指定数据库提供者连接的信息。只对当前用户可见,而且只能用于当前机器上。这里的当前机器是只这个配置只对当前的机器有效,而不是说只能配置本机上的数据库。它可以配置局域网中另一台机器上的数据库的。
2、 系统DSN: ODBC系统数据源存贮了如何指定数据库提供者连接的信息。系统数据源对当前机器上的所有用户都是可见的,包括NT服务。也就是说在这里配置的数据源,只要是这台机器的用户都可以访问。
3、 文件DSN:ODBC文件数据源允许用户连接数据提供者。文件DSN可以由安装了相同驱动程序的用户共享。这是界于用户DSN和系统DSN之间的一种共享情况。
4、 驱动程序:这页列出了本机上所有安装的数据库驱动程序。里面列举了每个驱动程序的名称,版本,提供商公司,驱动程序文件名,以及安装日期。
5、 跟踪:ODBC跟踪允许创建调用ODBC的日志,提供给技术人员查看。里面可设定日志的路径和文件名。技术人员通过这里面的信息可以看到本机上所有的数据库访问的时间,用户,以及出错信息等情况。也可以通过这个辅助调试应用程序,可以启动Visual Studio的分析器,来进行ODBC的跟踪。
? 6、 连接池:连接池允许应用程序重用原来打开的的连接句柄,这样可以节省到服务器的往返过程。
7、 关于:最后这一页列出了所有的ODBC的核心文件。
这里,我们以常用的Access数据库为例子,来说明创建一个用户数据源的过程。
假设我们已经通过Access创建了一个Sample.mdb文件(假设放在C:\DB\目录下),里面包含了所有的表,索引和数据。别的数据库可能不同,例如paradox数据库是把所有的表,索引,数据用不同的文件保存,但是都放在同一个目录下面。(别的如SQL Server,DB2,Oracle大型的数据库我们暂时不做介绍。因为一般非专业人员接触这样大型的数据库的机会不多,而且它们的配置都比较麻烦,当然,相应的功能也比小型的桌面数据库强,主要是提供了一些数据保护,数据安全,事务处理方面的东西。)
具体步骤是:控制面板->管理工具->数据源(ODBC))
1、 在用户DSN这一页,单击填加。
2、选择数据库的驱动程序,这里我们选择Microsoft Access Driver(*.mdb)。两外也有两项是以(*.mdb结尾)的。不过不能选那两个。然后单击完成。
3、在数据源名(N)上指定一个名字,可以任意指定,以后在程序里面使用的DSN就是这个名字了。然后选择数据库,在弹出的窗口中找到C:\DB\Sample.mdb,选择,确定。
返回到如下界面:
这时,已经选择好了数据库,可以确定退出。
另外,在高级按纽里面可以确定本数据源的访问密码。可以指定系统数据库。在选项按纽里面还可以设定缓冲区的大小等。
这里面,缓冲区是在内存中开辟的一个区域,通过ODBC数据源的操作实际上都是和缓冲区里面的数据打交道。由应用程序正常退出的时候,或者需要别的应用程序也需要访问硬盘上的数据,驱动程序发现硬盘上的数据不是最新的数据,就用缓冲区的数据来更新硬盘上的数据。如果发生忽然断电的情况,那么,硬盘上的数据来不及更新,原来做的修改将会丢失。
注意:matlab中的单引号是用''''' ''''表示的,遇到字符时,搜索语句中需要用单引号将内容引起来。
二、具体操作
1、配置数据源(如上)
2. 建立链接对象——database
调用格式:
conna=database(‘datasourcename’,’username’,’password’);
如conna=database('SampleDB','','');其中SampleDB为上文中创建的数据源名称,当默认情况下,数据库文件的username和password为空。
3. 建立并打开游标——exec
调用格式:
curs=exec(conna,'sqlquery');
如curs=exec(conna,'select * from database')
其中conna为上文中链接对象,select * from database表示从表database中选择所有的数据.
4. 把数据库中的数据读取到Matlab中——fetch
调用格式:
curs=fetch(curs,RowLimit);
Data=curs.Data;%把读取到的数据用变量Data保存.
如curs=fetch(curs);
把所有的数据一次全部读取到Matlab中,RowLimit为每次读取的数据参数的行数,默认为全部读取,但是全部读取会很费时间(和计算机性能很大关系)。
上述四点是matlab从数据库文件中读取数据到matlab中的基本步骤。
5. 数据返回类型
从数据库中读取数据到matlab有三种数据类型(默认为元胞类型cellarray),分别为元胞类型(cellarray),数字型(numeric),结构型(structure)。可以在链接数据库之前通过setdbprefs函数来进行设置。如果数据库文件中全部是数值型数据时最好采用numeric型的数据,这样可以使得读取速度大幅提高,特别是在大型数据读取时非常明显。我曾经从数据库中读取过100万个数据,用cellarray时用了16s,但是用numeric时却只用了8s,速度提高很大啊,对电脑配置不好的来说,很有帮助的。(还有我的电脑很烂,1.3GHz,384M内存,可能让大家见笑了…….)
调用格式:
setdbprefs(‘datareturnformat’,’numric’)
6. 养成良好习惯,随手关闭链接对象和游标——close
当不再使用数据库的链接对象时要及时关闭,这样才能及时的释放出内存,而且每次链接后所需要的内存量是非常大的,要是不及时关闭的话对后续计算的影响将非常非常的大。( 针对烂机子而言,要是你的电脑超强也无所谓的…..)
调用格式:
close(curs)
close(conna)
7. 查看数据相关信息
Rows-查看数据行数
调用格式:numrows=rows(curs)
Cols——查看数据列数
调用格式:numcols=cols(curs)
Attr——查看数据属性
调用格式:attribute=attr(curs)
第二部分:把数据写入到数据库中
8. 添加数据到表中——insert函数
调用格式:
insert(conna,’tab’,colnames,exdata)
conna——链接对象
tab——数据库文件的表名
colnames——数据库表的列名
exdata——matlab变量
如:insert(conna,'try',{'a1', 'a2'},[45 65])
commit(conna)%确认数据更改
9. 更新数据库中的数据——update
调用格式:
update(conna,’tab’,colnames,exdata,’whereclause’)
conna——链接对象
tab——数据库文件的表名
colnames——数据库表的列名
exdata——matlab变量
whereclause——SQL的where字句
如:update(conna,'try',{'a1', 'a2'},[45 65],’where XX=’XX’’)
commit(conna)%确认数据更改
10. 建立新表——exec,creat table
调用格式:
conna=database('SampleDB','','');
exec(conna,['create table Table(name string,age int)']);
close(conna);
Table——表名
name,age——字段名
以上部分是从董振海写的《精通MATLAB7编程与数据库应用》中根据我使用database toolbox的经验摘抄的,在此向作者致谢。
第三部分:自己写的相关函数
下面是我在matlab的数据库分析项目的过程中自己写的和用到的关于数据库操作的相关函数的介绍:
11. 把数据写入到txt文件中.
调用格式:
data=rand(100,100);
dlmwrite('data.txt',data,'delimiter',' ','newline','pc');
由于matlab的数据类型默认为双精度的,写入到txt中也是双精度的,此时可以用下面操作来减少有效位数从而减小文件大小。
data=fix(10000*data)/10000;
这样保存的txt文件要更小一些.
12. 把字符串分隔为cell数据——StrSpliteToCell
调用格式:
StrSpliteToCell(Str1,Str2)
Str1为字符串源,str2为分隔号
如:
DataPath ='D:\Program Files\MATLAB71\work\data.txt'
Str='\'
StrSpliteToCell(DataPath, Str)
ans =
'D:' 'Program Files' 'MATLAB71' 'work' 'data.txt'
13. cell数据用字符分隔——CellStrJoinWithSeparator
a={'D:' 'Program Files' 'MATLAB71' 'work' 'data.txt'}
Str=CellStrJoinWithSeparator(a,'\')
Str =
Message: ''
ErrNum: 0
ans: 'D:\Program Files\MATLAB71\work\data.txt'
14. 把txt文件中的数据写到数据库中
由于matlab直接向数据库中保存数据时非常非常的费时,曾经用matlab直接向数据库中写数据时,100万个数据运行了20多分钟还没完,等的太久了就结束了……..
所以想到了先把数据保存为txt,再从txt写到数据库文件中,这样这样做的时间花费相对直接写来说几乎可以忽略了
把上面的data.txt中的数据写到数据库文件中
conna=database('SampleDB','','');
DataPath='D:\Program Files\MATLAB71\work\data.txt'
f=CreateSchema(DataPath)
Txt2Access(conna,DataPath)
close(conna)
CreateSchema.m是一个写配置文件的函数
Txt2Access.m是把数据写到数据库中
第四部分:其他参考资料
http://www.leadbbs.com/a/a.asp?B=260&ID=1243284
Database Toolbox 2
和关系数据库进行数据交换
Database 工具箱可以使你使用MATLAB 的数据分析
和可视化工具对存储在数据库中的数据进行分析。在
MATLAB 工作环境中, 您可以使用结构化查询语言进
行:
■ 对数据库中的数据进行读写
■ 使用约束条件对数据库进行操作
您可以在MATLAB 中和绝大多数的数据库进行交
互, 包括Oracle、Sybase、Microsoft SQL Server、
MySQL、PostgreSQL 以及Microsoft Access 。该工具箱
还允许您在单个的MATLAB 任务中同时存取多个数据
库并且支持事务特性。它包含了Visual Query Builder
( 可视化查询工具), 它可以使您在不熟悉SQL 的情
况下和数据库进行交互。
Visual Query Builder
可以快速对您的数据
进行存取和图表显示
关键特性
■ 支持ODBC/JDBC 连接的数据库接口
包括Oracle、Sybase、Microsoft SQL
Server、MySQL、PostgreSQL 以及
Microsoft Access
■ 从MATLAB 中直接执行查询语句
■ 对于大数据量查询, 将增量获取数据
■ 在所有的数据导入和导出的过程中,
保留数据类型
■ 单个的MATLAB 任务中可以同时
存取多个数据库
■ 从一个数据库中导入数据,完成计
算后, 将结果输出到另外一个数据库
■ 在单个事务中获取大数据集, 或者分
割数据, 通过多个事务来完成
■ 通过在一个MATLAB 会话中保持数
据库连接来减少需要进行输入和输出
数据所需要的语句, 除非数据库连接
被显式关闭
■ 它可以使您在不熟悉SQL 的情况下
和数据库进行交互
在MATLAB 中对Microsoft Access 数据库进行查询
数据库工具箱函数列表
数据库访问函数
clearwarnings 清除数据库连接警告
close 关闭数据库连接
commit 数据库改变参数
database 连接数据库
exec 执行SQL语句和打开油标
get 得到数据库属性
insert 导出MATLAB单元数组数据到数据库表
isconnection 判断数据库连接是否有效
isreadonly 判断数据库连接是否只读
ping 得到数据库连接信息
rollback 撤销数据库变化
set 设置数据库连接属性
sql2native 转换JDBC SQL 语法为系统本身的SQL语法
update 用MATLAB单元数组数据代替数据库表的数据
数据库游标访问函数
attr 获得的数据集的列属性
close 关闭游标
cols 获得的数据集的列数值
columnnames 获得的数据集的列名称
fetch 导入数据到MATLAB单元数组
get 得到游标对象属性
querytimeout 数据库SQL查询成功的时间
rows 获取数据集的行数
set 设置游标获取的行限制
width 获取数据集的列宽
数据库元数据函数
bestrowid 得到数据库表唯一行标识
columnprivileges 得到数据库列优先权
columns 得到数据库表列名称
crossreference 得到主健和外健信息
dmd 创建数据库元数据对象
exportedkeys 得到导出外部健信息
get 得到数据库元数据属性
importedkeys 得到导入外健信息
indexinfo 得到数据库表的索引和统计
primarykeys 从数据库表或结构得到主健信息
procedurecolumns 得到目录存储程序参数和结果列
procedures 得到目录存储程序
supports 判断是否支持数据库元数据
tableprivileges 得到数据库表优先权
tables 得到数据库表名称
versioncolumns 得到自动更新表列
数据库工具箱让用户使用MATLAB强大数据分析和可视化工具功能处理存储在数据库中的数据的复杂分析。在MATLAB环境下工作,可以用结构化查询语言SQL)命令:
读,写数据库的数据
简单和高级条件的数据查询
连接MATLAB和数据库包括Oracle,Sybase,Microsoft SQL Server和Informix。
可以用单一MATLAB同时访问多个数据库,进行大数据量的事务处理。不懂SQL的用户可以用Visual Query Builder处理数据。
重点
鲁棒接口能力。 用ODBC/JDBC连接数据库,包括Oracle,Sybase SQL Server,Sybase SQL Anywhere,Microsoft SQL Server, Microsoft Access,
Informix Ingres.
SQL语法。 在MATLAB环境直接执行SQL查询
动态导入数据。 调节SQL查询,把数据导入MATLAB。数据库工具箱满足小的和大的查询。
数据类型保存。 在数据导入和导出行为MATLAB保存数据类型
同时访问多个数据库。 从数据库导入数据,对该数据执行计算,然后导入到另一个数据库。
处理大数据集的能力。
连续状态的数据库连接:一旦和某个数据库的连接建立后,数据库一直是打开的,除非在MATLAB中执行关闭语句。这提高了数据库的读取速度,减少了不必要的命令来调入,输出数据 Visual Query Builder. 该图形用户接口列数据源和所有表和字段,不懂SQL的用户可以访问和查询数据库函数列表