Vb.net 仅更新数据库中具有相同名称的项的1行

Vb.net 仅更新数据库中具有相同名称的项的1行,vb.net,datagridview,sql-update,Vb.net,Datagridview,Sql Update,我有一个datagridview和一个按钮,当按钮被点击时,选中的行应该被更新。一切正常,直到我必须用相同的名称(TICKER)更新项目,然后用该名称更新所有项目 即使ID不可见,是否有可能基于ID更新行 这是我的密码: Dim myCONN As OleDbConnection = New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=w:\Portfolio.mdb")

我有一个datagridview和一个按钮,当按钮被点击时,选中的行应该被更新。一切正常,直到我必须用相同的名称(TICKER)更新项目,然后用该名称更新所有项目

即使ID不可见,是否有可能基于ID更新行

这是我的密码:

 Dim myCONN As OleDbConnection = New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=w:\Portfolio.mdb")
                       Dim query As String = "UPDATE PFT SET [Sell Price]=?, [G/L (USD)]=?, [G/L (%)]=?, BS=? WHERE TICKER=?"

            myCONN.Open()

            Using cmd As New OleDbCommand(query, myCONN)

                cmd.Parameters.AddWithValue("[Sell Price]", Label7.Text)
                cmd.Parameters.AddWithValue("[G/L (USD)]", Label18.Text)
                cmd.Parameters.AddWithValue("[G/L (%)]", Label28.Text)
                cmd.Parameters.AddWithValue("BS", "S")
                cmd.Parameters.AddWithValue("TICKER", Label26.Text)


                cmd.ExecuteNonQuery()
            End Using
            myCONN.Close()

因为您有一个ID,所以只需将其添加到SQL中,然后传递 要更新的行的ID:

Dim query As String = "UPDATE PFT SET [Sell Price]=?, [G/L (USD)]=?, 
        [G/L (%)]=?, BS=? WHERE (TICKER=? AND ID = ?) "

myCONN.Open()

Using cmd As New OleDbCommand(query, myCONN)
    ' OleDb just maps values based on ? positions in SQL
    cmd.Parameters.AddWithValue("@p1", Label7.Text)
    cmd.Parameters.AddWithValue("@p2", Label18.Text)
    cmd.Parameters.AddWithValue("@p3", Label28.Text)
    cmd.Parameters.AddWithValue("@p4", "S")
    cmd.Parameters.AddWithValue("@p5", Label26.Text)

    ' new param to pass the ID from wherever you have it stored
    ' variables work just as good as UI controls, BTW
    cmd.Parameters.AddWithValue("@p6", Label??????.Text)

    cmd.ExecuteNonQuery()
End Using
请注意,不需要“S”参数。SQL同样可以是
“[G/L(%)]=?,BS='S'…”

任何不是text/string/char的db列都应进行转换。例如,如果
[Sell Price]
是十进制:

    cmd.Parameters.AddWithValue("@p1", Convert.ToDecimal(Label7.Text))

我还将参数指定简化为泛型“@pN”,因为OleDB不使用命名参数:它们是按照它们在SQL中出现的顺序填充的。如果不将它们按相同的顺序放置,将它们视为命名参数可能会导致错误。

为什么不使用一些易于理解的参数名称?并尝试更正您的sql查询。如果您有多行代码使用同一个代码,那么这几乎就是应该发生的事情。如果你想做一些事情,比如交易历史,你需要一些东西来区分一行和另一行,比如日期或自动编号PK@AliRashidiOleDB实际上不使用命名参数,它们是位置参数。他的
.AddWithValue
应该是“@p1、@p2”或类似的抽象名称,这样他就不会认为他实际上可以按任何顺序按名称添加它们。像他这样的东西确实有助于将秩序映射到那些名字不好的人Labels@Plutonix是的,差不多。由于数据在Access数据库中,我有ID列,但不知道如何使用它?对于交易历史记录,如果这类似于卖出记录,则应该是插入而不是更新。我应该认为,在大多数情况下,一旦某件东西售出,它就会永远售出,不需要更新