2014-10-19 67 views
1

我想進口與此代碼的文本文件導入Access 2007數據庫文件:沒有爲一個或多個必需的參數給定值 - 導入文本訪問

Dim test As New cAccess 
test.Connect() 
test.Command.Connection = test.Connection 
test.Command.CommandText = 
     "insert into kvks " & 
     "select f1 as artnr, f2 as [lfdnr-kal], f3 as saln, f4 as suchbegriff, f5 as wert, f6 as eh " & 
     "from [Text;FMT=Delimited;HDR=No;CharacterSet=850;DATABASE=" & txtKvks.Text.Substring(0, txtKvks.Text.LastIndexOf("\")) & "].[" & txtKvks.Text.Substring(txtKvks.Text.LastIndexOf("\") + 1) & "]" 
Dim start As DateTime = Now 
test.Command.ExecuteNonQuery() 

但我得到的錯誤「沒有價值給出一個或多個所需的參數「。

該文本文件用分號分隔(;)。起初我認爲,這是因爲它標識了一行作爲一個字段,因爲標準的分隔符逗號,然後當然其他字段丟失。

我也在同一個目錄下插入了一個schema.ini文件,這個文件存儲在這個目錄中,但結果相同。

可能是什麼問題?

回答

1

此錯誤的一個潛在原因是,當使用帶有Jet/ACE「文本」引擎的schema.ini文件時,[Text;...]數據庫規範中的HDR=No子句將被忽略。

所以,對於名爲現有的表[MyExistingTable]

CREATE TABLE MyExistingTable (
    id INT, 
    firstname TEXT(255) 
) 

名爲 「toImport.txt」

1;Larry 
2;Hank 
3;Artie 

和 「SCHEMA.INI」 的文本文件

[toImport.txt] 
Format=Delimited(;) 

該命令

cmd.CommandText = 
     "INSERT INTO MyExistingTable " & 
     "SELECT F1 AS id, F2 AS firstname " & 
     "FROM [Text;FMT=Delimited;HDR=No;CharacterSet=850;DATABASE=C:\Users\Public].[toImport.txt];" 

會失敗,因爲它會解釋「toImport.txt」的第一行作爲列名:[1][Larry],而不是當包括沒有列名被分配默認[F1][F2]

最簡單的解決方法是添加ColNameHeader=False到「SCHEMA.INI」文件

[toImport.txt] 
Format=Delimited(;) 
ColNameHeader=False 

你也可以變得更加複雜,並添加完整的柱規格進入「SCHEMA.INI」文件(見documentation爲細節)。

另一個可能的原因:

誤差也可以通過被保存爲UTF-8 BOM(字節順序標記)爲「SCHEMA.INI」文件引起的。 Jet「Text」引擎在Unicode之前只支持兩個字符集–「ANSI」或「OEM」–對於均爲數據文件和「schema.ini」文件。

+0

事實上,我在csv文件中有頭文件。所以我更正了SQL語法:'HDR = Yes'和'select *'。我現在沒有得到上面的錯誤信息,而是一個新的:inster into命令有一個未知的字段名稱:'ARTNR; LFDNRKAL; SALN; SUCHBEGRIFF; WERT; EH」。看來,分號不被識別。爲什麼? – derstauner 2014-10-19 16:04:19

+0

您仍然需要一個帶有Format = Delimited(;)的「schema.ini」文件,這樣分號將被識別爲字段分隔符。 – 2014-10-19 17:30:17

+0

但我已經有這個 我也有一個acces數據與這個領域:ARTNR,LFDNRKAL,SALN,SUCHBEGRIFF,WERT,EH。 我有文件夾,其中csv文件位於一個schema.ini文件: [KVKS_1H2_20141001.csv] 格式=分隔(;) ColNameHeader =真 我有此SQL命令: 「插入到kvks select * from [Text; FMT = Delimited; HDR = Yes; CharacterSet = 850; DATABASE =「&txtKvks.Text.Substring(0,txtKvks.Text.LastIndexOf(」\「))&」]。[「 &txtKvks.Text.Substring(txtKvks.Text.LastIndexOf(「\」)+ 1)&「]」 它應該識別分號。我錯了什麼? – derstauner 2014-10-19 18:26:12

相關問題