2011-03-18 62 views
0

我有以下代码:值不是在循环中被操作后在数据库中正确更新

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 

我现在面临的问题是,在更新正确只发生了许多第一值。所有其他值都会计算出来,并因此在我的表格中错误地更新。我几乎可以肯定,循环是造成问题的原因,但一直无法找到解决办法。请帮我纠正它。

+0

你打电话退出没有检查任何条件? – Anuraj 2011-03-18 09:39:11

+0

@vs dev:你好! :)退出仅仅是我试图让这个恶梦的工作变化的众多变化之一。不幸的是,我删除了所有其他变体,并粘贴了我的所有变体。我也曾尝试过'For Each',因为'对于prev_ob中的每个obj等等等等都没有奏效。在那种情况下,发生了什么事是它使用上一次计算的值更新了所有行的值。当我放置一个'MsgBox'时,它显示了正确的值。我去了数据库,看到它已经插入了最后的计算值。跆拳道是错的? : – CodingInCircles 2011-03-18 09:45:09

+0

它看起来应该可以作为单个UPDATE语句来使用(是column1和single_column是否在同一列?) – 2011-03-18 09:55:43

回答

1

它看起来应该是一个单一的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

@Damien_The_Unbeliever:只有一个表具有所有这些数据。而且,single_column和column1是不一样的。 single_column只是表示我正在检索一个single_column并将其插入到一个数组列表中。 – CodingInCircles 2011-03-18 10:03:29

+0

@Akshay - 是的,我上面的第一个查询只引用一个表 - 但是我引用了它两次,以便我可以将“previous”行(通过引用'table1'获得为't1a')加入到“current”行(通过将'table1'作为't1b'获得)。这只是一个让连接条件正确的问题。我已经写了我的更新查询基于single_column和column1不同的假设。 – 2011-03-18 10:05:59

+0

@Akshay - 你当前的查询也没有'ORDER BY'子句,所以不能保证多行将被传递给你的顺序 - 如果你可以发布表结构(减少到只有列'重新在这里工作),一些示例数据和预期结果,我也可以写一个实际测试的查询。 – 2011-03-18 10:07:36

0

我明白了! :)所有我需要做的是:

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条款。谢谢你的提示! :)