当前位置: 首页 > 知识库问答 >
问题:

如何使用RODBC将数据表保存到数据库生成主键的表中

曹鸿风
2023-03-14

我想使用R脚本在数据库中的现有表中输入一个数据帧,我希望数据库中的表有一个顺序主键。我的问题是RODBC似乎不允许主键约束。

下面是创建我想要的表的SQL:

CREATE TABLE [dbo].[results] (
    [ID]         INT            IDENTITY (1, 1) NOT NULL,
    [FirstName]  VARCHAR (255) NULL,
    [LastName]   VARCHAR (255) NULL,
    [Birthday]   DATETIME      NULL,
    [CreateDate] DATETIME      NULL,
    CONSTRAINT [PK_dbo.results] PRIMARY KEY CLUSTERED ([ID] ASC)
);

和一个带有R代码的测试:

ConnectionString1="Driver=ODBC Driver 11 for SQL Server;Server=myserver; Database=TestDb; trusted_connection=yes"
ConnectionString2="Driver=ODBC Driver 11 for SQL Server;Server=notmyserver; Database=TestDb; trusted_connection=yes"
db1=odbcDriverConnect(ConnectionString1)    
query="SELECT a.[firstname] as FirstName
  , a.[lastname] as LastName
  , Cast(a.[dob] as datetime) as Birthday
  , cast(a.createDate as datetime) as CreateDate
FROM [dbo].[People] a"
results=NULL
results=sqlQuery(db1,query,stringsAsFactors=FALSE)
close(db1)

db2=odbcDriverConnect(ConnectionString)
sqlSave(db2, 
    results, 
    append = TRUE, 
    varTypes=c(Birthday="datetime", CreateDate="datetime"),
    colnames = FALSE,  
    rownames = FALSE,fast=FALSE)
close(db2)
CREATE TABLE [dbo].[results] (
    [FirstName]  VARCHAR (255) NULL,
    [LastName]   VARCHAR (255) NULL,
    [Birthday]   DATETIME      NULL,
    [CreateDate] DATETIME      NULL
);

共有1个答案

景承教
2023-03-14

问题出在http://github.com/cran/rodbc/blob/master/r/sql.r中的第361行--data.frame和DB表必须具有完全相同的列数,否则使用StackTrace会出现以下错误:

Error in dimnames(x) <- dn : 
  length of 'dimnames' [2] not equal to array extent 
3. `colnames<-`(`*tmp*`, value = c("ID", "FirstName", "LastName", 
   "Birthday", "CreateDate")) at sql.R#361
2. sqlwrite(channel, tablename, dat, verbose = verbose, fast = fast, 
   test = test, nastring = nastring) at sql.R#211
1. sqlSave(db2, results, append = TRUE, varTypes = c(Birthday = "datetime", 
    CreateDate = "datetime"), colnames = FALSE, rownames = FALSE, 
    fast = FALSE, verbose = TRUE) 

如果将ID列添加到data.frame中,则不能再使用autoincID列,因此这不是解决方案(或变通方法)。

针对rodbc::sqlsave的“相同列”限制的“简单”解决方案是:

    null

一个更好的选择是使用新的ODBC包,该包还通过类似大容量的插入提供更好的性能,而不是发送单个INSERT语句,如RODBCdoes:

https://github.com/r-dbi/odbc

查找函数dbwritetable(它是接口DBI::dbwritetable的实现)。

 类似资料:
  • 这是我的实体 > 我的问题是我不知道为什么我的http请求不能工作 我正在使用ARC应用程序测试requette这是错误 “状态”:500, “错误”:“内部服务器错误”, “异常”:“org.springframework.beans.conversionNotSupportedException”, “消息”:“无法将”java.lang.Long“类型的属性值转换为属性”fa“的必需类型”c

  • 这是使用PHP将数据从(HTML)表单保存到MySQL数据库的规范问答。 如果您正在尝试执行以下操作,则此操作适用于您: 接受HTML表单上的用户输入 使用PHP脚本处理输入 将所述输入存储到MySQL数据库中。 过去提出的不应使用的类似问题的例子: 连接PHP代码并将表单提交到mySQL数据库 使用PHP/html表单插入mySQL-不工作 如何使用PHP将html表单数据传递到mySQL db

  • 我面临着使用Spring数据JPA存储库将数据保存到数据库的问题。 我的场景是:我使用循环逐个收集和保存数据。收集所有数据需要很多时间。因此,我想将每个记录的数据立即保存到表中并保存到数据库中。我正在使用saveAndFlush方法,但数据并没有立即保存到表中。 我迫不及待地要收集所有数据,因为收集所有数据可能需要一整天。

  • 问题内容: 我有一个Java类,正在使用iText库生成PDF文件。现在,根据我的需要,我必须将生成的PDF文件保存到MySQL数据库表中,但是我不知道该怎么做。 我担心的是: 我应该在PDF表的MySQL列中使用哪种 数据类型 来保存PDF文件 哪个查询会将生成的PDF文件插入数据库 目前,我正在生成PDF文件,并将其存储到本地磁盘的硬编码文件路径中。 这是我的Java PDF生成代码: 请帮我

  • 问题内容: 如何将表单数据保存在文件或本地db(也许使用AJAX)中,该文件或数据通过表单操作将数据发送到外部db? 我的表单的源代码在这里:http : //jsbin.com/ojUjEKa/1/edit 我应该对代码进行哪些更改(如果有)? 对。因此,我能够使用AJAX将数据存储到localStorage中,并希望将存储的数据发送到名为backend.php的文件中。这是我的html文件:

  • 问题内容: 我想做的是使用ajax和php将数据库表数据放入索引页中的html表。 我的问题是数据没有显示。有人知道我的代码有什么问题吗? 的HTML: 脚本: process.php 问题答案: 至少,这是: 需要是: 因为您在寻找,而不是标签。 但是,正如西奥多(Theodore)的评论中所述,您确实想要: