将数据从 Excel 复制到 SQL 数据库 VB.NET

Posted

技术标签:

【中文标题】将数据从 Excel 复制到 SQL 数据库 VB.NET【英文标题】:Copying data from excel to SQL Database VB.NET 【发布时间】:2017-07-20 11:10:06 【问题描述】:

我想在任何给定时间使用 excel 文件导入数据。

我已经创建了数据库,我需要将数据导入其中。

我可以将数据导入 DataGridView,但现在无法导入数据库。

我现在要从 DGV 导入数据库的代码是

    Dim command As New Data.SqlClient.SqlCommand


    command.CommandText = "InsertDataIntoDevicesLDL"

    command.Parameters.Add("@SN", SqlDbType.VarChar)
    command.Parameters.Add("@IdClass", SqlDbType.VarChar)
    command.Parameters.Add("@IdManu", SqlDbType.VarChar)
    command.Parameters.Add("@IdModel", SqlDbType.VarChar)
    command.Parameters.Add("@PartNum", SqlDbType.VarChar)
    command.Parameters.Add("@IdClt", SqlDbType.VarChar)
    command.Parameters.Add("@IdWh", SqlDbType.VarChar)
    command.Parameters.Add("@Slot", SqlDbType.VarChar)
    command.Parameters.Add("@IdLoc", SqlDbType.VarChar)
    command.Parameters.Add("@IdSts", SqlDbType.VarChar)

    MyConnection.Open()
    command.Connection = MyConnection


    For i As Integer = 0 To DataGridView1.Rows.Count - 1
        command.Parameters(0).Value = DataGridView1.Rows(i).Cells(0).Value
        command.Parameters(1).Value = DataGridView1.Rows(i).Cells(1).Value
        command.Parameters(2).Value = DataGridView1.Rows(i).Cells(2).Value
        command.Parameters(3).Value = DataGridView1.Rows(i).Cells(3).Value
        command.Parameters(4).Value = DataGridView1.Rows(i).Cells(4).Value
        command.Parameters(5).Value = DataGridView1.Rows(i).Cells(5).Value
        command.Parameters(6).Value = DataGridView1.Rows(i).Cells(6).Value
        command.Parameters(7).Value = DataGridView1.Rows(i).Cells(7).Value
        command.Parameters(8).Value = DataGridView1.Rows(i).Cells(8).Value
        command.Parameters(9).Value = DataGridView1.Rows(i).Cells(9).Value

        command.ExecuteNonQuery()
    Next

End Sub

我的程序 InsertDataIntoDevicesLDL 为:

CREATE PROCEDURE [dbo].[InsertDataIntoDevicesLDL]

@SN         NCHAR (10), 
@IdClass    INT,        
@IdManu     INT,       
@IdModel    INT,    
@PartNum    NCHAR (10),  
@OrdNum     NCHAR (10), 
@ATCode     NCHAR (10),  
@Ticket     NCHAR (10),
@CreDate    DATETIME , 
@ExpeDate   DATETIME,   
@OBS        NCHAR (200), 
@IdClt      INT,        
@IdWh       INT,       
@Slot       NCHAR (10),
@IdLoc      INT,     
@IdSts      INT,
@IdLdl      INT      

AS

BEGIN

Insert into Equipamento (SerialNumber, ID_CLASS, ID_Manufacturer, ID_Model,ProductNumber, OrderNumber, ATCode, Ticket, CreationDate, ExpeditionDate, Observations, ID_CLT,ID_WH, Slot, ID_loc, ID_STS, ID_LDL)
    Values (@SN, @IdClass, @IdManu, @IdModel, @PartNum, @OrdNum, @ATCode, @Ticket, @CreDate, @ExpeDate, @OBS, @IdClt, @IdWh, @Slot, @IdLoc, @IdSts, @IdLdl )

END

所以我的问题是。

如何导入。

现在我收到错误消息:

System.Data.SqlClient.SqlException: 'Procedure or function 'InsertDataIntoDevicesLDL' expects parameter '@SN', which was not supplied.'

【问题讨论】:

为什么不直接将插入命令写入CommandText?您定义了所有参数,我认为这将是一种更简单的方法... 【参考方案1】:

参数好像没有传值。

尝试类似:

Using connection As New SqlConnection(connection)

 Dim command As New SqlCommand("[dbo].[InsertDataIntoDevicesLDL]", connection)
 command.CommandType = CommandType.StoredProcedure

 For i As Integer = 0 To DataGridView1.Rows.Count - 1
 command.Parameters.AddWithvalue("@sn",Cstr(DataGridView1.Rows(i).Cells(0).Value))
 command .ExecuteNonQuery()
 Next

End Using

【讨论】:

我必须对所有字段进行command.Parameters.AddWithvalue("@sn",Cstr(DataGridView1.Rows(i).Cells(0).Value)),对吧? 我已经为数据库上的每个字段添加了行,现在我收到此错误:The conversion of type 'DBNull' to type 'String' is not valid. ' 在 excel 文件中,该字段为空,但这是正常的。有些字段不会总是被填写。我该如何克服这个问题? 在不转换为字符串的情况下试一试。它期望来自类型对象的参数 command.Parameters.AddWithvalue("@sn",DataGridView1.Row‌s(i).Cells(0).Value) 我做了一些更改,现在几乎可以工作了。它写入数据库,但正在检索错误System.NullReferenceException: 'Object reference not set to an instance of an object. 但仅在信息传递到数据库之后。有什么帮助吗? 这里太多了:我只留下了我发布的FOR...NEXT,以及您之前建议的更改。我将转换为字符串。错误发生了变化:现在显示:System.Data.SqlClient.SqlException (0x80131904): Procedure or function 'InsertDataIntoDeviceLDL' expects parameter '@SN'. wich was not supplied.【参考方案2】:

找到了。

DGV 有可用的添加选项,所以我在 excel 文件中有 181 条记录,但在 DGV 上有 182 行,最后一行是完全空的,这导致了该错误。

【讨论】:

以上是关于将数据从 Excel 复制到 SQL 数据库 VB.NET的主要内容,如果未能解决你的问题,请参考以下文章

VB - 连接到本地 SQL 服务器并从 excel 将数据加载到表中

将数据从 Excel 复制到 SQL 数据库 - 不上传所有记录

VB.NET 通过代码将 Excel 文档加载到 SQL Server 数据库表中

SSIS 将数据从 SQL db 复制到同一 excel 目标上的多个选项卡

使用 VB.NET 表单从 SQL Server 到 Excel 的日期数据检索

VB如何实现查询数据库并显示出来?