Upsert с .net sqladapter - PullRequest
       12

Upsert с .net sqladapter

0 голосов
/ 01 сентября 2009
   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.

Я пытаюсь ускорить этот процесс. Есть предложения?

Приветствие.

1 Ответ

0 голосов
/ 01 сентября 2009

Часть INSERT - это одно: вставка новых строк не является проблемой.

Если вы хотите обновить существующие строки, вам нужно будет сделать следующее:

  • добавить все строки, которые вы хотите обновить, в ваш DataSet (это добавляет их с RowState = Added, чтобы они обрабатывались оператором INSERT)
  • вызовите .SetModified() в этих строках, чтобы установить для их RowState значение modified. Теперь оператор UPDATE подберет их и применяет к базе данных

Конечно, вам также нужно установить UpdateCommand в вашем SqlDataAdapter, и вам нужно убедиться, что оператор SQL UPDATE работает таким образом, что он сравнивает только, например. первичный ключ для сопоставления строк, подлежащих обновлению.

При этом вы должны иметь возможность добавлять измененные строки в ваш набор данных и обновлять их, даже не восстанавливая их вообще.

Марк

...