我正在尝试编写一个程序来对另一个表执行大表(大约20亿条记录)。在我看来,SqlBulkCopy将需要等待,直到在插入之前从SqlDataReader中读取所有数据为止。如果在SSIS中使用相同的查询和表,则SSIS立即启动,并且可以看到从目标表插入的数据。
我编码正确吗?如何使其与SSIS相似?
using (SqlConnection conn = new SqlConnection(connectionString))
{
conn.Open();
using (SqlCommand cmd = new SqlCommand(bukCopyData.SourceQuery, conn))
{
cmd.CommandTimeout = 0;
using (SqlDataReader reader = cmd.ExecuteReader())
{
performBulkCopy(connectionStringDest, DestinationTable, reader);
}
}
}
private void performBulkCopy(string connectionString, string destinationTable, SqlDataReader reader)
{
using (SqlBulkCopy sbc = new SqlBulkCopy(connectionString,
SqlBulkCopyOptions.KeepIdentity | SqlBulkCopyOptions.CheckConstraints | SqlBulkCopyOptions.KeepNulls
))
{
sbc.DestinationTableName = destinationTable;
sbc.BatchSize = 102400;
sbc.BulkCopyTimeout = 0;
try
{
sbc.WriteToServer(reader);
} catch (Exception e)
{
throw;
} finally
{
reader.Close();
}
}
}
}
实际上,EnableStreaming属性似乎起作用。我必须确保查询中的列顺序与目标表匹配。不知道为什么需要很长时间才能引发错误。