将数据从 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.Rows(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 目标上的多个选项卡