-1
   Dim sSelect As String = _
        "SELECT * FROM Contacts" & _
        " WHERE DataSetID = @DataSetID AND ID >= @FirstID AND ID <= @LastID ORDER BY ID"


        Dim dsDBFiles As New DataSet()
        Dim cmd As New SqlClient.SqlCommand(sSelect, m_connection)
        cmd.Parameters.Add("@FirstID", SqlDbType.Int).Value = nFirstID
        cmd.Parameters.Add("@LastID", SqlDbType.Int).Value = nLastID

        Dim daTable As New SqlClient.SqlDataAdapter(cmd)
        Dim bldr As New SqlClient.SqlCommandBuilder(daTable)

        daTable.Fill(dsDBFiles, sTable)
        Dim tbl As DataTable = dsDBFiles.Tables(sTable)

        Dim rdr As New Data.DataTableReader(dsFiles.Tables(0))
        dsDBFiles.Load(rdr, LoadOption.Upsert, tbl)

        daTable.Update(dsDBFiles, sTable)

有没有办法在不检索记录的情况下实现这个 upsert 功能?我正在使用 SQL Server 2005。我听说有一种方法可以使用 sqladapter 来执行此操作,而无需运行 select 语句。

我正在努力加快这个过程。有什么建议么?

干杯。

4

1 回答 1

1

INSERT 部分是一回事——插入新行不是问题。

如果要更新现有行,则需要执行以下操作:

  • 将要更新的所有行添加到 DataSet(这会使用 RowState = 添加它们Added,因此它们将由 INSERT 语句处理)
  • 调用.SetModified()这些行以将其 RowState 设置为modified. 现在,UPDATE 语句将选择这些并将它们应用到数据库

当然,您还需要UpdateCommand在 SqlDataAdapter 上设置 ,并且您需要确保 SQL UPDATE 语句的工作方式仅比较主键以匹配要更新的行。

有了这个,您应该能够将修改后的行添加到您的 DataSet 并更新它们,而无需首先检索它们。

马克

于 2009-09-01T06:50:01.167 回答