2017-05-31 57 views
1

vb.netを使用してExcelからSQL Serverデータベースにデータをインポートしています。私のExcelファイルでは、列bNumberに、異なる種類の値がありますいくつかの数字であり、一部はテキストです。すなわち:私はOleDbCommandを通じてExcelからデータを選択するとvb.netを使用してExcelからSQL Serverにデータをインポート

Telenorx 
Telenorx 
8 
97150219924 
97150219924 
97150219924 
97150219924 
Easypayx 
92 

、それは正しく番号を取得しますが、テキスト値として空白。

Excelでは、列のデータ型はGeneralです。

これはExcelからデータを取得するためのコードです。

excelConn = New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data 
Source= " + OpenFileDialog1.FileName + ";Extended Properties=""Excel 12.0 
Xml;HDR=Yes""") 
Dim oleDbCommand As OleDbCommand = New OleDbCommand("Select bNumber from 
[Sheet1$]", excelConn) 
excelConn.open() 
Dim dataReader = oleDbCommand.ExecuteReader 
dataReader.read() 
+0

SQLデータタイプは何ですか? – Mederic

+0

ここで何をしているのか、いくつかの詳細を教えてください。どのようにデータをクエリしていますか?私たちに何かを与えてください。 –

+0

コードに問題がある場合は、そのコードを投稿する必要があります。どこかにバグがあると言う以外は助けるのは不可能です –

答えて

1

これは必ずしもあなたのケースのためのソリューションではありません、まだ私はでExcelファイルを置いExcelにエクスポートするためにSQL-Server Management Studioを使用し、nvarchar型としてbNumberとSQL-Serverのテーブルを作成しましたでしたでしょうプロジェクトのbin \ Debugフォルダに移動します。以下のコードを使用すると、すべての行が適切に返されます(文字列が返されるため)。

ここでのキーは、接続文字列でIMEX = 1を使用しているため、Excelが厄介になる可能性があります。これは問題を解決する場合もありません。

Imports System.Data.OleDb 
Public Class Operations 
    Public Function GetData(ByVal FileName As String) As List(Of String) 
     Dim valueList As New List(Of String) 
     Using cn As New OleDbConnection With 
      { 
       .ConnectionString = ConnectionString(FileName) 
      } 
      Using cmd As OleDbCommand = New OleDbCommand("SELECT bNumber FROM [Table_1$]", cn) 
       cn.Open() 
       Dim reader As OleDbDataReader = cmd.ExecuteReader 
       While reader.Read 
        valueList.Add(reader.GetString(0)) 
       End While 
      End Using 
     End Using 
     Return valueList 
    End Function 
    Public Function ConnectionString(ByVal FileName As String) As String 
     Dim Builder As New OleDbConnectionStringBuilder 
     If IO.Path.GetExtension(FileName).ToUpper = ".XLS" Then 
      Builder.Provider = "Microsoft.Jet.OLEDB.4.0" 
      Builder.Add("Extended Properties", "Excel 8.0;IMEX=1;HDR=Yes;") 
     Else 
      Builder.Provider = "Microsoft.ACE.OLEDB.12.0" 
      Builder.Add("Extended Properties", "Excel 12.0;IMEX=1;HDR=Yes;") 
     End If 

     Builder.DataSource = FileName 

     Return Builder.ConnectionString 

    End Function 
End Class 

フォームコードIDEの出力ウィンドウに

Private Sub Button3_Click(sender As Object, e As EventArgs) _ 
    Handles Button3.Click 

    Dim ops As New Operations 
    Dim fileName As String = IO.Path.Combine(
     AppDomain.CurrentDomain.BaseDirectory, "Downloaded.xlsx") 
    Dim valueList As List(Of String) = ops.GetData(fileName) 
    For Each value As String In valueList 
     Console.WriteLine(value) 
    Next 
End Sub 

結果

enter image description here

表構造

enter image description here

ワークシート

enter image description here

EDIT:SpreadSheetLightライブラリを操作するためのMSDNのコードサンプルには次のリンクポイント。ダウンロードしたら、スタートアップフォームをStackOverFlow1QuestionMixedTypesFormに設定します。ソリューションエクスプローラでソリューションを右クリックし、 "Restore NuGet Packages"を選択し、プロジェクトをビルドして実行します。フォームには2つのボタンがあり、最初にSheet1の混合タイプを、ボタン2は同じデータの変形をSheet2に配置しています。

コードサンプルhttps://code.msdn.microsoft.com/Alternate-methods-to-work-4c52c4a2

+0

あなたの努力と懸念に感謝します。あなたは私が提供したExcelの値を入力するだけですが、そうではありません。列の種類が「一般」なので、私の問題はExcelファイルにあります。私はそれとしてデータを選択した場合、私のクエリは一般的な 'テキスト'を取得することができませんし、私は 'テキスト'に列の種類を変更すると、すべてのデータをフェッチすることができますが、 9.23495E + 11, 9.23495E + 11, 9.23494E + 11。また、私はユーザーがExcelの列タイプを変更することを迷惑にならないようにしたい。 –

+0

別の方法を開いている場合は、SpreadSheetLightという便利なライブラリがあります。このライブラリは、Excelデータを読み込む際の自由度が増します。欠点はすべて自分のサイトのC#にありますが、今週は、MSDNのコードサンプルを作成して、一般的な操作の大部分を示しています。今朝は最初の返信に追加できる実行例を作成しました私に知らせてください(それはVB.NETにあります) –

+0

はい、私はそれを感謝し、私もC#でコード化することができます。ちょうど私のExcelファイルが異なるデータ型の複数の列を持っていることを考慮に入れて、私はあなたがExcelファイルを開くことがユーザにとって不便であると思うので、私のアプリのユーザが列のデータ型を変更しないようにしたい、列のデータ型を変更し、私のアプリに来て、ファイルをアップロードします。外部からのファイルをExcelで受信し、アプリユーザーがファイルを選択してデータをアップロードするだけであることにも注意してください。 –

関連する問題