使用带有 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

为啥我们要使用 sqlcommandbuilder?

在 ASP.NET 中使用 SqlCommandBuilder

sqlCommandBuilder 更新未按预期工作