如何使用 vb.net 中 excel 表中的数据更新 sql 表
Posted
技术标签:
【中文标题】如何使用 vb.net 中 excel 表中的数据更新 sql 表【英文标题】:How to Update sql table with data from excel sheet in vb.net 【发布时间】:2015-11-19 16:29:41 【问题描述】:我在使用 Excel 表更新 sql 表时遇到问题。事实是,我正在开发这个小项目,用户可以首先通过单击 vb.net 应用程序中的按钮将包含 StudentNumber、SubjectID、ClassScore、ExamScore 的课程列表导出或打印到 excel 表格中,然后编辑表格通过填写 ClassScore 和 ExamScore,然后通过 vb.net 将工作表上传回 sql。 问题是如何检查当前 StudentNumber 或行是否存在于 sql 表中,然后更新表,否则插入新行。 这是我使用 SQLBulk Copy 的代码,剩下的就是在 vb.net 中更新 sql 表
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim ofd As New OpenFileDialog
If ofd.ShowDialog() <> System.Windows.Forms.DialogResult.OK Then Exit Sub
' Dim dgv As System.Windows.Forms.DataGridView
With ofd
.Filter = "Excel files(*.xls)|*.xls|All files (*.*)|*.*"
.FilterIndex = 1
.Title = "Import data from Excel file"
End With
Dim nme As String = ofd.FileName
Import(nme, dgv)
End Sub
Public Shared Function Import(ByVal FileName As String, ByVal dgv As DataGridView) As Boolean
Dim MyConnection As System.Data.OleDb.OleDbConnection
Dim DtSet As System.Data.DataSet
Dim MyCommand As System.Data.OleDb.OleDbDataAdapter
MyConnection = New System.Data.OleDb.OleDbConnection("provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + FileName + ";Extended Properties=Excel 12.0 Xml;")
'MyConnection = New System.Data.OleDb.OleDbConnection("provider=Microsoft.Jet.OLEDB.4.0;Data Source='c:\vb.net-informations.xls';Extended Properties=Excel 8.0;")
MyCommand = New System.Data.OleDb.OleDbDataAdapter("select * from [Sheet1$]", MyConnection)
MyCommand.TableMappings.Add("Table", "Scores")
DtSet = New System.Data.DataSet
MyCommand.Fill(DtSet)
dgv.DataSource = DtSet.Tables(0)
MyConnection.Close()
Dim expr As String = "SELECT * FROM [Sheet1$]"
Dim SQLconn As New SqlConnection()
Dim ConnString As String = "Data Source=xxxx-PC;Initial Catalog=TryExcel;Persist Security Info=True;User ID=xx;Password=xxxx"
Dim objCmdSelect As OleDbCommand = New OleDbCommand(expr, MyConnection)
Dim objDR As OleDbDataReader
SQLconn.ConnectionString = ConnString
Using bulkCopy As SqlBulkCopy = New SqlBulkCopy(ConnString)
bulkCopy.DestinationTableName = "Scores"
MyConnection.Open()
objDR = objCmdSelect.ExecuteReader
bulkCopy.WriteToServer(objDR)
objDR.Close()
SQLconn.Close()
End Using
Return True
End Function
Private Shared Function safefilename() As String
Throw New NotImplementedException
End Function
【问题讨论】:
【参考方案1】:Private Sub Upload_Workbook()
Dim t As New Thread(New ThreadStart(Sub()
dt = New DataTable
dt = New DataTable("Table_Name")
dt.Columns.Add("Column_1")
dt.Columns.Add("Column_2)
dt.Columns.Add("Column_3")
dt.Columns.Add("Column_4")
dt.Columns.Add("Column_5")
dt.Columns.Add("Column_6")
dt.Columns.Add("Column_7")
ds = New DataSet
ds.Tables.Add(dt)
Dim i As Integer
For i = 2 To (Cells(1, 11).Text)
dr = dt.NewRow
dr(0) = Cells(i, 1).Text
dr(1) = Cells(i, 2).Text
dr(2) = Cells(i, 3).Text
dr(3) = Cells(i, 4).Text
dr(4) = Cells(i, 5).Text
dr(5) = Cells(i, 6).Text
dr(6) = Cells(i, 7).Text
dt.Rows.Add(dr)
Next i
trans = con.BeginTransaction
Try
Dim row As Integer
While (row < dt.Rows.Count)
Dim cmd As New SqlCommand("Sheet1_Upload", con, trans)
cmd.CommandType = CommandType.StoredProcedure
cmd.Parameters.AddWithValue("Column_1", dt.Rows(row).ItemArray(0))
cmd.Parameters.AddWithValue("Column_2", dt.Rows(row).ItemArray(1))
cmd.Parameters.AddWithValue("Column_3", dt.Rows(row).ItemArray(2))
cmd.Parameters.AddWithValue("Column_4", dt.Rows(row).ItemArray(3))
cmd.Parameters.AddWithValue("Column_5", dt.Rows(row).ItemArray(4))
cmd.Parameters.AddWithValue("Column_6", dt.Rows(row).ItemArray(5))
cmd.Parameters.AddWithValue("Column_7", dt.Rows(row).ItemArray(6))
cmd.ExecuteNonQuery()
row = row + 1
End While
trans.Commit()
Catch ex As Exception
MsgBox(ex.Message)
trans.Rollback()
End Try
End Sub))
t.Start()
End Sub
'''''''SQL存储过程'''''''
创建过程 Sheet1_Upload(@Column_1 varchar(50),@Column_2 varchar(50),@Column_3 varchar(50),@Column_4 varchar(50),@Column_5 varchar(50),@Column_6 varchar(50)) 作为 开始
插入 INTO Table_Name(Column_1,Column_2,Column_3,Column_4,Column_5,Column_6) 值(@Column_1,@Column_2,@Column_3,@Column_4,@Column_5,@Column_6) 结束
请在 Visual Basic>Office/Share Point>Excel 2013 工作簿上创建此项目。File Path Image 然后使用另一个程序打开工作簿。
oXL = CreateObject("Excel.Application")
oXL.Visible = False
oWB = oXL.Workbooks.Open("D:\workbook.xlsm")
oWB.Activate()
oWB.RunAutoMacros(Excel.XlRunAutoMacro.xlAutoOpen)
在 VB.net 中使用 excel Auto_Open 宏和工作表更改事件。
【讨论】:
好的,我不确定我是否得到它,但我会仔细看看它,我会用我得到的任何东西喂你。非常感谢以上是关于如何使用 vb.net 中 excel 表中的数据更新 sql 表的主要内容,如果未能解决你的问题,请参考以下文章
vb.net 教程 10-2 Excel操作4 比较完整的工作表操作
如何使用 vb.net 以编程方式对 Excel 中的列进行排序?