2016-09-27 34 views
0

Microsoft.ACE.OLEDB.12.0 공급자를 사용하여 Excel 스프레드 시트를 만들려고합니다. net, 나는 255 자 이상을 허용하는 필드를 정의하는 것처럼 보이지 않습니다. 나는 VARCHAR에 255 자로 제한됩니다 이해Microsoft.ACE.OLEDB.12.0을 사용하여 Excel로 내보내기 - 255 자로 제한된 VarChar - 최대 8000 자의 대체 방법이 필요합니다.

create table [table_name] ([column_1] VarChar) 

,하지만 난 더 개최 대안을 알아낼 수 없습니까 :

여기에 테이블을 만들 수있는 내 현재 코드입니다.

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 수입 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

존재하지 않는 데이터 유형 (적어도 사용하지 않으려는 데이터 유형 (있는 경우))을 사용 중이므로 구문 오류가 발생합니다. 당신은 LONGTEXT

EDIT로 column_1에 대한 데이터 유형을 지정해야합니다 : 내가 준 솔루션은 당신이 당신의 생성 문에 알 수없는 데이터 형식을했기 때문에 온다보고 된 첫 번째 오류 당신을위한 것입니다. 경험 한대로 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 개체를 사용하는 ... 나에게 더 실행 가능한 해결책을 보인다. 왜 Excel과 직접 대화 할 수있을 때 OleDb를 사용합니까?

+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