Upsert with .net sqladapter

问题描述:

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语句。Upsert with .net sqladapter

我想加快这个过程。有什么建议么?

干杯。

+0

究竟是什么问题? – gsharp 2009-09-01 06:53:42

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

如果您想更新现有行,你需要做以下事情:

  • 添加所有要更新到您的DataSet中的行(这增加了他们用的RowState = Added,所以它们将由INSERT语句处理)
  • 在这些行上调用.SetModified()将它们的RowState设置为modified。现在,UPDATE语句将挑选那些并把它们应用到数据库

当然,你还需要设置UpdateCommand您SqlDataAdapter的,和你需要确保SQL UPDATE语句作品以这样一种方式,它只是比较例如主键匹配要更新的行。

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

Marc