Wie Identitäten von eingefügten Datensätzen mithilfe von SQL-Massenkopien ermittelt werden

ado.net database identity sqlbulkcopy sql-server

Frage

Ich habe eine ADO.NET DataTable mit ungefähr 100.000 Aufzeichnungen. In dieser Tabelle gibt es eine Spalte xyID die keine Werte enthält, da die Spalte eine automatisch generierte IDENTITY in meiner SQL Server-Datenbank ist.

Ich muss die generierten IDs für andere Prozesse abrufen. Ich bin auf der Suche nach einer Möglichkeit zum DataTable dieser DataTable in die SQL Server-Datenbank und im gleichen "Schritt" zum "Füllen" meiner DataTable mit den generierten IDs.

Wie kann ich die Identitätswerte von Datensätzen abrufen, die mithilfe der SqlBulkCopy Klasse in eine Tabelle eingefügt wurden?

Beliebte Antwort

Ich mache momentan so etwas:

DataTable objects = new DataTable();
DataColumn keyColumn = new DataColumn("name", typeof(string));
DataColumn versionColumn = new DataColumn("version", typeof(int));
versionColumn.DefaultValue = iVersionID;

objects.Columns.Add(keyColumn);
objects.Columns.Add(versionColumn);

foreach (KeyValuePair<string, NamedObject> kvp in Directory)
{
    NamedObject o = kvp.Value;
    DataRow row = objects.NewRow();
    row[0] = o.Name;
    objects.Rows.Add(row);
}

using (SqlBulkCopy updater = new SqlBulkCopy(conn,
        SqlBulkCopyOptions.TableLock | SqlBulkCopyOptions.UseInternalTransaction, null))
{
    updater.DestinationTableName = "object_table";
    updater.WriteToServer(objects);
}

string sQuery = @"SELECT id, name FROM object_table WHERE version = @ver";
using (SqlCommand command = new SqlCommand(sQuery, conn))
{
    SqlParameter version = new SqlParameter("@ver", SqlDbType.Int, 4);
    version.Value = versionID;
    command.Parameters.Add(version);

    command.CommandTimeout = 600;

    using (SqlDataReader reader = command.ExecuteReader())
    {
        while (reader.Read())
        {
            string key = (string)reader[1];

            NamedObject item = Directory[key];
            item.ID = (int)reader[0];
        }
    }
}

Beachten Sie, dass unser Datendesign die Filterung aller neuen Objekte mithilfe der Versions-ID ermöglicht. Jede Zeile, die wir hinzufügen, hat die gleiche Versions-ID, und wir haben zuvor alle Zeilen in der Datenbank entfernt, die diese Versions-ID bereits hatten.

Meine Select-Abfrage ist jedoch derzeit in ExecuteReader, sogar mit diesem 10-Minuten-Fenster Zeitlimit. Das ist also nicht unsere endgültige Lösung.



Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum