新手试图从excel插入数据到SQL Server 2008

时间:2015-02-24 04:06:01

标签: sql vb.net excel sql-server-2008 insert

我一直在尝试这几天,我一直在做的是谷歌搜索和尝试我能找到的任何代码并测试。我放弃了,希望这里的才华横溢的人能帮助我。

我正在尝试将数据从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表中,因此连接和命令正在运行。有谁知道为什么它没有阅读工作表?感谢。

3 个答案:

答案 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版本。