Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 有没有一种方法可以在不将数据转换为DataTable的情况下使用SqlBulkCopy?_C#_Sql Server_Sqlbulkcopy - Fatal编程技术网

C# 有没有一种方法可以在不将数据转换为DataTable的情况下使用SqlBulkCopy?

C# 有没有一种方法可以在不将数据转换为DataTable的情况下使用SqlBulkCopy?,c#,sql-server,sqlbulkcopy,C#,Sql Server,Sqlbulkcopy,有没有一种方法可以在不将数据转换为DataTable的情况下使用SqlBulkCopy?我在RAM中有一个对象列表(list),我真的不想使用更多的内存来创建DataTable。是否可以在列表上实现IDataReader 谢谢 我当然可以想象你会BulkDataReader需要模式信息;这就是为什么不能简单地提供列表的原因。如果您设计了一个实现IDataReader的类,那么您将在GetSchemaTable实现中提供该类 我只需要自己创建一个数据表,除非我能证明一个真正的内存问题可以证明实现的

有没有一种方法可以在不将数据转换为DataTable的情况下使用SqlBulkCopy?我在RAM中有一个对象列表(list),我真的不想使用更多的内存来创建DataTable。是否可以在列表上实现IDataReader


谢谢

我当然可以想象你会
BulkDataReader
需要模式信息;这就是为什么不能简单地提供
列表的原因。如果您设计了一个实现
IDataReader
的类,那么您将在
GetSchemaTable
实现中提供该类


我只需要自己创建一个
数据表
,除非我能证明一个真正的内存问题可以证明实现的合理性。

当您将每个对象移动到
数据表
中时,将其从
列表
中删除,然后您就可以使用SqlBulkCopy,只需要一点额外内存

然后,完成后,将其反转


就我个人而言,我只想创建一个
数据表
,因为内存很便宜。

正如Michael所说,您当然可以实现一个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 ) ) );
查看此链接,您实际上可以从对象列表或任何支持IQueryable的对象中进行投影,该投影将转换为可以传递给SqlBulkCopy对象的DataReader

var q = from o in orders
         select new 
         {
           ID=o.ID,
           ShipDate=o.ShipDate,
           ProductName=o.Product.Name,
           ...
         }
IDataReader dr = q.AsDataReader();
我认为这个图书馆很方便,因为它为你节省了一点工作

希望有帮助。

最好只为GetSchemaTable使用(空)数据表!使实现IDataReader变得非常简单。内存很便宜,但你根本无法为笔记本电脑增加100GB;)