Значения не обновляются правильно в базе данных после операции в цикле - PullRequest
0 голосов
/ 18 марта 2011

У меня есть следующий код:

Imports System.Data
Imports System.Data.OleDb
Partial Class Dummy
Inherits System.Web.UI.Page

Dim r As OleDbDataReader
Dim con As OleDb.OleDbConnection
Dim cmd As OleDbCommand
Dim cmd1 As OleDbCommand
Dim prev_ob As New List(Of Int64)
Dim cur_ob As Integer
Dim i As Integer = 0

Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click

    con = New OleDb.OleDbConnection("provider=SQLOLEDB;data source=PC;initial catalog=DB1;integrated security=SSPI")
    cmd = New OleDbCommand("select single_column from table1 where date_reqd=(SELECT CONVERT(VARCHAR(10),DATEADD(DD, DATEDIFF(DD, 0, GETDATE()), -1),120))", con)
    con.Open()
    r = cmd.ExecuteReader
    While r.Read
        prev_ob.Add(Val(r.Item(0)))
    End While

    cmd = New OleDbCommand("select column1, column2, date_reqd from table1 where date_reqd=(select CONVERT(varchar(10), GETDATE(),120))", con)
    r = cmd.ExecuteReader
    While r.Read
        For i As Integer = 0 To prev_ob.Count - 1
            cur_ob = Val(prev_ob(i)) + Val(r.Item(0))
            cmd1 = New OleDbCommand("update table1 set column4='" & cur_ob & "' where column2='" & r.Item(1) & "' and date_reqd='" & r.Item(2) & "'", con)
            cmd1.ExecuteNonQuery()
            i += 1
            Exit For
        Next
    End While
    con.Close()
End Sub
End Class  

Проблема, с которой я сталкиваюсь, заключается в том, что обновление происходит правильно только для первого из многих значений.Все остальные значения рассчитываются и, следовательно, некорректно обновляются в моей таблице.Я почти уверен, что причиной проблемы является зацикливание, но я не смог ее обойти.Пожалуйста, помогите мне исправить это.

Ответы [ 2 ]

1 голос
/ 18 марта 2011

Похоже, это должен быть один оператор UPDATE. К сожалению, это сложно сказать, не видя фактическую структуру таблицы. Во-первых, напишите оператор select следующим образом (я надеюсь, что date_reqd на самом деле также столбец datetime):

SELECT
    *
FROM
    table1 t1a
         inner join
    table1 t1b
         on
             t1a.date_reqd = DATEADD(day,DATEDIFF(day,0,CURRENT_TIMESTAMP),-1) and
             t1b.date_reqd = DATEADD(day,DATEDIFF(day,0,CURRENT_TIMESTAMP),0) and
             /* You need other conditions here if there are multiple rows for the same dates
                - I'm guessing there are since you're trying to write a loop */

Как только этот запрос заработает, удалите первые две строки (SELECT *) и замените их на:

UPDATE
    t1b
SET
    column4 = t1a.single_column + t1b.column1

И тебе пора.

0 голосов
/ 18 марта 2011

Я получил это сам! :) Все что мне нужно было сделать:

Dim i as Integer=0  

While r.Read  
    cur_ob = Val(prev_ob(i)) + Val(r.Item(0))  
    cmd1 = New OleDbCommand("update table1 set column4='" & cur_ob & "' where column2='" & r.Item(1) & "' and date_reqd='" & r.Item(2) & "'", con)  
    cmd1.ExecuteNonQuery()  
    cur_ob = 0  
    i += 1  
End While  

И это сработало! Спасибо за ваши ответы / комментарии и @Damien_The_Unbeliever, я изменил свои первичные запросы, чтобы включить предложение ORDER BY. Спасибо за чаевые! :)

...