来自 SqlBulkCopy 的 LINQ 查询的数据读取器
Posted
技术标签:
【中文标题】来自 SqlBulkCopy 的 LINQ 查询的数据读取器【英文标题】:Datareader from LINQ Query for SqlBulkCopy 【发布时间】:2013-06-24 07:36:05 【问题描述】:我正在使用这个库:
Link to EntityDataReader
将来自 xml 解析的一些 linq 查询结果放入带有 sqlbulkcopy 的数据库中,该数据库使用数据读取器直接放入数据,而无需使用数据表或此类数据结构。
我无法实现它。
这是我到目前为止写的没有成功的代码:
XDocument xdoc = XDocument.Parse(str_XmlToParse);
//ORDINI
IEnumerable<XDocument> xdod;
var orders = from c in xdoc.Descendants("ordersdata").AsEnumerable().Descendants("order").AsEnumerable()
select new
Client_ID = (string)c.Element("Client").Element("ID"),
Doc_ID = (string)c.Element("ord_ID"),
Doc_data = (DateTime)c.Element("ord_datetime"),
;
IDataReader dr = orders.AsDataReader();
using (SqlConnection con = new SqlConnection(connectionString))
con.Open();
using (SqlTransaction tran = con.BeginTransaction())
var newOrders =
from i in Enumerable.Range(0, totalToSend)
select new Order
customer_name = "Customer " + i % 100,
quantity = i % 9,
order_id = i,
order_entry_date = DateTime.Now
;
SqlBulkCopy bc = new SqlBulkCopy(con,
SqlBulkCopyOptions.CheckConstraints |
SqlBulkCopyOptions.FireTriggers |
SqlBulkCopyOptions.KeepNulls, tran);
bc.BatchSize = 1000;
bc.DestinationTableName = "order_queue";
bc.WriteToServer(newOrders.AsDataReader());
tran.Commit();
con.Close();
这主要是该库示例中内容的副本。
我什至没有正确理解他们所有奇怪的演员阵容发生了什么,但我需要它来工作。 (相信我,我试图理解)
我不断收到此错误:
错误 1 'System.Collections.Generic.IEnumerable AnonymousType#1>' 确实 不包含“AsDataReader”的定义,也没有扩展方法 'AsDataReader' 接受类型的第一个参数 'System.Collections.Generic.IEnumerable AnonymousType#1>' 可能是 找到(您是否缺少 using 指令或程序集引用?)
这是什么?我该如何解决?
谢谢
【问题讨论】:
附言。我认为这是编译器错误而不是异常。对吗? 您好。我很想得到这个图书馆。我点击了链接,但它已被淘汰。谁知道哪里可以下载? @serlingpa 也许为时已晚,但是.... code.msdn.microsoft.com/windowsdesktop/WPF-783fc64b/… 截至 2020 年,GitHub 上仍有一个版本可用:Repository/Repository.EntityFramework/EntityDataReader.cs,由 Matthew Schrager 在微软退休后维护。 【参考方案1】:好吧,基本上错误说您不能应用带有参数“IEnumerable”对象的方法“AsDataReader”,因为没有这样的方法具有此定义。如果可能有帮助,请尝试在引用中添加 DLL "System.Data.Entity" 和 System.Data.EntityClient
【讨论】:
试过了,但我没想到它会起作用。这只是从匿名类型到 Ienumerable 列表或其他东西的错误转换问题。 “订单”变量是什么类型的?因为我猜,您的 LINQ 查询的结果不会返回您可以应用“AsDataReader()”方法的内容。顺便说一句:你为什么放 2 ".AsEnumerable()" ?我想你只需要一个 刚刚查看了您添加的示例。您需要在顶部使用using Microsoft.Samples.EntityDataReader
(除非您已将源更改为EntityDataReader.cs
文件)。原因是您需要让编译器查找 Microsoft.Samples.EntityDataReader.EntityDataReaderExtensions
静态类。
此外,您还需要在解决方案中实际包含 EntityDataReader.cs
文件(但我希望这不是一个脑筋急转弯)。
其实我已经在项目中添加了那个类。但是使用 Microsoft.Samples.EntityDataReader 手动添加;在顶部夹杂物解决了它。谢谢阿伦。如果您将其作为答案,我会将其标记为已接受的答案。以上是关于来自 SqlBulkCopy 的 LINQ 查询的数据读取器的主要内容,如果未能解决你的问题,请参考以下文章
SqlBulkCopy 来自数据源的 String 类型的给定值不能转换为指定目标列的类型 bit
来自 SQL 数据库的大量记录的 Linq 查询和 Foreach