首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将表值复制到新表

将表值复制到新表
EN

Stack Overflow用户
提问于 2013-08-28 07:24:29
回答 3查看 759关注 0票数 4

你好,我正在尝试使用Select * INTO query将excel工作表中的值复制到同一个数据库中的新表中。

提取到excel的数据是从其他表中提取出来的,在编辑了excel中的一些列后,我需要将excel表发送回SQL数据库,并创建新的表。

我的代码出现了问题,代码上写的是错误:

代码语言:javascript
复制
Run- time error '-2147217900 ' Automation Error

我使用VBA宏从Excel导入表值并将其导出到SQL。

这是我的密码

代码语言:javascript
复制
Dim adoCN As ADODB.Connection
Dim sConnString As String
Dim sSQL As String
Dim lRow As Long, lCol As Long

sConnString = "Provider=sqloledb;Server=;Database=mycon;User Id=;Password="

Set adoCN = CreateObject("ADODB.Connection")

adoCN.Open sConnString

'Assumes that you have Field1, Field2 and Field3 in columns A, B and C
'For this example we can assume that the data exists on Sheet1, with a header on row
'1 and data in rows 2-11
'Also assume that the fields are defined as character (e.g. varchar or char)
'Text values must be enclosed in apostrophes whereas numeric values should not.

'adoCN.Open

For lRow = 1 To ActiveSheet.UsedRange.SpecialCells(xlCellTypeLastCell).Row

sSQL = "SELECT * INTO TestTable FROM Sheets(1)$"

***adoCN.Execute sSQL***

Next lRow

adoCN.Close

Set adoCN = Nothing


'On Error GoTo 0

行错误:adoCN.Execute sSQL

请帮帮我。

EN

回答 3

Stack Overflow用户

发布于 2013-09-09 14:00:36

我确信错误是SQL没有识别“Sheet(1)$”。短语I "sSQL“被发送到adodb.connection中,因此它不在adodb.connection中处理(尽管从Excel调用)。因此,来自Excel的任何引用都必须作为字符串传递到那里,否则将导致错误。

我不会一次将整个表放入SQL中,而是按行执行这一行,因为如果您有任何数据问题(字符串到长、错误的数据格式),整个表将被抛回。

我会让它类似于http://www.vb-magazin.de/forums/forums/post/9581.aspx

(如果您需要帮助翻译这篇文章,请告诉我)

...with的一个重要区别是:在每个"add.new“成功之后,我会在Excel行中添加一个备注,所以肯定不会再传送第二次。对此,您将在dbRecord.Update后放置行

代码语言:javascript
复制
xls_Appl.ActiveCell.Offset(I,6).Value = "send_to_sql"

当然,在每一行开始处理之前,您会想要检查这个文本是否已经存在,如果是这样的话,请转到下一个项目。

我希望这能帮到你,麦克斯

票数 1
EN

Stack Overflow用户

发布于 2013-09-11 14:42:55

简单地说,你不能这么做。

First:选择* INTO TestTable

您只能运行此语句一次。您正在尝试为电子表格中的每一行创建相同的表。

第二名:.单张(1)$

我对VBA不是很有信心,但我想您希望从ADO.NET中得到一些神奇的东西。

你需要:

  1. 在FOR之外创建表
  2. 插入到FOR的内部
票数 1
EN

Stack Overflow用户

发布于 2013-09-12 13:04:51

我能看到代码有一些问题。

首先,不能只通过SQL语句传递工作表的名称。Server甚至不知道您的工作表(或Excel )的存在。它们是完全不同的例子。

第二,正如有人已经指出的那样,每次运行"SELECT * INTO ..."语句时,实际上都要创建一个只有一行的新表。

你应该这样做。我假设(正如您在评论中所述),TestTable已经存在于数据库中,而且您的工作表实际上是Sheets(1)。另外,您还没有告诉哪一列有哪种格式,所以我假设它们都是字符串,并将引号放在语句中的值周围。

代码语言:javascript
复制
Dim adoCN As ADODB.Connection
Dim sConnString As String
Dim sSQL As String
Dim lRow As Long, lCol As Long

sConnString = "Provider=sqloledb;Server=;Database=mycon;User Id=;Password="

Set adoCN = CreateObject("ADODB.Connection")

adoCN.Open sConnString

With Sheets(1)

For lRow = 1 To ActiveSheet.UsedRange.SpecialCells(xlCellTypeLastCell).Row

  sSQL = "INSERT INTO TestTable VALUES ('" & .Cells(lRow, 1) & "', '" & .Cells(lRow, 2) & "', '" & .Cells(lRow, 3) & "')"

  adoCN.Execute sSQL

Next lRow

End With

adoCN.Close

Set adoCN = Nothing
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18481685

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档