使用FreeTDS从Ubuntu的RODBC MS SQL访问

我试图从Ubuntu机器上访问我的Windows机器上托pipe的MS SQL服务器。 我有一个shiny的应用程序访问MSSQL,在Windows上正常工作。 我想在Ubuntu上使用shiny的服务器托pipe它,这样其他人就可以访问网页并将其SQL服务器作为input提供给应用程序。

所有这一切在Windows上工作正常。 现在我无法获得unixODBC的工作。 我想我已经得到了正确的odbc / freeTDS安装和configuration。 我能够使用tsql -S从Ubuntuterminal连接和查询SQL数据库实例。 它采取了一些谷歌search,但最终它的工作。

现在,当我尝试从RI连接得到这个错误。

sql <- odbcConnect("abc.xyz.com", "uname", "passwd") 

在odbcDriverConnect(“DSN = abc.xyz.com; UID = uname; PWD = passwd”):[RODBC]错误:状态08001,代码0,消息[unixODBC] [FreeTDS] [SQL Server] 无法连接到数据源 2:在odbcDriverConnect(“DSN = abc.xyz.com; UID = uname; PWD = passwd”):[RODBC]错误:状态01000,代码20002,消息[unixODBC] [FreeTDS] [SQL Server] Adaptive Server连接失败 3:在odbcDriverConnect(“DSN = abc.xyz.com; UID = uname; PWD = passwd”):[RODBC]错误:状态01000,代码20017,消息[unixODBC] [FreeTDS] [SQL Server] 意外的EOF服务器 4:在odbcDriverConnect(“DSN = abc.xyz.com; UID = uname; PWD = passwd”):ODBC连接失败

 freeTDS.conf [abc.xyz.com] host = abc.xyz.com port = 49475 tds version = 8.0 odbcinst.ini [FreeTDS] Description = FreeTDS unixODBC Driver Driver = /usr/local/lib/libtdsodbc.so Setup = /usr/local/lib/libtdsodbc.so odbc.ini [abc.xyz.com] Description = Shiny testing Driver = FreeTDS Trace = No Server = abc.xyz.com\instance_name Database = dbanme port = 49475 

这个错误“来自服务器的意外的EOF”对我来说并不新鲜。 当我尝试使用tsql进行连接时遇到了同样的错误。 我可以通过在freeTDS.conf中添加“tds version = 8.0”来解决这个问题。 不知道如何让RODBC使用这个configuration。 我读过其他用户能够使用freeTDS的sql服务器的post。 不知道这里缺less什么。 我也尝试重新安装RODBC。

我解决了这个问题 在odbc.ini文件中需要TDS版本。

 TDS_Version = 8.0 

tsql从freeTDS.conf读取版本信息并工作。 isql失败的同样的错误,它也在odbc.ini中寻找这个配置。 因此,如果您正在配置R / Python,请使用isql进行测试。

我不知道是什么原因造成了你身边的错误。 希望这可以帮助:

这些是我设置RODBC 1.3-10连接到MSSQL server 2012.我也在Ubuntu上,这对我的作品。 我想我从Ubuntu回购安装了RODBC软件包:

 apt-cache policy r-cran-rodbc r-cran-rodbc: Installed: 1.3-10-1 Candidate: 1.3-10-1 Version table: *** 1.3-10-1 0 500 ftp://ftp.fu-berlin.de/linux/ubuntu/ trusty/universe amd64 Packages 100 /var/lib/dpkg/statu 

uname -a

 Linux xxx 3.13.0-30-generic #54-Ubuntu SMP Mon Jun 9 22:45:01 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux 

ODBC.INI

 [mydsn] APP = unixodbc Description = master on vmXX Driver = TDSdriver server = vmXX Database = master Port = 1433 #Trace = No #TraceFile = /var/log/freetds/freetds--odbc.log TDS Version = 7.2 

freetds.conf

 [global] # TDS protocol version ; tds version = 4.2 # Whether to write a TDSDUMP file for diagnostic purposes # (setting this to /tmp is insecure on a multi-user system) #dump file = /tmp/freetds.log #debug flags = 0xffff # Command and connection timeouts ; timeout = 10 ; connect timeout = 10 # If you get out-of-memory errors, it may mean that your client # is trying to allocate a huge buffer for a TEXT field. # Try setting 'text size' to a more reasonable limit text size = 64512 [vmXX] host = 111.222.333.555 port = 1433 tds version = 7.2 client charset = UTF-8 

从输出

 ps aux | grep "/R" knb 56969 .... lsof -p 56969 | grep -i odbc R 56969 knb mem REG 8,1 72408 8528592 /usr/lib/x86_64-linux-gnu/libodbcinst.so.1.0.0 R 56969 knb mem REG 8,1 400608 8521896 /usr/lib/x86_64-linux-gnu/odbc/libtdsodbc.so R 56969 knb mem REG 8,1 419680 8525415 /usr/lib/x86_64-linux-gnu/libodbc.so.1.0.0 R 56969 knb mem REG 8,1 96845 8933205 /usr/local/lib/R/site-library/RODBC/libs/RODBC.so 

我有一个类似的错误,并意识到R只是无法正确阅读我的用户名,因为它有一个斜杠。 我把我的凭据放在一个文本文件中,为我解决了这个问题。

 cred <- "/myPath/ODBC_cred.txt" sql <- RODBC::odbcConnect("abc.xyz.com", uid=readLines(cred)[1], pwd=readLines(cred)[2])