Sql server 使用vb.net将数据从Excel导入SQL Server

Sql server 使用vb.net将数据从Excel导入SQL Server,sql-server,excel,vb.net,Sql Server,Excel,Vb.net,我正在使用vb.net将Excel中的数据导入SQL Server数据库。在我的Excel文件的B列中,有不同类型的值,即有些是数字,有些是文本: Telenorx Telenorx 8 97150219924 97150219924 97150219924 97150219924 Easypayx 92 当我通过OleDbCommand从Excel中选择数据时,它正确地检索数字,但文本值为空 在Excel中,列的数据类型为常规 这是我从Excel检索数据的代码 excelConn = New

我正在使用vb.net将Excel中的数据导入SQL Server数据库。在我的Excel文件的B列中,有不同类型的值,即有些是数字,有些是文本:

Telenorx
Telenorx
8
97150219924
97150219924
97150219924
97150219924
Easypayx
92
当我通过OleDbCommand从Excel中选择数据时,它正确地检索数字,但文本值为空

在Excel中,列的数据类型为常规

这是我从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()

对于您的案例,这不一定是一个解决方案。我创建了一个SQL Server表,bNumber为nvarchar,使用SQL Server Management Studio导出到Excel,我将Excel文件放在项目的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
表格代码

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
结果显示在IDE输出窗口中

表结构

工作表

编辑:以下链接指向使用SpreadSheetLight库的MSDN代码示例。下载后,将启动表单设置为StackOverFlow1QuestionMixedTypesForm。右键单击解决方案资源管理器中的解决方案,然后选择Restore NuGet Packages,立即构建并运行项目。表单上有两个按钮,第一个按钮用于表单1的混合类型,而第二个按钮是表单2中不同布局的相同数据的变体


代码示例

您的SQL数据类型是什么?您能提供一些您在这里执行的操作的详细信息吗?您如何查询数据?给我们一些东西。如果你的代码有问题,你应该发布代码。除了说你有一个bug,我已经更新了我的问题,这是无法帮助的。谢谢你的努力和关注。您只需在excel中键入我提供的值,但实际情况并非如此。我的问题在excel文件中,因为列类型为“常规”。如果按原样选择数据,则查询无法按常规检索“Text”,如果将列类型更改为“Text”,则可以提取所有数据,但数字会变成这样。9.23495E+11、9.23495E+11、9.23494E+11。另外,我不希望用户为更改excel列类型而烦恼。如果使用其他方法打开,则有一个名为SpreadSheetLight的免费库可能会有所帮助。此库在读取Excel数据时提供了更多自由。缺点是他们网站上的所有示例都是用C编写的,但本周在MSDN上创建了一个代码示例,显示了大多数常见的操作和引导,今天早上创建了一个示例,可以让您开始运行,我可以附加到我的第一个回复中,只需让我知道它是用VB编写的。NETyes为什么不可以,我会很感激,我也可以用C编写代码。请注意,我的excel文件有多个不同数据类型的列,我不希望我的应用程序的用户更改列的数据类型,因为我认为用户打开excel文件、更改列的数据类型,然后来到我的应用程序并上载文件会很不方便。还需要注意的是,我收到了来自外部的excel文件,应用程序用户只需选择文件并上传数据。刚刚更新了我的回复,请参阅我回复的最后一部分。