2016-09-27 60 views
0

我正嘗試在vb中使用Microsoft.ACE.OLEDB.12.0提供程序創建Excel電子表格。淨,我似乎無法定義一個字段,允許超過255個字符。使用Microsoft.ACE.OLEDB.12.0導出到Excel - VarChar限制爲255個字符 - 需要更長的備選方案,最多8000個字符

這裏是我當前的代碼來創建表:

create table [table_name] ([column_1] VarChar) 

我明白的VarChar被限制在255個字符,但我無法弄清楚,將舉行更多的選擇。

我已經試過這樣:

create table [table_name] ([column_1] LongVarChar) 

,並得到了「字段定義語法錯誤」的異常。

同樣,我試過LongVarWChar,備忘錄,NText(8000),...具有相同的結果。有什麼建議麼?

編輯:這是我的連接字符串:

"Provider=Microsoft.ACE.OLEDB.12.0;" & 
"Data Source=" & destinationFile & ";" & 
"Extended Properties=""Excel 12.0 Xml;HDR=YES"";" 

編輯2:這裏是我想要做的

進口System.Data.OleDb 進口System.Text的基本思路

Public Class Form1 
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 
     dim destinationFile = "c:\users\dell\desktop\test\test_" & Now.ToString("yyyyMMdd_HHmmssfffff") & ".xlsx" 
     Dim oleDbConnString = 
       "Provider=Microsoft.ACE.OLEDB.12.0;" & 
       "Data Source=" & destinationFile & ";" & 
       "Extended Properties=""Excel 12.0 Xml;HDR=YES"";" 
     Dim oleDbConn as New OleDbConnection(oleDbConnString) 
     Dim oleDbComm as New OleDbCommand("create table Sheet1 (column_1 LongText);", oleDbConn) 

     oleDbConn.Open 
     oleDbComm.ExecuteNonQuery 
     oleDbConn.Close 

     Dim bigText as New StringBuilder() 
     For i = 0 to 255 
      bigText.Append(".") 
     Next 
     oleDbComm.CommandText = "insert into Sheet1(column_1) values ('" & bigText.ToString & "');" 

     oleDbConn.Open 
     oleDbComm.ExecuteNonQuery 
     oleDbConn.Close 

     Process.Start(destinationFile) 
    End Sub 
End Class 

在Button1_Click子項的最後一個ExecuteNonQuery調用中拋出異常。代替「LongText」,我嘗試了許多不同的數據類型,包括一些對於使用Ace引擎的Excel數據源無效的數據類型。我發現沒有任何東西允許我插入大於255個字符的字符串。

回答

0

由於您使用的數據類型不存在(至少在您嘗試使用它們時(如果有的話),您會得到語法錯誤。你需要指定COLUMN_1您的數據類型爲LONGTEXT

編輯:我給的解決方案是第一個錯誤的報道,因爲你必須在你創建語句中的未知數據類型的出現。正如你所經歷的,使用LONGTEXT代替了那個錯誤。然而,此鏈接:

Excel unable to insert more than 255 chars?

似乎表明,它是在Excel中的限制,這是一個相當古老的問題,但我有同樣的問題,當我剛剛試了一下在Office 2013這可能是噴引擎本身。這裏還有一個問題,鏈接:

c# Error inserting to Excel when string data is more than 255 chars

選擇只直接使用Excel對象......對我來說,似乎更可行的解決方案。爲什麼使用OleDb可以直接與Excel交談?

+0

這就是我所假設的,數據類型不適用於Ace驅動程序。我嘗試了LongText,並且拋出了相同的異常。 \t 附加信息:該字段太小,無法接受您嘗試添加的數據量。嘗試插入或粘貼更少的數據。我覺得我在這裏錯過了很簡單的東西,只是無法弄清楚。 – user3613310

+0

事實證明,在創建表之後關閉連接,然後重新打開以插入數據,導致Ace驅動程序認爲該列是文本,因爲當它重新打開連接時沒有任何數據行存在。我所要做的只是保持創建和插入之間的連接,並像魅力一樣工作。感謝Jeroen的指導,我總是喜歡能夠與某人交談。 – user3613310

+0

@ user3613310添加作爲這個問題的答案,並將其設置爲接受的答案。它會幫助別人。很高興你把事情解決了! – Jeroen

0

下面是爲我工作的代碼。關鍵是創建帶有LongText類型字段的表,然後在不關閉連接的情況下插入表中。如果關閉連接並重新打開連接,則Ace驅動程序將掃描前幾行以確定數據類型。由於如果在創建表之後關閉連接,則不會有數據存在,因此它會決定Text是正確的類型,而不是預期的LongText。

Public Class Form1 
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 
     Dim destinationFile = "c:\users\dell\desktop\test\test_" & Now.ToString("yyyyMMdd_HHmmssfffff") & ".xlsx" 
     Dim oleDbConnString = 
       "Provider=Microsoft.ACE.OLEDB.12.0;" & 
       "Data Source=" & destinationFile & ";" & 
       "Extended Properties=""Excel 12.0 Xml;HDR=YES"";" 
     Dim oleDbConn as New OleDbConnection(oleDbConnString) 
     Dim oleDbComm as New OleDbCommand("create table Sheet1 (column_1 LongText);", oleDbConn) 

     Dim bigText as New StringBuilder() 
     For i = 0 to 255 
      bigText.Append(".") 
     Next 

     oleDbConn.Open 
     oleDbComm.ExecuteNonQuery 
     'after creating the table with column of datatype LongText, 
     'you mustn't close the connection prior to inserting text longer 
     'than 255 characters - keep it open!! 
     oleDbComm.CommandText = "insert into Sheet1(column_1) values ('" & bigText.ToString & "');" 
     oleDbComm.ExecuteNonQuery 
     oleDbConn.Close 

     Process.Start(destinationFile) 
    End Sub 
End Class 
相關問題