2009-11-19 9 views

Respuesta

2

Definitivamente me imagino que podrías. BulkDataReader requiere información de esquema; es por eso que no puede simplemente proporcionar un List. Si diseña una clase que implemente IDataReader, proporcionará esto en su implementación GetSchemaTable.

Simplemente crearía un DataTable, a menos que pudiera demostrar un problema de memoria real que justificaría la implementación.

0

Al mover cada objeto a un DataTable, elimínelo del List, y luego puede usar SqlBulkCopy con solo un poco de memoria extra.

Luego, cuando haya terminado, inviértalo.

Personalmente, solo crearía un DataTable ya que la memoria es barata.

1

Como dice Michael, ciertamente puede implementar un IDataReader, que es la forma más eficiente de hacerlo, pero se requiere un trabajo adicional. Implementar GetSchemaTable es un poco complicado de implementar, pero no es tan malo si usas el siguiente código como punto de partida.

 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))); 
+0

¡Buena idea de usar una DataTable (vacía) para GetSchemaTable solamente! Hace que la implementación de IDataReader sea realmente fácil. La memoria es barata, pero simplemente no puede agregar 100 GB a una computadora portátil;) – realMarkusSchmidt

0

Mira este enlace http://code.msdn.microsoft.com/LinqEntityDataReader, en realidad se puede ir de su lista de objetos o cualquier cosa que es compatible con una IQueryable hacer una proyección que se convertirá en un DataReader que puede transmitirse al objeto SqlBulkCopy.

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

Creo que esta biblioteca es útil porque te ahorra un poco de trabajo.

Espero que ayude.

Cuestiones relacionadas