Problems with RODBC sqlSave

做~自己de王妃 提交于 2019-12-03 13:47:50

Very old question I know, but I had (and solved for my instance) the same problem just now, getting this error

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

from using

sqlSave(

In the rodbc package.

I solved it by setting

,fast = F

If anyone else from the first google results lands here, hope this helps

EDIT: So I since have looked at this more. When setting the flag to "F" as I recommend below you insert the rows, row by row into the database. While it was "T" it would fail if one row was incorrect, but now that row fails and you don't know about it. So the data base may be missing data that you thought was in there. Check the count of rows in the data base vs the number of rows you expect to be inserted from your dataframe. You probably have a single value that is incompatible. What I have taken to doing now is using "paste" function in a loop to create a string like "insert into tableName values("eg1","eg2") " this way I can get error messages back about why it did not go into the database

different errors can lead to the same error msg. So it is not clear whether this helps you: however if "tablename='wellAnalysedDataTablealready' is already created in the mySql database as an empty table you will get this error. Try to remove it and let the sqlsave(...) function take care of it

I got the same error and the problem was the destination table data types. Even it seems there were possible data conversion.
The solution steps were:

  1. use an unused table name (new table);
  2. set append=False and get the "create table" showed at error msg;
  3. run that create table at database;
  4. the "saveSql" now works either with append=False or append=True.

It is useful setting "verbose=T" to check exactly where the problem occurs.

> 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

Have you tried making your numerics integers and your factors characters?

 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)

If the issue is in fact with case-sensitivity, then it looks like there's an easy fix without changing any functions by using the "preserve" option, which appears in the line noted by Ari B. Friedman: "nochange=cnames". So, when you initially create your RODBC channel, you can simply specify that as the case option:

my_sql_channel <<- odbcConnect("myOdbc", case="nochange")
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!