Como fazer upload de uma imagem para o SQL Server em R
Pergunta
Estou criando alguns gráficos que desejo atualizar para uma tabela de banco de dados. O procedimento que estou seguindo é:
- Crie os gráficos como um arquivo PNG/JPEG.
- Leia esse arquivo como um vetor binário
- SQLUPDATE
Meu código para as etapas 2 e 3:
pngfile <- file(<filename>, "rb")
N <- 1e6
repeat{
pngfilecontents <- readBin(pngfile, what="raw", n=N)
if(length(pngfilecontents) == N) N <- 5 * N else break
}
close(pngfile)
Existe uma tabela df_demandpatternmaster no banco de dados com a chave de chave primária, com registro apropriado em vigor com valor nulo no campo PNGFile.
update.query <- "update df_DemandPatternMaster set "
update.query <- paste( update.query, " pngFile = '", serialize(pngfilecontents, NULL) , "' where DemandPatternID = ", , sep="")
d <- sqlQuery(connection, update.query)
Acabei inserindo apenas um byte de dados. A razão pela qual parece é que a pasta vê o vetor serializado e cria um vetor com o texto prefixo e sufixo. Eu também tentei passar o identificador de arquivo PNG diretamente
pngfile <- file(<filename>, "rb")
update.query <- paste( update.query, " pngFile = '", pngfile, "' where DemandPatternID = ", , sep="")
Isso também falha.
Por favor informar.
Solução
Talvez se você colapsar o vetor pngFileContents em uma única string. Algo como:
update.query <- "update df_DemandPatternMaster set "
update.query <- paste( update.query, " pngFile = '", paste(pngfilecontents, collapse="") , "' where DemandPatternID = ", sep="")
Outras dicas
Eu não tentei isso com um banco de dados, mas tive alguns desafios recentemente ao serializar para/para um arquivo de texto. Aqui está um Pergunta que fiz isso pode estar relacionado. Você já tentou usar o interruptor ASCII = T com serialização? Em seguida, tente com e sem RawtoChar.
Não tenho um ambiente fácil para testar seu código, mas estou interessado no que você cria. Estou trabalhando em algum código em que eventualmente estarei seriando objetos e colocando -os em um banco de dados. Ainda não estou até esse ponto.