2016-09-27 10 views
0

Я пытаюсь создать электронную таблицу Excel с помощью поставщика Microsoft.ACE.OLEDB.12.0 в vb. net, и я не могу определить поле, которое допускает более 255 символов.Экспорт в Excel с использованием Microsoft.ACE.OLEDB.12.0 - VarChar ограничен 255 символами - требуется более длинная альтернатива для 8000 символов

Вот мой текущий код, чтобы создать таблицу:

create table [table_name] ([column_1] VarChar) 

Я понимаю, что VarChar ограничен до 255 символов, но я не могу понять, альтернативу, которая будет содержать больше.

Я попытался это:

create table [table_name] ([column_1] LongVarChar) 

и получил «Ошибка синтаксиса в определении поля» исключение.

Аналогично, я пробовал LongVarWChar, Memo, NText (8000), ... с теми же результатами. Какие-либо предложения?

EDIT: Вот моя строка соединения:

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

EDIT 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 

Исключение получает последний вызов ExecuteNonQuery в подписи Button1_Click. Вместо «LongText» я пробовал много разных типов данных, включая группу, которая недействительна для источника данных Excel с использованием механизма Ace. Я ничего не нашел, что позволило мне вставить строку длиной более 255 символов.

ответ

0

Вы получаете синтаксическую ошибку, потому что используете типы данных, которых не существует (по крайней мере, где вы пытаетесь их использовать, они отсутствуют, если вообще). Вам необходимо указать тип данных для column_1 в LONGTEXT

EDIT: Решения, которое я дал для первой ошибки вашего сообщили, что приходит, потому что вы имели неизвестный тип данных в вашем создании заявления. Как вы уже поняли, вместо этого LONGTEXT избавился от этой ошибки. Тем не менее, эта ссылка:

Excel unable to insert more than 255 chars?

Кажется, чтобы предположить, что это ограничение в Excel, это довольно старый вопрос, но у меня была такая же проблема, когда я просто попытался его в офисе 2013. Это может быть струя -одно. Другой вопрос здесь, ссылка:

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

Opts использовать объект Excel непосредственно ... Мне кажется, что более эффективное решение. Зачем использовать OleDb, когда вы можете напрямую разговаривать с Excel?

+0

Это то, что я предположил, что типы данных недействительны для драйвера Ace. Я пробовал LongText, и это вызывает одно и то же исключение. \t Дополнительная информация: Поле слишком мал, чтобы принять количество данных, которые вы пытались добавить. Попробуйте вставить или вставить меньше данных. Мне кажется, что мне здесь что-то не так просто, просто не могу понять. – user3613310

+0

Ну, как оказалось, закрывая соединение после создания таблицы, а затем снова открывая его для вставки данных, заставляет драйвер Ace думать, что столбец является текстом, поскольку нет никаких датаров, присутствующих при повторном открытии соединения. Все, что мне нужно было сделать, это поддерживать связь между созданием и вставкой, и это работало как шарм. Спасибо за руководство Jeroen, я всегда ценю возможность поговорить с кем-то. – user3613310

+0

@ user3613310 добавьте это как ответ на этот вопрос и установите его на принятый ответ. Это поможет кому-то еще. Рад, что вы разобрались! – Jeroen

0

Вот код, который работал для меня. Ключом является создание таблицы с полем типа LongText, а затем вставка в таблицу без закрытия соединения. Если вы закрываете соединение и снова открываете его, драйвер Ace сканирует первые несколько строк, чтобы определить тип данных. Поскольку не было бы данных, если вы закрываете соединение после создания таблицы, он решает, что текст является правильным типом, а не 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