2016-09-27 54 views
0

vbでMicrosoft.ACE.OLEDB.12.0プロバイダを使用してExcelスプレッドシートを作成しようとしています。ネット、私は255文字以上を許可するフィールドを定義するように見えることはできません。ここでMicrosoft.ACE.OLEDB.12.0を使用してExcelにエクスポート - 255文字に制限されたVarChar - 最大8000文字の代替代替が必要

は、テーブルを作成するために、私の現在のコードです:

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"";" 

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 

例外は、Button1_Clickサブコマンドの最後のExecuteNonQuery呼び出しでスローされます。 「LongText」の代わりに、Aceエンジンを使用するExcelデータソースには有効ではない束など、さまざまな種類のデータを試しました。 255文字以上の文字列を挿入できるものは何も見つかりませんでした。

答えて

0

存在しないデータ型を使用しているため構文エラーが発生しています。私が与えたソリューションは、あなたの作成文で不明なデータ型を持っていたのでアップしてくる最初のエラー、あなたの報告のためのものです:あなたはEDIT

LONGTEXTとして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

は、直接Excelのオブジェクトを使用するように...私にはもっと現実的なソリューションを思わ付き合えません。なぜあなたはExcelに直接話すことができるときにOleDbを使用するのですか?

+0

これは私が想定していたことですが、そのデータ型はAceドライバでは無効です。私はLongTextを試しました、そして、それは同じ例外をスローします。 \t 追加情報:このフィールドは、追加しようとしたデータ量を受け入れるには小さすぎます。少ないデータを挿入または貼り付けてみてください。私はここでかなり単純なものを見逃しているように感じます。ただそれを理解できません。 – user3613310

+0

テーブルが作成された後に接続を閉じると、データを挿入するために再度開くと、Aceドライバは列がテキストであると考えるようになります。私がしなければならなかったことは、作成と挿入の間の接続を開いたままにしておくことでした。ガイダンスのおかげで、ジェーレン、私はいつも誰かと何かを話すことができて感謝しています。 – user3613310

+0

@ user3613310これをこの質問の回答として追加し、それを受け入れられた回答に設定します。それは他の誰かを助けるでしょう。あなたがそれを整理してうれしい! – Jeroen

0

私のために働くコードは次のとおりです。キーは、LongText型のフィールドを持つテーブルを作成してから、接続を閉じずにテーブルに挿入することです。接続を閉じて再度開くと、Aceドライバは最初の数行をスキャンしてデータ型を判別します。テーブルを作成した後に接続を閉じるとデータが存在しないため、意図したとおりにLongTextではなく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) 

     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 
関連する問題