Как мне обновить SQL Server из DataTable? - PullRequest
0 голосов
/ 09 июня 2019

Я читаю подмножество таблицы в DataTable и изменяю DataTable. Мне нужно обновить исходную таблицу SQL Server обновленной информацией.

В конечном итоге я принял предложение Марка Крэма и использовал SqlBulkCopy для помещения данных DataTable в таблицу SQL Server, а затем выполнил оператор SQL UPDATE для обновления еженедельных данных.

Dim conn As New SqlConnection With {.ConnectionString = ConnString}
dim strSQL as String, Sum13 as Double, x as Int16, y as Int16
strSQL = "SELECT Symbol, WeekEnd, AdjClose, Avg13, StdDev13 FROM Weekly " &
    "WHERE Symbol = '" & strSym & "' ORDER BY WeekEnd DESC;"
Dim sdCmd As New SqlCommand(strSQL, conn)
Dim sdda As New SqlDataAdapter(sdCmd)
Dim dt As New DataTable
sdda.Fill(dt)
conn.Open()

'calculate the 13 week moving average
Dim row As DataRow
For x = 0 To dt.Rows.Count - 13
    Sum13 = 0
    For y = x To x + 12
        Sum13 += dt.Rows(y).Item("AdjClose")
    Next
    dt.Rows(x).Item("Avg13") = Math.Round(Sum13 / 13, 4)
Next

'calculate the 13 week standard deviation
For x = 0 To dt.Rows.Count - 13
    Sum13 = 0
    For y = x To x + 12
        Sum13 += (dt.Rows(y).Item("AdjClose") - dt.Rows(x).Item("Avg13")) ^ 2
    Next
    dt.Rows(x).Item("StdDev13") = Math.Round(Math.Sqrt(Sum13 / 12), 4)
Next

Последним шагом было вставить данные во временную таблицу, а затем обновить таблицу Weekly SQL Server. Я создал таблицу «TempWeekly» для соответствия DataTable и просто использовал ее повторно.

'load the TempDaily table with the DataTable
strSQL = "DELETE FROM TempWeekly"
cmd.CommandText = strSQL
cmd.ExecuteNonQuery()
Using bulkCopy As SqlBulkCopy = New SqlBulkCopy(conn)
    bulkCopy.DestinationTableName = "dbo.TempWeekly"
    Dim mapSym As New SqlBulkCopyColumnMapping("Symbol", "Symbol")
    bulkCopy.ColumnMappings.Add(mapSym)
    Dim mapWeekEnd As New SqlBulkCopyColumnMapping("WeekEnd", "WeekEnd")
    bulkCopy.ColumnMappings.Add(mapWeekEnd)
    Dim mapStdDev13 As New SqlBulkCopyColumnMapping("StdDev13", "StdDev13")
    bulkCopy.ColumnMappings.Add(mapStdDev13)
    Dim mapAvg13 As New SqlBulkCopyColumnMapping("Avg13", "Avg13")
    bulkCopy.ColumnMappings.Add(mapAvg13)
    bulkCopy.WriteToServer(dt)
End Using

'update the Weekly table from TempDaily
strSQL = "UPDATE Weekly " &
    "SET Weekly.Avg13 = TempWeekly.Avg13, " &
        "Weekly.StdDev13 = TempWeekly.StdDev13 " &
    "FROM TempWeekly " &
    "WHERE (Weekly.Symbol = TempWeekly.Symbol) AND " & 
        (Weekly.WeekEnd = TempWeekly.WeekEnd) AND " &
        (TempWeekly.Avg13 <> 0);"
cmd.CommandText = strSQL
cmd.ExecuteNonQuery()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...