SQL 대량 복사를 사용하여 삽입 된 데이터 레코드의 ID를 얻는 방법

ado.net database identity sqlbulkcopy sql-server

문제

약 100,000 개의 레코드가있는 ADO.NET DataTable 이 있습니다. 이 테이블에는 열이 SQL Server 데이터베이스에서 자동 생성 된 IDENTITY 이므로 값이없는 열 xyID 가 있습니다.

다른 프로세스에 대해 생성 된 ID를 검색해야합니다. 이 DataTable 을 SQL Server 데이터베이스로 대량 복사하고 동일한 "단계"내 DataTable 에 생성 된 ID를 "채우는"방법을 찾고 있습니다.

SqlBulkCopy 클래스를 사용하여 테이블에 삽입 된 레코드의 ID 값을 검색하려면 어떻게합니까?

인기 답변

나는 현재 이와 같은 일을하고있다.

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];
        }
    }
}

데이터 디자인을 통해 버전 ID를 사용하여 모든 새 객체를 필터링 할 수 있습니다. 우리가 추가하는 모든 행은 동일한 버전 ID를 가지며 이전에이 버전 ID를 이미 가지고있는 데이터베이스의 행을 제거했습니다.

그러나, 내 select 쿼리는 현재 ExecuteReader에서 10 분짜리 창과 함께 시간이 초과되었습니다. 따라서 이것이 우리의 최종 해결책은 아닙니다.



아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.