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? P>
Merci! P>
4 Réponses :
Je voudrais certainement imaginer que vous pouviez. Je créerais simplement un bulkdatareader code> nécessite des informations de schéma; C'est pourquoi vous ne pouvez pas simplement fournir une liste
code>. Si vous concevez une classe qui implémente
idatareader code>, vous fournirez ceci dans votre
getschematable code> implémentation. P>
datatable code> moi-même, à moins que je puisse démontrer un problème de mémoire réel qui justifierait la mise en œuvre. P>
Lorsque vous déplacez chaque objet dans un Puis, lorsque vous avez terminé, inverserez-le. P>
Personnellement, je créerais simplement un datatable code>, supprimez-le de la liste code> code> et et vous pouvez ensuite utiliser sqlbulkcopy avec juste un peu de mémoire supplémentaire. P>
dataTable code> comme mémoire est bon marché. p>
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 ) ) );
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;)
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();