2015-09-10 4 views
1

Я экспортирую данные из диапазона рабочих таблиц электронной таблицы в datatable (dtpHExportDataTable). Когда я вызываю ShowResult (dtpHExportDataTable), форма сетки отображает правильную информацию о датах (заголовки и строки данных). Точно так же, когда я называю ShowResult (resultsDataTable) форма сетки отображает правильную DataTable информацию (таблица базы данных строк, включая обновленные строки)Обновление таблицы базы данных SQL с помощью TableAdapter с помощью SqlCommandBuilder и рабочего листа, экспортированного в DataTable

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 Query Builder, обновление текста команда «UPDATE Analytical_Sample_Log_ResultsInfo SET SampleNo = @SampleNo, результаты = @Results, Complete_Date = @Complete_Date WHERE (Dex_Row_Id = @Original_Dex_Row_Id)

В сущности, DataTables заполнить правильно; однако tableadapter не обновляет таблицу базы данных sql, даже если исключение не выбрано.

+0

Просто для отказа от запроса «update» в порядке. Замените текст команды на значения параметров и запустите запрос в базе данных. –

ответ

1

Это мой последний код, и он работает для меня. Обратите внимание на изменение, в котором изменяется тип данных, измененное местоположение SetModified и добавление updateStatement, поскольку я обновляю только 4 из 11 столбцов в таблице базы данных.

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 
Смежные вопросы