Есть ли способ использовать SqlBulkCopy без преобразования данных в DataTable?

Есть ли способ использовать SqlBulkCopy без преобразования данных в DataTable? У меня есть список объектов (Список) в ОЗУ, и я действительно не хочу использовать больше памяти для создания DataTable. Можно ли реализовать IDataReader в списке?

Благодаря!

Я бы, конечно, подумал, что вы могли бы. BulkDataReader требует информации о схеме; поэтому вы не можете просто предоставить List . Если вы GetSchemaTable класс, который реализует IDataReader , вы будете предоставлять это в своей реализации GetSchemaTable .

Я бы просто создал сам DataTable , если бы не смог продемонстрировать реальную проблему с памятью, которая бы оправдывала реализацию.

Как говорит Майкл, вы, безусловно, можете реализовать IDataReader, который является наиболее эффективным способом его выполнения, но требуется дополнительная работа. Реализация GetSchemaTable – это боль, которую нужно реализовать, но это не так уж плохо, если вы используете код ниже в качестве отправной точки.

  var table = new DataTable( "SchemaTable" ); table.Locale = CultureInfo.InvariantCulture; table.Columns.Add( new DataColumn( SchemaTableColumn.ColumnName, typeof( string ) ) ); table.Columns.Add( new DataColumn( SchemaTableColumn.ColumnOrdinal, typeof( int ) ) ); table.Columns.Add( new DataColumn( SchemaTableColumn.ColumnSize, typeof( int ) ) ); table.Columns.Add( new DataColumn( SchemaTableColumn.NumericPrecision, typeof( short ) ) ); table.Columns.Add( new DataColumn( SchemaTableColumn.NumericScale, typeof( short ) ) ); table.Columns.Add( new DataColumn( SchemaTableColumn.DataType, typeof( Type ) ) ); table.Columns.Add( new DataColumn( SchemaTableOptionalColumn.ProviderSpecificDataType, typeof( Type ) ) ); table.Columns.Add( new DataColumn( SchemaTableColumn.NonVersionedProviderType, typeof( int ) ) ); table.Columns.Add( new DataColumn( SchemaTableColumn.ProviderType, typeof( int ) ) ); table.Columns.Add( new DataColumn( SchemaTableColumn.IsLong, typeof( bool ) ) ); table.Columns.Add( new DataColumn( SchemaTableColumn.AllowDBNull, typeof( bool ) ) ); table.Columns.Add( new DataColumn( SchemaTableOptionalColumn.IsReadOnly, typeof( bool ) ) ); table.Columns.Add( new DataColumn( SchemaTableOptionalColumn.IsRowVersion, typeof( bool ) ) ); table.Columns.Add( new DataColumn( SchemaTableColumn.IsUnique, typeof( bool ) ) ); table.Columns.Add( new DataColumn( SchemaTableColumn.IsKey, typeof( bool ) ) ); table.Columns.Add( new DataColumn( SchemaTableOptionalColumn.IsAutoIncrement, typeof( bool ) ) ); table.Columns.Add( new DataColumn( SchemaTableOptionalColumn.IsHidden, typeof( bool ) ) ); table.Columns.Add( new DataColumn( SchemaTableOptionalColumn.BaseCatalogName, typeof( string ) ) ); table.Columns.Add( new DataColumn( SchemaTableColumn.BaseSchemaName, typeof( string ) ) ); table.Columns.Add( new DataColumn( SchemaTableColumn.BaseTableName, typeof( string ) ) ); table.Columns.Add( new DataColumn( SchemaTableColumn.BaseColumnName, typeof( string ) ) ); table.Columns.Add( new DataColumn( SchemaTableOptionalColumn.BaseServerName, typeof( string ) ) ); table.Columns.Add( new DataColumn( SchemaTableColumn.IsAliased, typeof( bool ) ) ); table.Columns.Add( new DataColumn( SchemaTableColumn.IsExpression, typeof( bool ) ) ); 

По мере перемещения каждого объекта в DataTable удалите его из List , а затем вы можете использовать SqlBulkCopy с небольшой дополнительной памятью.

Затем, когда вы закончите, отмените его.

Лично я бы просто создал DataTable поскольку память дешевая.

Посмотрите на эту ссылку http://code.msdn.microsoft.com/LinqEntityDataReader , вы действительно можете перейти из своего списка объектов или всего, что поддерживает IQueryable, чтобы сделать проекцию, которая будет преобразована в DataReader, которая может быть передана в Объект SqlBulkCopy.

 var q = from o in orders select new { ID=o.ID, ShipDate=o.ShipDate, ProductName=o.Product.Name, ... } IDataReader dr = q.AsDataReader(); 

Я думаю, что эта библиотека пригодится, так как это сэкономит вам немного работы.

Надеюсь, поможет.

  • SQL BulkCopy против OPENDATASOURCE, который быстрее
  • Вставка SqlBulkCopy с колонкой Identity
  • SqlBulkCopy: В чем разница между передачей SqlBulkCopyOptions.UseInternalTransaction и ее отсутствием?
  • Как предотвратить дублирование записей в SqlBulkCopy, когда нет первичного ключа
  • Автоматически определять DataTable в C # из схемы таблиц SQL-сервера?
  • SQLBulkCopy не копирует первичные ключи
  • SQLBulkCopy вызывает тупик
  • Триггер запуска для каждой вставленной строки с использованием SqlBulkCopy
  • Как использовать SqlBulkCopy с транзакцией на ReliableSqlConnection в sql azure
  • Как захватить данные, переданные в SqlBulkCopy, используя Sql Profiler?
  • Обновление выполняется до BulkInsert
  • Давайте будем гением компьютера.