新手试图从 excel 将数据插入 SQL Server 2008
Posted
技术标签:
【中文标题】新手试图从 excel 将数据插入 SQL Server 2008【英文标题】:Newbie trying to insert data into SQL Server 2008 from excel 【发布时间】:2015-02-24 04:06:00 【问题描述】:过去几天我一直在尝试,我一直在做的是谷歌搜索并尝试我能找到和测试的任何代码。我放弃了,希望这里的聪明人能帮助我。
我正在尝试将数据从 Excel 工作表加载到 SQL Server 中现有的表中。所有列和数据属性完全匹配。
当我运行脚本时,它会报错:
运行时错误“-2147217865 (80040e37)”: Microsoft Access 数据库引擎找不到对象“DATA_FOR_CUTTING”。确保对象存在并且正确拼写其名称和路径。如果“DATA_FOR_CUTTING”不是本地对象,请检查您的网络连接或联系服务器管理员
这是脚本(我使用的是 Excel 2010)
Sub Excel_To_SQL()
Dim con As ADODB.Connection
Dim con2 As New ADODB.Connection
Dim s As String
Dim s2 As String
Dim s3 As String
Dim WSP1 As Worksheet
Set con = New ADODB.Connection
Application.DisplayStatusBar = True
Application.StatusBar = "Contacting SQL Server..."
s = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source='C:\Users\xxx\Documents\xxx\xxxx\Book2.xlsx';" _
& "Extended Properties=""Excel 8.0;HDR=Yes;IMEX=0;Readonly=False"";"
' 'HDR = yes - to exclude header of excel file upon reading
con.Open s
s2 = "Provider=SQLOLEDB.1;Persist Security Info=True;User ID=xxx;Password=xxx;Initial Catalog=xxx;Data Source=xxxxx;"
con2.Open s2
s3 = "INSERT INTO dbo.DATA_FOR_CUTTING SELECT * FROM [Data_for_Cutting$]"
con.Execute s3
con.Close
Set con = Nothing
Application.StatusBar = "Data successfully loaded."
End Sub
#
我修复了连接字符串,没有更多错误,但它也没有任何作用。它没有读取工作表的内容,因此没有将行插入到 sql 表中。但是如果我执行“INSERT INTO ... VALUES (XXX)”命令,VALUES 将被插入到 SQL 表中,因此连接和命令正常工作。有人知道为什么它不阅读工作表吗?谢谢。
【问题讨论】:
你的表存在吗?检查给定的表格名称或您提供的工作表名称 您的电子表格是否有一个名为 Data_for_Cutting 的工作表? 我刚刚遇到了这个epplus.codeplex.com,看起来这可以帮助...很多例子。此外,您的错误提到了 Access DB,而您的叙述说 Excel 到 SQL 2008,您是否在 s 中使用了错误的提供程序。 嗨,是的,该表存在于 sql 中,并且在 excel 文件中有一个名为 Data_for_Cutting 的工作表。我会检查 epplus 网站。谢谢! 【参考方案1】:就我个人而言,当我做这种事情时,我会将现有的列标题复制到 SQL Server 的单独工作表中。
然后我复制相应标题下的每一列数据。
然后从右键单击表格后的“编辑前 200 行”选项中,我从 excel 中粘贴数据。
【讨论】:
我认为我同意你的观点。但是 excel 选项卡由多个宏更新,几乎每天都更新,所以我必须提供一种自动将数据加载到 sql 的方法。 excel不是我的。谢谢。 是的,在一次性的基础上,它很棒。虽然不适合你所追求的【参考方案2】:使用 Excel 的组合字符串功能来生成 SQL 怎么样?例如,假设我有这些单元格:
甲乙 姓名 电话 安德烈 555-555-4444 亚历克斯 555-555-3333然后在 C2 单元格中,我可以输入
="insert into mytable(name, phone) values('"&A2&"','"&B2"');"
要处理 10,000 行这样的行,当然只需复制公式即可。
另一方面,要以编程方式执行此操作,您已经有一些代码可以连接到 SQL Server,因此您只需要将 Excel 中的范围转换为 SQL。假设我们假设我们的范围总是将 SQL 字段名称作为第一行,如上所示,那么这个宏就可以解决问题:
' Convert a named range to SQL insert statements. First row must have SQL field names.
Public Function RangeToSQL( _
strExcelRangeName As String, _
strSQLTableName As String, _
Optional strSheetName As String = "Sheet1" _
) As String
Dim rng As Range
Dim sh As Worksheet
Set sh = ThisWorkbook.Worksheets(strSheetName)
Set rng = sh.Range(strExcelRangeName)
Dim i As Long, j As Long, vt As Variant, strFields As String, strValues As String
For j = 1 To rng.Columns.Count
strFields = strFields + IIf(j = 1, "", ",")
strFields = strFields + rng.Cells(1, j).Value
Next j
For i = 2 To rng.Rows.Count
strValues = strValues + IIf(i = 2, "", "," + vbCrLf)
For j = 1 To rng.Columns.Count
strValues = strValues + IIf(j = 1, "(", ",")
vt = rng.Cells(i, j).Value
strValues = strValues + IIf(IsNumeric(vt), CStr(vt), "'" + CStr(vt) + "'")
Next j
strValues = strValues + ")"
Next i
RangeToSQL = "insert into " + strSQLTableName + "(" + strFields + ") values " + strValues + ";"
End Function
对于上面显示的定义为命名范围的单元格,这会生成以下 SQL:
insert into whatevertable(Name,Phone) values ('Andrei','555-555-4444'),
('Alex','555-555-3333');
【讨论】:
感谢您的建议。该选项卡有数千行,并且每天都在变化。并且用户无权访问 sql,所以我必须从 excel 执行 sql 命令。 您可以编写一个宏,该宏基本上与我在上面描述的公式中做的事情相同。因此,您将遍历行,构建一组插入语句,并在完成迭代后通过您的连接发送一大批 SQL。你想要一个小示例代码吗? 我很想看到一个样本:)。谢谢! 更新帖子(示例)。【参考方案3】:发现我使用的 SQL 版本是旧版本,它不适用于 2007(或更高版本),所以我必须使用 2003 版本。
【讨论】:
以上是关于新手试图从 excel 将数据插入 SQL Server 2008的主要内容,如果未能解决你的问题,请参考以下文章