2011-08-02 95 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