Моя таблица базы данных выглядит примерно так:
+-----+-------+--------------------+-----------+----------+
| ID1 | ID2 | FilePath1 | FilePath2 | Status |
+-----+-------+--------------------+-----------+----------+
| 1 | Test1 | MyFolder\R\Folder1 | NULL | Open |
| 2 | Test2 | MyFolder\R\Folder2 | NULL | Open |
| 3 | Test3 | MyFolder\R\Folder3 | NULL | Finished |
| 4 | Test4 | MyFolder\R\Folder4 | NULL | Finished |
+-----+-------+--------------------+-----------+----------+
Первый столбец (ID1 )определяется как ПК. Однако ID2 также уникален.
Теперь я хотел бы иметь возможность изменить FilePath2
и Status
с помощью R, используя sqlUpdate()
из пакета RODBC
. Поэтому я пробую следующее:
db.df <- data.frame(ID1=1, ID2='Test1',
FilePath2='MyFolder\R\Folder5', Status='Finished',
stringsAsFactors=FALSE)
sqlUpdate(myconn, db.df, tablename='mytable', index='ID2', verbose=TRUE)
где db.df
— это фрейм данных с одной строкой и именами столбцов, соответствующими именам в таблице базы данных (, однако я пропускаю некоторые столбцы, в данном случае FilePath1
, и я бы предпочел не включать ID1
, тоже, если возможно ). Моя цель - получить следующее:
+-----+-------+--------------------+--------------------+----------+
| ID1 | ID2 | FilePath1 | FilePath2 | Status |
+-----+-------+--------------------+--------------------+----------+
| 1 | Test1 | MyFolder\R\Folder1 | MyFolder\R\Folder5 | Finished |
| 2 | Test2 | MyFolder\R\Folder2 | NULL | Open |
| 3 | Test3 | MyFolder\R\Folder3 | NULL | Finished |
| 4 | Test4 | MyFolder\R\Folder4 | NULL | Finished |
+-----+-------+--------------------+--------------------+----------+
Я получаю следующую ошибку:
Error in sqlUpdate(myconn, db.df, tablename = 'mytable', index = 'ID2', :
index column(s) ID2 not in database table
Что может быть причиной этой проблемы?
РЕДАКТИРОВАТЬ :Я обошел проблему, отправив прямой запрос SQL:
out.path <- 'MyFolder\\\\R\\\\Folder5'
update.query <- paste("UPDATE mytable ",
"SET FilePath2='", out.path, "', Status='Finished' ",
"WHERE ID2='Test1'", sep="")
dummy <- sqlQuery(myconn, update.query)
Хотя это может быть не очень аккуратный способ, он делает то, что должен делать. Тем не менее, я до сих пор не понимаю, что случилось с sqlUpdate
, поэтому я надеюсь, что кто-то может пролить свет на это.