转自:https://www.cnblogs.com/tgzhu/p/5776927.html
在我的实际工作中,数据来源一方面是关系型数据库MS SqlServer, 别一方面是HBase。本节主要介绍通过RODBC访问MS SqlServer 安装配置,参见资料(https://msdn.microsoft.com/en-us/library/hh568454(v=sql.110).aspx),请注意:下载的msodbc 的版本与 unixODBC的版本之间有强制的对应关系,参见:(https://msdn.microsoft.com/en-us/library/hh568449(v=sql.110).aspx),本文选择安装的是 msodbcsql-11.0.2270.0 ,按官方介绍,对应的unixodbc 版本为:unixODBC-2.3.0
目录:
- unixODBC安装
- Msodbcsql安装
- ODBC配置
- RODBC安装
- RODBC调用示例
说明:
- unixODBC提供了Linux对ODBC的支持,但它只是一个ODBC的管理器,要连接实际的数据库还需要提供这种数据库的ODBC驱动
- msodbcsql是Linux下用于连接sqlServer的免费ODBC驱动 (注意: 必须先装unixODBC,再安装sqlserverodbc)
- RODBC是R脚本连接ODBC的软件包
unixODBC安装:
- 软件安装包下载(unixODBC-2.3.0.tar.gz),下载地址:https://sourceforge.net/projects/unixodbc/files/unixODBC/2.3.0/
- 命令:yum remove unixODBC (如果机器上已经安装其它版本的unixODBC,安装前需要先将其删除)
- 命令:tar xvzf unixODBC-2.3.0.tar.gz (将下载到本地的软件包上传至linux主机并解压)
- 命令:cd unixODBC-2.3.0 (切换至解压后的目录)
- 命令:CPPFLAGS="-DSIZEOF_LONG_INT=8"
- 命令:export CPPFLAGS
- 命令:./configure --prefix=/usr --libdir=/usr/lib64 --sysconfdir=/etc --enable-gui=no --enable-drivers=no --enable-iconv --with-iconv-char-enc=UTF8 --with-iconv-ucode-enc=UTF16LE
- 命令:make (编译安装)
- 命令:make install
Msodbcsql安装:
- 软件安装包下载(msodbcsql-11.0.2270.0.tar.gz),下载地址:https://www.microsoft.com/en-us/download/details.aspx?id=36437
- 命令:tar xvzf msodbcsql-11.0.2270.0.tar.gz (安装包上传到linux 主机后解压)
- 命令:cd msodbcsql-11.0.2270.0 (切换至解压后主目录)
- 命令:./install.sh verify (验证当前环境是否满足软件安装要求)
- 命令:./install.sh install (上一步ok的前提下,执行安装)
- 命令:odbcinst -q -d -n "ODBC Driver 11 for SQL Server" (测试安装是否成功,如下则ok)
Description=Microsoft ODBC Driver 11 for SQL Server Driver=/opt/microsoft/msodbcsql/lib64/libmsodbcsql-11.0.so.2270.0 Threading=1 UsageCount=1
ODBC配置:
- 安装成功后,在 /etc 目录下能找着 odbcinst.ini 和 odbc.ini 文件
- odbcinst.ini 表示本机已经安装了哪些类型的驱动,正确安装后内容如下
[ODBC Driver 11 for SQL Server] Description=Microsoft ODBC Driver 11 for SQL Server Driver=/opt/microsoft/msodbcsql/lib64/libmsodbcsql-11.0.so.2270.0 Threading=1 UsageCount=1
命令:vim /etc/odbc.ini (配置MS sqlserver 连接信息),在打开的文件中输入如下内容
[testsql] Driver=ODBC Driver 11 for SQL Server Server= 数据库服务器名或IP Database=数据库名
注意:Driver 赋值必须与 odbcinst 文件中 安全一致
- 命令:isql testsql sa XXXX (testsql: 设置的odbc连接名,后面以空格输入用户名和密码,成功连接则OK,如图)
- 命令: quit (退出)
RODBC安装:
- 命令:R (进入R命令行)
- 执行:install.packages("RODBC") (安装RODBC)
- 安装完成后,在R命令行下执行如下脚本,结果如下则OK
library(RODBC) pile <- odbcConnect("testsql",uid = "sa",pwd = "yourPassword") data <- sqlQuery(pile,"select top 5 code,name from codeItems") close(pile) data
- 结果如下,则ok
ODBC的访问接口
- odbcConnect 可以打开一个连接,返回一个用于随后数据库访问的控制(handle)。 打印一个连接会给出ODBC连接的一些细节,而调用 odbcGetInfo 会给出客户端和服务器的一些细节信息。
- 在一个连接中的表的细节信息可以通过函数 sqlTables 获得。
- 函数 sqlSave 会把 R 数据框复制到一个数据库的表中,
- 函数 sqlFetch 会把一个数据库中的表拷贝到 一个 R 的数据框中
- 通过sqlQuery进行查询,返回的结果是 R 的数据框。
- sqlCopy把一个 查询传给数据库,返回结果在数据库中以表的方式保存。 一种比较好的控制方式是首先调用 odbcQuery, 然后 用 sqlGetResults 取得结果。后者可用于一个循环中 每次获得有限行,就如函数 sqlFetchMore 的功能。
- 连接可以通过调用函数 close 来关闭。
sqlSave函数
-
sqlSave(channel, dat, tablename = NULL, append = FALSE, rownames = TRUE, colnames = FALSE, verbose = FALSE, safer = TRUE, addPK = FALSE, typeInfo, varTypes, fast = TRUE, test = FALSE, nastring = NULL) sqlUpdate(channel, dat, tablename = NULL, index = NULL, verbose = FALSE, test = FALSE, nastring = NULL, fast = TRUE)
append:代表是否追加,默认不追加,如果一张已经有数据的表,就可以用append追加新的数据,需要同样的column,一般开个这个就行。
- rownames:可以是逻辑值,也可以是字符型。
- colnames:列名;
- verbose:默认为FALSE,是否发送语句到R界面,如果TRUE,那么每条上传数据就会出现在命令栏目致之中。
- addPK:是否将rownames指定为主键。