我正在尝试使用vb.net中的Microsoft.ACE.OLEDB.12.0提供程序创建Excel电子表格,而我似乎无法定义允许超过255个字符的字段。
这是我当前创建表格的代码:
create table [table_name] ([column_1] VarChar)
据我所知,VarChar限制为255个字符,但我无法找到可以容纳更多字符的替代字符。
我试过这个:
create table [table_name] ([column_1] LongVarChar)
并在字段定义中出现“语法错误”异常。
同样,我尝试过LongVarWChar,Memo,NText(8000),......结果相同。有什么建议吗?
编辑:这是我的连接字符串:
"Provider=Microsoft.ACE.OLEDB.12.0;" &
"Data Source=" & destinationFile & ";" &
"Extended Properties=""Excel 12.0 Xml;HDR=YES"";"
编辑2:这是我正在尝试做的基本想法
导入System.Data.OleDb Imports 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 :(得分:0)
您收到语法错误,因为您使用的数据类型不存在(至少在您尝试使用它们的地方,如果有的话)。您需要将column_1的数据类型指定为LONGTEXT
编辑:我提供的解决方案是针对您报告的第一个错误,因为您在create语句中有一个未知的数据类型。正如您所经历的那样,使用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对象......对我而言,这似乎是更可行的解决方案。当您可以直接与Excel交谈时,为什么要使用OleDb?
答案 1 :(得分: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