2016-10-05 2 views
0

Я пытаюсь записать следующие данные через RODBC в базу данных. Как разрешить ошибку ниже или какие дополнительные шаги по устранению неполадок?Устранение ошибки «несовместимых типов» с sqlUpdate

writeData <- structure(list(`__ActivityID` = c("8000002", "8000003", "8000005"), 
`__ID` = c("ZRH_06d88315", "ZRH_8161772a", "ZRH_b9f9798a")), 
.Names = c("__ActivityID", "__ID"), row.names = c(NA, 3L), class = "data.frame") 

Вот эта команда, которая должна обновлять базу данных. Я также пробовал с test = false:

sqlUpdate(channel = liveConnection, dat = writeData, 
      tablename = "__Marketing Activities", 
index = "__ActivityID", nastring = NULL, test = TRUE) 

Он возвращает эту ошибку:

# Query: UPDATE "__Marketing Activities" SET "__ID"=? WHERE "__ActivityID"=? 
Error in sqlUpdate(channel = con$liveConnection, dat =  
res$writeDataNewPKs$`__Marketing Activities`, : 
HY000 8309 [FileMaker][FileMaker ODBC] FQL0013/(1:36): 
Incompatible types in assignment.[RODBC] 
ERROR: Could not SQLPrepare 'UPDATE "__Marketing Activities" 
SET "__ID"=? WHERE "__ActivityID"=?' 

Вот структурная информация о __ID колонке:

TABLE_CAT TABLE_SCHEM    TABLE_NAME COLUMN_NAME DATA_TYPE TYPE_NAME COLUMN_SIZE BUFFER_LENGTH DECIMAL_DIGITS 
1  <NA>  <NA> __Marketing Activities  __ID  12 VARCHAR  1000000  1000000    NA 
    NUM_PREC_RADIX NULLABLE REMARKS COLUMN_DEF SQL_DATA_TYPE SQL_DATETIME_SUB CHAR_OCTET_LENGTH ORDINAL_POSITION IS_NULLABLE 
1    NA  0 <NA>      12    NA   1000000    180   NO 

Вот структурная информация о __ActivityID column:

TABLE_CAT TABLE_SCHEM    TABLE_NAME COLUMN_NAME DATA_TYPE TYPE_NAME COLUMN_SIZE BUFFER_LENGTH DECIMAL_DIGITS 
1  <NA>  <NA> __Marketing Activities __ActivityID   8 DECIMAL   15    8    15 
    NUM_PREC_RADIX NULLABLE REMARKS COLUMN_DEF SQL_DATA_TYPE SQL_DATETIME_SUB CHAR_OCTET_LENGTH ORDINAL_POSITION IS_NULLABLE 
1    -1  1 <NA>      8    NA    NA    39   YES 

Я попытался записать другие данные в одни и те же столбцы, и я все равно получаю ту же ошибку.

writeData <-structure(list(`__ActivityID` = c("8000002", "8000003", "8000005", 
"8000008", "8000009", "8000010"), `__ID` = 1:6), .Names = c("__ActivityID", 
"__ID"), row.names = c(NA, 6L), class = "data.frame") 

При записи в другие столбцы в той же базе данных у меня нет никаких проблем.

Я также попытался преобразовать оба столбца в writeData в эти классы: numeric, character, integer.

Я подозреваю, что есть что-то типа данных в столбце __ID, который я не понимаю на стороне базы данных. Кстати, это подключение к базе данных FileMaker 11.

Наконец, вот некоторые данные о самом соединении. Она была создана с помощью этой команды:

sqlTypeInfo(con$liveConnection, type = "all", errors = TRUE, as.is = TRUE) 

И вот результат:

structure(list(TYPE_NAME = c("VARCHAR", "CHARACTER VARYING", 
"DECIMAL", "NUMERIC", "INT", "DECIMAL", "DECIMAL", "BLOB", "VARBINARY", 
"LONGVARBINARY", "BINARY VARYING", "DATE", "TIME", "TIMESTAMP" 
), DATA_TYPE = c(12L, 12L, 3L, 2L, 4L, 6L, 8L, -4L, -4L, -4L, 
-4L, 9L, 10L, 11L), COLUMN_SIZE = c(-1L, -1L, 10L, 10L, 10L, 
15L, 15L, -1L, -1L, -1L, -1L, 10L, 10L, 19L), LITERAL_PREFIX = c("'", 
"'", NA, NA, NA, NA, NA, "X'", "X'", "X'", "X'", "{d '", "{t '", 
"{ts '"), LITERAL_SUFFIX = c("'", "'", NA, NA, NA, NA, NA, "'", 
"'", "'", "'", "'}", "'}", "'}"), CREATE_PARAMS = c("length", 
"length", "precision,scale", "precision,scale", NA, NA, NA, NA, 
NA, NA, NA, NA, "length", "length"), NULLABLE = c(1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), CASE_SENSITIVE = c(1L, 
1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L), SEARCHABLE = c(3L, 
3L, 2L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 2L, 2L, 2L), UNSIGNED_ATTRIBUTE = c(NA, 
NA, 0L, 0L, 0L, 0L, 0L, NA, NA, NA, NA, NA, NA, NA), FIXED_PREC_SCALE = c(0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L), AUTO_UNIQUE_VALUE = c(NA, 
NA, 0L, 0L, 0L, 0L, 0L, NA, NA, NA, NA, NA, NA, NA), LOCAL_TYPE_NAME = c("varchar", 
"character varying", "decimal", "numeric", "int", "decimal", 
"decimal", "blob", "varbinary", "longvarbinary", "binary varying", 
"date", "time", "timestamp"), MINIMUM_SCALE = c(NA, NA, 0L, 0L, 
0L, NA, NA, NA, NA, NA, NA, NA, NA, 0L), MAXIMUM_SCALE = c(NA, 
NA, 15L, 15L, 0L, NA, NA, NA, NA, NA, NA, NA, NA, 0L), SQL_DATA_TYPE = c(12L, 
12L, 3L, 2L, 4L, 6L, 8L, -4L, -4L, -4L, -4L, 9L, 9L, 9L), SQL_DATETIME_SUB = c(NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 1L, 2L, 3L), NUM_PREC_RADIX = c(NA, 
NA, 10L, 10L, 10L, 10L, 10L, NA, NA, NA, NA, NA, NA, NA), INTERVAL_PRECISION = c(NA_integer_, 
NA_integer_, NA_integer_, NA_integer_, NA_integer_, NA_integer_, 
NA_integer_, NA_integer_, NA_integer_, NA_integer_, NA_integer_, 
NA_integer_, NA_integer_, NA_integer_)), .Names = c("TYPE_NAME", 
"DATA_TYPE", "COLUMN_SIZE", "LITERAL_PREFIX", "LITERAL_SUFFIX", 
"CREATE_PARAMS", "NULLABLE", "CASE_SENSITIVE", "SEARCHABLE", 
"UNSIGNED_ATTRIBUTE", "FIXED_PREC_SCALE", "AUTO_UNIQUE_VALUE", 
"LOCAL_TYPE_NAME", "MINIMUM_SCALE", "MAXIMUM_SCALE", "SQL_DATA_TYPE", 
"SQL_DATETIME_SUB", "NUM_PREC_RADIX", "INTERVAL_PRECISION"), row.names = c(NA, 
14L), class = "data.frame") 

enter image description here

ответ

1

Ошибка будет решена путем изменения параметра в __ID столбце IS_NULLABLE к истине.

В FileMaker это делается путем отключения опции поля Not empty, как показано ниже.

Возможно, кто-то может также объяснить, почему это так? Я только тестировал, что он работает, и смог написать в колонку.

enter image description here