2015-02-24 59 views
1

我一直在嘗試過去的幾天,我一直在做的是使用谷歌搜索和嘗試任何代碼,我可以找到並測試出來。我放棄了,希望這裏的聰明人能幫助我。新手試圖從excel插入數據到SQL Server 2008

我想從Excel工作表中的數據加載到SQL Server中已經存在的表。所有列和數據屬性都完全匹配。

當我運行該腳本,它提供了一個錯誤:

Run-time error '-2147217865 (80040e37)':
The Microsoft Access database engine could not find the object 'DATA_FOR_CUTTING'. Make sure the object exists and that you spell its name and the path correctly. If the 'DATA_FOR_CUTTING' is not a local object, check your network connection or contact the server administrator

這是腳本(我用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

是你的表存在嗎?檢查您提供的表名或您提供的工作表名稱 – 2015-02-24 04:27:58

+0

您的電子表格是否有名爲Data_for_Cutting的工作表? – Mych 2015-02-24 10:40:00

+0

我剛剛遇到這個http://epplus.codeplex.com/它看起來像這可以幫助...很多的例子。此外,你的錯誤提到Access DB,而你的narative說Excel到SQL 2008是你在s中使用錯誤的提供者。 – Mych 2015-02-24 11:01:22

回答

0

如何使用Excel的能力來編寫字符串以生成SQL?舉例來說,假設我有這些細胞:

 
A  B 
Name Phone 
Andrei 555-555-4444 
Alex 555-555-3333 

然後在C2單元格,我可以進入

="insert into mytable(name, phone) values('"&A2&"','"&B2"');"

,並處理10000點這樣的行,當然簡單的複製公式。另一方面,要以編程方式執行此操作,您已經有一些代碼連接到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'); 
+0

感謝您的建議。該選項卡具有數千行,並且每天都會更改。並且用戶沒有權限訪問sql,所以我必須從excel執行sql命令。 – juvethski 2015-02-24 14:00:20

+0

你可以編寫一個基本上和我上面描述的公式做同樣的事情的宏。因此,您可以迭代各行,構建一組插入語句,並在完成迭代時僅通過連接發送一大批SQL。你想要一個小樣本代碼嗎? – user62177541 2015-02-25 00:37:02

+0

我很想看到一個樣本:)。謝謝! – juvethski 2015-02-25 01:33:05

0

個人當我在做這種事情我現有的列標題複製出到從SQL Server另紙。

然後我複製相應標題下面的每列數據。

然後在右鍵單擊表格後從「Edit top 200 rows」選項中粘貼來自excel的數據。

+0

有一次我認爲我同意你的看法。但excel選項卡由多個宏更新,幾乎每天都這樣,我必須提供一種自動化的方式來將數據加載到sql。 excel不是我的。謝謝。 – juvethski 2015-02-24 13:58:13

+0

是的,在一次性的基礎上,它很棒。不適合你之後的事情 – 2015-02-24 15:21:50

0

發現我使用的SQL版本是舊版本,它不適用於2007年(或更新版本),所以我必須使用2003版本。