如何使用 vb.net 将 excel 文件导入 sql server
Posted
技术标签:
【中文标题】如何使用 vb.net 将 excel 文件导入 sql server【英文标题】:how to import excel file into sql server using vb.net 【发布时间】:2021-12-02 14:45:07 【问题描述】:我需要有关使用 VB.NET 将 Excel 文件导入 SQL Server 的帮助。我的编码运行良好,但有时会出现一条前消息,说转换日期失败
这里是错误。当我第一次导入它时它工作正常,但是在更改了 excel 中的主键和其他东西之后它在日期出错
这是 Excel 文件中的日期。第一次有效,但第二次无效。我在 Excel 中编写日期,就像 SQL Server 日期格式一样,例如 2021-12-14,即 YYYY-MM-DD。我对此感到困惑了一个月...如果我在 Excel 中有 10 行,有时会出现关于转换日期但仍将数据导入 SQL Server 但其中一些未在 sql 中导入的错误
Try
OLEcon.Open()
With OLEcmd
.Connection = OLEcon
.CommandText = "select * from [Sheet1$]"
End With
OLEda.SelectCommand = OLEcmd
OLEda.Fill(OLEdt)
For Each r As DataRow In OLEdt.Rows
Dim intAge As Integer
intAge = Convert.ToInt32(r(2).ToString)
Dim dateLED As Date
dateLED = Convert.ToDateTime(r(11).ToString)
Dim dateDJ As Date
dateDJ = Convert.ToDateTime(r(12).ToString)
sql = "INSERT INTO MasterStaffListTry (EENo,Name,Age,AgeCategory,Gender,Ethnicity,Grade,Category,Department,Position,ReportingTo,LastEmploymentDate,DateJoin,LOCUM,Status) VALUES
('" & r(0).ToString & "','" & r(1).ToString & "','" & intAge & "','" & r(3).ToString & "','" & r(4).ToString & "',
'" & r(5).ToString & "' ,'" & r(6).ToString & "','" & r(7).ToString & "','" & r(8).ToString & "','" & r(9).ToString & "',
'" & r(10).ToString & "','" & dateLED.ToShortDateString & "','" & dateDJ.ToShortDateString & "','" & r(13).ToString & "' ,'" & r(14).ToString & "')"
resul = saveData(sql)
If resul Then
Timer1.Start()
End If
Next
这是我导入 Excel 文件的代码。我认为这里是错误的部分。
【问题讨论】:
从***.com/q/542510/11683 开始。它也将解决日期问题。 使用 SQL 参数而不是将值连接为字符串(但请避免使用 AddWithValue 方法,因为它可能会引入其他问题).. @AndrewMorton 你是说这个参数吗?dateLED.Parameters.Add(dateLED, SqlDbType.DateTime).Value = r(11).ToString
date DJ.Parameters.Add(dateDJ, SqlDbType.DateTime).Value = r(12).ToString
【参考方案1】:
您可以使代码更高效一些并添加错误检查。
您可以只使用 SQL 命令的一个实例并更改其参数的值来提交新数据。
在获取这些参数的值时,您可以使用 DateTime.TryParse
之类的函数,这使您有机会随心所欲地处理解析错误 - 您可以跳过该行或添加到错误日志中,而不是尝试插入无效数据。
你可以从这个例子开始:
'TODO: add all the parameters and set their .SqlDbType and .Size values to match the database columns.
Dim eeNo = New SqlParameter With .ParameterName = "@EENo", .SqlDbType = SqlDbType.NVarChar, .Size = 16
Dim name = New SqlParameter With .ParameterName = "@Name", .SqlDbType = SqlDbType.NVarChar, .Size = 60
Dim age = New SqlParameter With .ParameterName = "@Age", .SqlDbType = SqlDbType.Int
Dim lastEmploymentDate = New SqlParameter With .ParameterName = "@LastEmploymentDate", .SqlDbType = SqlDbType.DateTime2
'TODO: Write the query in full.
Dim sql = "INSERT INTO MasterStaffListTry (EENo,Name,Age,LastEmploymentDate)
VALUES
(@EENo, @Name, @Age, @LastEmploymentDate)"
Dim ci = New CultureInfo("en-US")
Using conn As New SqlConnection("yourConnectionStringGoesHere")
Using sqlcmd As New SqlCommand(sql, conn)
'TODO: Add all the parameters.
sqlcmd.Parameters.Add(eeNo)
sqlcmd.Parameters.Add(name)
sqlcmd.Parameters.Add(age)
sqlcmd.Parameters.Add(lastEmploymentDate)
Dim led As DateTime ' This will store the lastEmploymentDate when it has been parsed.
For Each r As DataRow In oleDt.Rows
'TODO: Use TryParse for all applicable data.
Dim ledOK = DateTime.TryParse(r(11).ToString(), ci, Nothing, led)
'TODO: Check all the parsing worked, e.g. If ledOK AndAlso variable2OK AndAlso variable3OK Then
If ledOK Then
eeNo.Value = r(0).ToString()
name.Value = r(1).ToString()
age.Value = Convert.ToInt32(r(2))
lastEmploymentDate.Value = led
sqlcmd.ExecuteNonQuery()
End If
Next
End Using
End Using
在尝试解析日期或数字时指定要使用的文化是个好主意,例如2020 年 1 月 12 日可能是 1 月 1 日或 1 月 12 日。
【讨论】:
嘿,Andrew Morton 先生..您的编码工作很好,非常感谢您..我很感激..我只是更改了有关文化的部分信息,因为它在我的 vb 上出错了...但是非常感谢..现在我的导入适用于excel中的任何格式日期..再次感谢您>_<..>【参考方案2】:您可以使代码更高效一些并添加错误检查。
您可以只使用 SQL 命令的一个实例并更改其参数值以提交新数据。
在获取这些参数的值时,您可以使用 DateTime.TryParse 之类的函数,这使您有机会根据需要处理解析错误 - 您可以跳过该行或添加到错误日志中,而不是尝试插入无效数据。
【讨论】:
这只是第一个答案的副本-请删除它以上是关于如何使用 vb.net 将 excel 文件导入 sql server的主要内容,如果未能解决你的问题,请参考以下文章
vb.net excel导入sql如何自动获取excel的sheet名?
vb.net 如何读出excel,并把数据插入oracle数据库中。