9
votes

Existe-t-il un moyen d'utiliser SQLBulkCopy sans convertir les données en un jeu de données?

Y a-t-il un moyen d'utiliser SQLBulkCopy sans convertir les données en un jeu de données? J'ai une liste d'objets (liste) dans la RAM et je ne veux vraiment pas utiliser plus de mémoire pour créer le jeu de données. Serait-il possible d'implémenter IDatreader sur une liste?

Merci!


0 commentaires

4 Réponses :


2
votes

Je voudrais certainement imaginer que vous pouviez. bulkdatareader nécessite des informations de schéma; C'est pourquoi vous ne pouvez pas simplement fournir une liste . Si vous concevez une classe qui implémente idatareader , vous fournirez ceci dans votre getschematable implémentation.

Je créerais simplement un datatable moi-même, à moins que je puisse démontrer un problème de mémoire réel qui justifierait la mise en œuvre.


0 commentaires

0
votes

Lorsque vous déplacez chaque objet dans un datatable , supprimez-le de la liste et et vous pouvez ensuite utiliser sqlbulkcopy avec juste un peu de mémoire supplémentaire.

Puis, lorsque vous avez terminé, inverserez-le.

Personnellement, je créerais simplement un dataTable comme mémoire est bon marché.


0 commentaires

1
votes

Comme Michael dit, vous pouvez certainement mettre en œuvre une idatareader qui est la façon la plus efficace de le faire, mais il y a un travail supplémentaire requis. La mise en œuvre du greatematable est une sorte de douleur à mettre en œuvre, mais ce n'est pas si mauvais si vous utilisez le code ci-dessous comme point de départ.

        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 commentaires

Bonne idée d'utiliser un fichier (vide) uniquement pour Getschematible seulement! Rend la mise en œuvre de l'idatatreader vraiment facile. La mémoire est bon marché, mais vous ne pouvez tout simplement pas ajouter 100 Go à un ordinateur portable;)



0
votes

Regardez ce lien http://code.msdn.microsoft.com/linqentitydatreader , Vous pouvez réellement aller de votre liste d'objets ou tout ce qui prend en charge une iquérissable de faire une saillie qui sera convertie en un digne d'information pouvant être transmis à l'objet SQLBULCOPYCOPY.

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


0 commentaires