使用带有 SqlCommandBuilder 的 TableAdapter 和导出到 DataTable 的工作表来更新 SQL 数据库表
Posted
技术标签:
【中文标题】使用带有 SqlCommandBuilder 的 TableAdapter 和导出到 DataTable 的工作表来更新 SQL 数据库表【英文标题】:Update SQL Database Table Using a TableAdapter with SqlCommandBuilder and a Worksheet exported to a DataTable 【发布时间】:2015-09-10 18:41:19 【问题描述】:我正在将数据从电子表格工作表范围导出到数据表 (dtpHExportDataTable)。当我调用 ShowResult(dtpHExportDataTable) 时,网格表单会显示正确的数据表信息(标题和数据行)。同样,当我调用 ShowResult(resultsDataTable) 时,网格表单会显示正确的数据表信息(数据库表行包括更新的行)
Using cnSQL1 As New SqlConnection
cnSQL1.ConnectionString = cnString
Using adapter1 = New SqlDataAdapter("SELECT SampleNo, Results, Complete_Date, Dex_Row_Id " _
& "FROM LIMS.dbo.Analytical_Sample_Log_ResultsInfo", cnSQL1)
Dim builder1 As New SqlCommandBuilder(adapter1)
adapter1.UpdateCommand = builder1.GetUpdateCommand()
Using New SqlCommandBuilder(adapter1)
adapter1.Fill(resultsDataTable)
resultsDataTable.PrimaryKey = New DataColumn() resultsDataTable.Columns("Dex_Row_Id")
dtpHExportDataTable = resultsDataTable.Clone()
‘not sure if needed, just trying to make sure datatypes are correct
dtpHExportDataTable.Columns("SampleNo").DataType = System.Type.GetType("System.Int32")
dtpHExportDataTable.Columns("Results").DataType = System.Type.GetType("System.String")
dtpHExportDataTable.Columns("Complete_Date").DataType = System.Type.GetType("System.DateTime")
dtpHExportDataTable.Columns("Dex_Row_Id").DataType = System.Type.GetType("System.Int32")
' Create the exporter that obtains data from the specified range,
' skips header row if required and populates the specified data table.
Dim exporter As DataTableExporter = workSheet.CreateDataTableExporter(range, dtpHExportDataTable, rangeHasHeaders)
AddHandler exporter.CellValueConversionError, AddressOf exporter_CellValueConversionError
' Specify exporter options.
exporter.Options.ConvertEmptyCells = True
exporter.Options.DefaultCellValueToColumnTypeConverter.EmptyCellValue = 0
' Perform the export.
exporter.Export()
ShowResult(dtpHExportDataTable) ‘grid form shows expected information
For index = 1 To dtpHExportDataTable.Rows.Count - 1
dtpHExportDataTable.Rows(index).SetModified()
Next
resultsDataTable.Merge(dtpHExportDataTable)
ShowResult(resultsDataTable) ‘grid form shows expected information
Try
adapter1.Update(resultsDataTable)
Catch ex As Exception
MsgBox("Update failed")
End Try
End Using
End Using
End Using
我的 tableadapter 查询生成器,更新命令文本是“UPDATE Analytical_Sample_Log_ResultsInfo SET SampleNo = @SampleNo,结果 = @Results,Complete_Date = @Complete_Date WHERE (Dex_Row_Id = @Original_Dex_Row_Id)
本质上,数据表是正确填充的;但是,即使没有抛出异常,tableadapter 也不会更新 sql 数据库表。
【问题讨论】:
只是为了丢弃update
查询是可以的。用参数值替换命令文本并在数据库中运行查询。
【参考方案1】:
这是我的最终代码,它适用于我。请注意修改数据表的变化、修改后的 SetModified 位置以及添加的 updateStatement,因为我只更新了数据库表中 11 列中的 4 列。
Using adapter1 = New SqlDataAdapter("SELECT SampleNo, Results, Complete_Date, Dex_Row_Id " _
& "FROM LIMS.dbo.Analytical_Sample_Log_ResultsInfo", cnSQL1)
Dim builder1 As New SqlCommandBuilder(adapter1)
adapter1.UpdateCommand = builder1.GetUpdateCommand()
Using New SqlCommandBuilder(adapter1)
adapter1.Fill(resultsDataTable)
resultsDataTable.PrimaryKey = New DataColumn() resultsDataTable.Columns("Dex_Row_Id")
dtpHExportDataTable = resultsDataTable.Clone()
Dim exporter As DataTableExporter = workSheet.CreateDataTableExporter(range, dtpHExportDataTable, rangeHasHeaders)
AddHandler exporter.CellValueConversionError, AddressOf exporter_CellValueConversionError
exporter.Options.ConvertEmptyCells = True
exporter.Options.DefaultCellValueToColumnTypeConverter.EmptyCellValue = 0
exporter.Export()
For index = 1 To resultsDataTable.Rows.Count - 1
resultsDataTable.Rows(index).SetModified()
Next
resultsDataTable.Merge(dtpHExportDataTable)
Dim updateStatement As String = "UPDATE LIMS.dbo.Analytical_Sample_Log_ResultsInfo SET [SampleNo] = @SampleNo, [Results] = @Results, [Complete_Date] = @Complete_Date " _
& "WHERE [Dex_Row_Id] = @Dex_Row_Id"
Dim updateCommand As New SqlCommand(updateStatement, cnSQL1)
updateCommand.Parameters.Add("@SampleNo", SqlDbType.Int, 0, "SampleNo")
updateCommand.Parameters.Add("@Results", SqlDbType.NChar, 10, "Results")
updateCommand.Parameters.Add("@Complete_Date", SqlDbType.Date, 10, "Complete_Date")
updateCommand.Parameters.Add("@Dex_Row_Id", SqlDbType.Int, 0, "Dex_Row_Id")
adapter1.UpdateCommand = updateCommand
adapter1.Update(resultsDataTable)
End Using
End Using
【讨论】:
以上是关于使用带有 SqlCommandBuilder 的 TableAdapter 和导出到 DataTable 的工作表来更新 SQL 数据库表的主要内容,如果未能解决你的问题,请参考以下文章
使用带有 SqlCommandBuilder 的 TableAdapter 和导出到 DataTable 的工作表来更新 SQL 数据库表
SQLCommandBuilder - 仅从 DataTable 更新“追加”数据库表
使用没有主键的 SQLAdapter 和 SQLCommandBuilder