2014-02-14 100 views
3

我想通过RODBC包连接到sqlite数据库。通过RODBC连接到SQLite

1.)我已经从http://www.ch-werner.de/sqliteodbc/安装了SQLite ODBC驱动程序,并使用Windows 7中的ODBC数据源管理器进行设置。设置为锁定超时20ms,同步模式为NORMAL,并且选中“不创建数据库”。我可以在“用户DSN”选项卡中将我的数据源看作SQLite3 ODBC驱动程序。

2.)在R我运行以下命令连接到数据库。目前没有问题。看起来它设置正确。

library(RODBC) 
con <- odbcConnect("dbss") 
odbcGetInfo(con) 
            DBMS_Name 
            "SQLite" 
            DBMS_Ver 
            "3.8.2" 
          Driver_ODBC_Ver 
            "03.00" 
          Data_Source_Name 
            "dbss" 
           Driver_Name 
          "sqlite3odbc.dll" 
           Driver_Ver 
            "0.996" 
            ODBC_Ver 
           "03.80.0000" 
           Server_Name 
           "U:\\Research\\data\\smartsystemtic\\db.sqlite" 

3)但是,如果我想查询一个表或只显示我遇到问题的表。我可以看到(使用SQLite Studio)我有一个名为“School”的表格,有4列和3行。

> sqlQuery(con, paste("SELECT * FROM School")) 
[1] SchID  Location Authority SchSize 
<0 rows> (or 0-length row.names) 

在那里我知道有3行看着SQLite Studio。

4)此外,我得到

> sqlTables(con) 
[1] TABLE_CAT TABLE_SCHEM TABLE_NAME TABLE_TYPE REMARKS  
<0 rows> (or 0-length row.names) 

而在SQLite的工作室我看到4台数据库。

你能给我指点什么,我做错了吗?谢谢。

+1

连接来自R到SQLITE的通常方法是使用'RSQLite'包。你能成功使用那个包返回结果吗? –

+0

是的,我可以。也许这将是一条路。我对RODBC软件包更加熟悉,我希望我可能只有一个小小的设置错误。 RODBC小插曲/文档说它支持SQLite。 –

+0

狂猜:它是32/64位的问题吗?你有没有在32位和64位R中试过? –

回答

2

沃尔夫冈,

汤米·奥德尔的答案here为我工作。

我在打开ODBC连接到SQLite时包含了believeNRows = FALSE, rows_at_time = 1

+0

我发现我需要的是believeNRows = FALSE,但不是rows_at_time = 1.我很高兴后者,因为它似乎是一个很大的性能影响。 – dsz

+0

我可以确认'rows_at_a_time = 1'不是必需的。测试环境:Ubuntu + unixODBC + SQlite 3.7.16.2 +驱动程序版本0.992 + ODBC版本3.52 + RODBC 1.3-14 –

0

我已经能够使用RODBC包访问我的SQLite数据库。我在数据库的10个表中每个表中至少有540万行。我从你的(@ Wolfgang Wu)设置和代码中看到的主要区别在于我使用的SQLite 3数据源驱动程序是在系统DSN选项卡中访问的。我安装了从以下链接链接的64位驱动程序:http://www.ch-werner.de/sqliteodbc/

以下是我的命令和结果。

################################################ 
# Create SQL tables from same-name r dataframes 
################################################ 

    db <- dbConnect(SQLite(), dbname = "./slds.sqlite") 

# student record - stu, crs, dis, enr, prog, sped, addr 
# assessments - crct, crctm, eoct 

    for (i in 1:dim(r)[1]) { 
    dbWriteTable(conn = db, name = paste0(r[i, 1]), value = get(r[i, 1]),  
       row.names = FALSE, overwrite = TRUE) 
    } 

# FYI - the r matrix is as follows: 

# > r 
#  [,1] [,2]    
# [1,] "stu" "Student"  
# [2,] "crs" "Course"   
# [3,] "dis" "Discipline"  
# [4,] "enr" "Enroll"   
# [5,] "addr" "Address"  
# [6,] "prog" "Programs"  
# [7,] "sped" "Sp. Ed. Events" 
# [8,] "crct" "CRCT(-M)"  
# [9,] "crctm" "CRCT(-M)"  
# [10,] "eoct" "EOCT" 


    ################################ 
    # Connect, access, show results 
    ################################ 

    slds <- odbcConnect("slds_dews", believeNRows = FALSE, rows_at_time = 1) 
    table_list<-sqlTables(slds) 

table_list[, "TABLE_NAME"] 
[1] "stu" "crs" "dis" "enr" "addr" "prog" "sped" "crct" "crctm"  
    "eoct" 

odbcGetInfo(slds) 
         DBMS_Name 
         "SQLite" 
         DBMS_Ver 
         "3.8.7.4" 
       Driver_ODBC_Ver 
         "03.00" 
       Data_Source_Name 
        "slds_dews" 
        Driver_Name 
       "sqlite3odbc.dll" 
         Driver_Ver 
         "0.9991" 
         ODBC_Ver 
        "03.80.0000" 
        Server_Name 
       "H:\\slds.sqlite"