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

问题描述:

我使用vb.net将数据从Excel导入SQL Server数据库。在我的Excel文件,在bNumber列,有不同类型的值,即有些数字和一些文字:正确使用vb.net将数据从Excel导入SQL Server

Telenorx 
Telenorx 
8 
97150219924 
97150219924 
97150219924 
97150219924 
Easypayx 
92 

当我通过OleDbCommand选择从Excel中的数据,其检索数字,但作为空白文本值。

在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

如果您的代码有问题,则应该发布上述代码。这是不可能的,除非说你有一个错误 –

这不一定是你的情况的解决方案还没有将我所做的就是创建一个SQL-Server表与B-号码为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输出窗口

enter image description here

表结构

enter image description here

工作表

enter image description here

编辑:下面的链接指向与SpreadSheetLight库工作一个MSDN代码示例。下载后,将启动窗体设置为*1QuestionMixedTypesForm。右键单击解决方案资源管理器中的解决方案并选择“恢复NuGet包”,现在构建并运行项目。表单上有两个按钮,第一个是Sheet1的混合类型,而第二个是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文件,应用程序用户只需选择文件并上传数据。 –