我一直在尝试这几天,我一直在做的是谷歌搜索和尝试我能找到的任何代码并测试。我放弃了,希望这里的才华横溢的人能帮助我。
我正在尝试将数据从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表中,因此连接和命令正在运行。有谁知道为什么它没有阅读工作表?感谢。
答案 0 :(得分:0)
如何使用Excel组合字符串以生成SQL?例如,让我们说我有这些细胞:
A B Name Phone Andrei 555-555-4444 Alex 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');
答案 1 :(得分:0)
就个人而言,当我做这种事情时,我将现有的列标题复制到SQL Server的单独表格中。
然后我复制相应标题下的每一列数据。
然后从"编辑前200行"右键单击表后选项,我从excel中粘贴数据。
答案 2 :(得分:0)
发现我使用的SQL版本是旧版本,它不适用于2007(或更新版本),所以我必须使用2003版本。