Существует ли способ использовать SqlBulkCopy, не преобразовывая данные в DataTable?

Этот вопрос связан (хотя не действительно простофиля) к , Какой и где стек и "куча" , который спросили пару несколько дней назад.

8
задан Martin 19 November 2009 в 00:41
поделиться

3 ответа

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

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

2
ответ дан 6 December 2019 в 00:57
поделиться

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

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

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

0
ответ дан 6 December 2019 в 00:57
поделиться

Как говорит Майкл, вы, безусловно, можете реализовать 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 ) ) );
1
ответ дан 6 December 2019 в 00:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: