2016-09-27 334 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 
相关问题