2011-08-02 65 views
7

我在使用RODBC将数据框插入到mySql数据库时遇到了一些困难。 下面是我使用的代码:RODBC的问题sqlSave

data <- data.frame(analysedDataID=c(1,2,3), plateWell=c("a","b","c"), screenPlateOrder=c(1,2,3), wellData=c("A","B","C")) 

con <- odbcConnect(DSN, uid="user_id", pwd="some_password") 
query <- sqlSave(con, data, tablename = 'wellAnalysedDataTable', rownames=FALSE, append=TRUE) 

当我尝试执行此我得到以下错误信息:

Error in odbcUpdate(channel, query, mydata, coldata[m, ], test = test, : 
missing columns in 'data' 

这里是我想要插入数据的特定表成:

+------------------+-------------+------+-----+---------+-------+ 
| Field   | Type  | Null | Key | Default | Extra | 
+------------------+-------------+------+-----+---------+-------+ 
| analysedDataID | int(10)  | YES |  | NULL |  | 
| plateWell  | varchar(10) | YES |  | NULL |  | 
| screenPlateOrder | int(10)  | YES |  | NULL |  | 
| wellData   | varchar(30) | YES |  | NULL |  | 
+------------------+-------------+------+-----+---------+-------+ 

我只是真的在这一点困惑,我在阅读文档,一遍又一遍,但就是不能把这个工作。任何帮助将不胜感激!

干杯!


谢谢!我添加了您所建议的更改,并且现在似乎还没有出现问题。不过,我不断收到以下错误信息:

'index column(s) analysedDataID plateWell screenPlateOrder wellData not in data frame' 

我执行语句生成是这样的:

sqlUpdate(con, data, tablename="wellAnalysedDataTable", index=c("analysedDataID", "plateWell", "screenPlateOrder", "wellData")) 

这没有任何意义,我作为列已经在数据框具有相同的名称。

回答

0
> str(data) 
'data.frame': 3 obs. of 4 variables: 
$ analysedDataID : num 1 2 3 
$ plateWell  : Factor w/ 3 levels "a","b","c": 1 2 3 
$ screenPlateOrder: num 1 2 3 
$ wellData  : Factor w/ 3 levels "A","B","C": 1 2 3 

您是否尝试过使用数字整数和因子字符?

data <- data.frame(analysedDataID=as.integer(c(1,2,3)), plateWell=c("a","b","c"), screenPlateOrder=as.integer(c(1,2,3)), wellData=c("A","B","C"),stringsAsFactors=FALSE) 
+0

嗨GSK3。感谢您的回复。我尝试了您的建议更改,但仍无法使其正常工作。我不断收到另一条错误消息:“无法附加到表'wellanalyseddatatable'”。我注意到tablename变量似乎将输入字符转换为全部小写,这意味着它不匹配我想插入数据框的表。你有什么想法我可以如何区分大小写?我试着查看RODBC的文档,但似乎没有提及它。 – hberven1

+0

如果您键入'odbcUpdate',您将获得整个函数定义。从那里你可以看到该频道有一个名为“case”的属性,它被设置为上限或下限。不知道为什么没有“保留”选项,但您可能会用自己的函数版本覆盖odbcUpdate。相关行是'cnames < - switch(attr(channel,“case”),nochange = cnames, toupper = toupper(cnames),tolower = tolower(cnames))' –

1

不同的错误可能会导致相同的错误消息。因此,目前尚不清楚这是否有助于你: 但是如果“表名=‘wellAnalysedDataTablealready’已经在MySQL数据库中创建一个空表,你会得到这个错误尝试将其删除,并让sqlsave(...)函数。如果问题实际上是在使用大小写敏感,照顾它

0

,那么它看起来像有一个简单的办法,而不使用“保存”选项,它出现在由阿里B.弗里德曼指出行改变任何功能:“NOCHANGE = CNAME记录”所以,当你最初创建RODBC频道,你可以简单地指定视情况选择:。

my_sql_channel <<- odbcConnect("myOdbc", case="nochange") 
0

我得到了同样的错误和问题是目标表中的数据类型,即使似乎有可能的数据转换。
将溶液的步骤是:

  1. 使用未使用的表名称(新表);
  2. set append = False并获取错误消息中显示的“create table”;
  3. 运行在数据库上创建表;
  4. “saveSql”现在可以与append = False或append = True一起使用。

将“verbose = T”设置为确切地检查问题发生的位置很有用。

13

很老的问题,我知道,但我有(和解决了我的情况下),同样的问题就在刚才,使用

sqlSave(

在RODBC包收到此错误

Error in odbcUpdate(channel, query, mydata, coldata[m, ], test = test, : 
    missing columns in 'data' 

我解决它通过设置

​​

如果有人从第一款谷歌人在这里产生的土地,希望这有助于

+0

任何想法为什么这应该有所作为? – keuleJ

+0

fast = F,就是说它按行插入数据。 我不知道为什么在批处理(快= T)导致一个问题。如果我有一个这样做,我不使用sqlSave了。我一般只使用sqlQuery,并为每一行使用粘贴来创建一个字符串。 – ChristyCasey