2017-10-06 60 views
1

我使用DBI包和odbc包连接到SQL Server数据库。我正在尝试编写一个表格,其中列出了field.types参数指定的列类型。出于某种原因,这不起作用,R在编写时选择自己的数据类型。从SQL Server数据库的R DBI包中使用dbWriteTable时,Field.types不起作用

重复的例子:

table <- data.frame(
    col1 = 1:2, 
    col2 = c("a", "b") 
) 

con <- dbConnect(
    odbc::odbc(), 
    dsn = "dsn", 
    UID = login, 
    PWD = password, 
    Port = 1433 
) 

dbWriteTable(
    conn = con, 
    value = table, 
    name = "tableName", 
    row.names = FALSE, 
    field.types = c(
    col1 = "varchar(50)", 
    col2 = "varchar(50)" 
) 
) 

结果:

  1. 我怎样才能更正我上面的例子:一个名为 “表名” 的列

    [col1] [int] NULL, 
    [col2] [varchar](255) NULL 
    

    我问表,这样两列的数据库上的列类型将为varchar(50)

  2. 如何正确使用其他示例的field.types参数?

我想知道的是,什么是“类型”我应该用:我需要“内部”或“整数”或“INT”(R是大小写敏感的,所以可能重要)?然后,我在哪里可以找到这些数据类型的列表?我曾尝试使用dbDataType,但使用此函数返回的类型也不起作用。还是我在做其他事情?

在此先感谢您的帮助。

回答

1

我想你的示例(性能稍微修改):

lybrary(RMySQL) 
lybrary(lubridate) 

conn=dbConnect(MySQL(), user='root', password='', dbname='DB', host='localhost') 

table <- data.frame(
    col1 = 1:2, 
    col2 = c("a", "b"), 
    col3 = c(now(), now()+seconds(1)) 
) 

dbWriteTable(
    conn = conn, 
    name='test_DB', 
    value = table, 
    row.names = FALSE, 
    field.types = c(
     col1 = "varchar(50)", 
     col2 = "varchar(50)", 
     col3 = 'timestamp' 
) 
) 

和它顺利工作:declare_data_typed_dbWriteTable

至少以下数据类型被接受(从DBI documentation):

  • 整数
  • numeric
  • logical为布尔值(某些后端可能返回的整数)
  • NA
  • 字符
  • 因子(绑定为字符,与警告)
  • 日期
  • POSIXct时间戳
  • POSIXlt时间戳的
  • 列表原始为blob(对于NULL NULL值,为NULL条目)
  • blob :: blob类型的对象
+0

你说得对。我重试了这个,现在它可以工作。很奇怪。我不确定这里发生了什么,但我很高兴它现在可以工作。谢谢! – Willem

相关问题