Tag: bulkinsert

使用c#从分隔文本文件中插入SQL Server表中的批量数据

我有制表符分隔的文本文件。 文件大约100MB。 我想将此文件中的数据存储到SQL Server表。 存储在sql server中时,该文件包含100万条记录。 实现这一目标的最佳方法是什么? 我可以在c#中的momory数据表中创建,然后将其上传到sql server,但在这种情况下,它会将整个100 MB的文件加载到内存中。 如果文件大小变大怎么办?

百万插入:SqlBulkCopy超时

我们已经有一个运行系统来处理所有连接字符串( db2 , oracle , MSServer )。 目前,我们正在使用ExecuteNonQuery()来进行一些插入。 我们希望通过使用SqlBulkCopy()而不是ExecuteNonQuery()来提高性能。 我们有一些客户拥有超过5000万条记录。 我们不想使用SSIS ,因为我们的系统支持多个数据库。 我创建了一个示例项目来测试SqlBulkCopy()的性能。 我为MSServer创建了一个简单的读取和插入函数 这是小function: public void insertIntoSQLServer() { using (SqlConnection SourceConnection = new SqlConnection(_sourceConnectionString)) { //Open the connection to get the data from the source table SourceConnection.Open(); using (SqlCommand command = new SqlCommand(“select * from ” + _sourceSchemaName + “.” + _sourceTableName + “;”, […]

使用ADO.NET Entity Framework批量插入和更新

我正在编写一个执行大量Feed处理的小应用程序。 我想使用LINQ EF,因为速度不是问题,它是一个单用户应用程序,最后,每个月只会使用一次。 我的问题围绕使用LINQ EF进行批量插入的最佳方式。 在解析传入的数据流之后,我最终得到了一个值列表。 由于最终用户可能最终尝试导入一些重复数据,我想在插入期间“清理”数据而不是读取所有记录,执行for循环,拒绝记录,然后最终导入余数。 这就是我目前正在做的事情: DateTime minDate = dataTransferObject.Min(c => c.DoorOpen); DateTime maxDate = dataTransferObject.Max(c => c.DoorOpen); using (LabUseEntities myEntities = new LabUseEntities()) { var recCheck = myEntities.ImportDoorAccess.Where(a => a.DoorOpen >= minDate && a.DoorOpen 0) { foreach (ImportDoorAccess ida in recCheck) { DoorAudit da = dataTransferObject.Where(a => a.DoorOpen == ida.DoorOpen && a.CardNumber […]

MySQL LOAD DATA INFILE数据对于列exception来说太长了

我正在使用MySQL LOAD DATA INFILE Data命令批量插入数据到表。 这是我的方式: LOAD DATA INFILE ‘MyFile.csv’ INTO TABLE `dbname`.`tablename` FIELDS TERMINATED BY ‘\t’ ENCLOSED BY ‘”‘ LINES TERMINATED BY ‘\r\n’ ; 当我从我们的C#项目运行它时,我得到的Data too long for column xxx对于char(50)列的Data too long for column xxxexception,它提供的数据小于50(但它是波斯语)但是当我使用MySql时像SQLyog这样的客户端工作正常。 这是我运行此命令的方式: private static void RunCommand(string command,params object[] args) { if (args != null) command = string.Format(command, args); using (var […]

批量插入,asp.net

我需要输入与成员对应的ID号列表。 它们可以在任何给定时间处理10到10,000之间。 我收集数据,解析数据并将其加载到DataTable或其他任何东西(C#)都没有问题,但我想在数据库中进行一些操作。 将所有这些数据插入表中的最佳方法是什么? 我很确定我不想为每个语句运行一次并插入10,000次。

为什么这个oracle批量插入不起作用?

我正在尝试将一些数据批量插入到oracle db中。 我按照文档中的示例进行操作。 this.DataBaseAccess = new OracleConnection(connString); var dataAdapter = new OracleDataAdapter(); var insertCmd = DataBaseAccess.CreateCommand(); insertCmd.CommandType = CommandType.Text; insertCmd.BindByName = true; var names = new List(); foreach (DataTable table in product.Contracts.Tables) { foreach (DataRow row in table.Rows) { names.Add(row[“Contract”].ToString()); } const string InsertContracts = “merge into CONTRACT t ” + “using ” + “(select […]

OracleBulkCopy内存泄漏(OutOfMemoryexception)

下面是我用于将数据从临时表dataTable批量复制到Oracle数据库中的destTable的代码。 dataTable有大约200万条记录。 using (OracleBulkCopy bulkCopy = new OracleBulkCopy(VMSDATAConnectionString)) { try { foreach (OracleBulkCopyColumnMapping columnMapping in columnMappings) bulkCopy.ColumnMappings.Add(columnMapping); bulkCopy.DestinationTableName = destTableName; //bulkCopy.BatchSize = dataTable.Rows.Count; //bulkCopy.BulkCopyTimeout = 100; int defaultSize = 5000; int.TryParse(ConfigurationManager.AppSettings[“OracleBulkCopyBatchSize”], out defaultSize); bulkCopy.BatchSize = defaultSize; int timeOut = 100; int.TryParse(ConfigurationManager.AppSettings[“OracleBulkCopyTimeout”], out timeOut); bulkCopy.BulkCopyTimeout = timeOut; Console.WriteLine(“Bulk insert from {0} to {1} started at: {2}\r\nBatchSize […]

从c#到SQL Server的批量插入策略

在我们当前的项目中,客户将向我们的系统发送复杂/嵌套消息的集合。 这些消息的频率约为。 1000-2000 msg /每秒。 这些复杂对象包含事务数据(要添加)以及主数据(如果未找到则将添加)。 但客户不是传递主数据的ID,而是传递“名称”列。 系统检查这些名称是否存在主数据。 如果找到,它将使用数据库中的ID,否则首先创建此主数据,然后使用这些ID。 解析主数据ID后,系统会将事务数据插入SQL Server数据库(使用主数据ID)。 每条消息的主实体数量约为15-20。 以下是我们可以采用的一些策略。 我们可以首先从C#代码中解析master ID(如果没有找到则插入主数据)并将这些ID存储在C#cache中。 解决所有ID后,我们可以使用SqlBulkCopy类批量插入事务数据。 我们可以访问数据库15次以获取不同实体的ID,然后再次命中数据库以插入最终数据。 我们可以使用相同的连接在完成所有这些处理后关闭它。 我们可以将包含主数据和事务数据的所有这些消息一次性发送到数据库(以多个TVP的forms),然后在内部存储过程中,首先为缺失的数据创建主数据,然后插入事务数据。 有人可以建议这个用例的最佳方法吗? 由于一些隐私问题,我无法分享实际的对象结构。 但这是假设的对象结构,它非常接近我们的业务对象 。 一条此类消息将包含有关一个产品(其主数据)的信息以及来自不同供应商的价格详细信息(交易数据): 主数据(如果未找到则需要添加) 产品名称:ABC,ProductCateory:XYZ,制造商:XXX和其他一些细节(属性数量在15-20范围内)。 交易数据(将始终添加) 供应商名称:A,ListPrice:XXX,折扣:XXX 供应商名称:B,ListPrice:XXX,折扣:XXX 供应商名称:C,ListPrice:XXX,折扣:XXX 供应商名称:D,ListPrice:XXX,折扣:XXX 对于属于一个产品的消息,大多数有关主数据的信息将保持不变(并且将更改频率更低),但交易数据将始终波动。 因此,系统将检查系统中是否存在产品“XXX”。 如果没有,请检查本产品中提到的“类别”是否存在。 如果没有,它将为类别插入新记录,然后为产品插入新记录。 这将针对制造商和其他主数据进行。 多个供应商将同时发送有关多个产品(2000-5000)的数据。 因此,假设我们有1000个供应商,每个供应商都在发送大约10-15种不同产品的数据。 每2-3秒后,每个供应商都会向我们发送这10个产品的价格更新。 他可能会开始发送有关新产品的数据,但这种情况并不常见。

NHibernate批量插入或更新

嗨,我正在开发一个项目,我们需要每天处理几个xml文件,并使用这些文件中包含的信息填充数据库。 每个文件大约1Mb,包含大约1000条记录; 我们通常需要处理12到25个这些文件。 我已经看到有关使用NHibernate的批量插入的一些信息,但我们的问题有点棘手,因为xml文件包含与更新记录混合的新记录。 在xml中有一个标志,告诉我们特定记录是新记录还是对现有记录的更新,但不是更改了哪些信息。 xml记录不包含我们的数据库标识符,但我们可以使用xml记录中的标识符来唯一地定位数据库中的记录。 到目前为止,我们的策略是识别当前记录是插入还是更新,并且基于我们在数据库上执行插入或者我们进行搜索,然后我们使用来自的信息来更新对象的信息。 xml记录,最后我们对DB进行更新。 我们当前的方法存在的问题是我们遇到了DB锁的问题,而且我们的性能下降得非常快。 我们已经考虑了一些替代方案,比如为不同的操作设置单独的表,或者甚至是单独的DB,但是做出这样的举动意味着要做出很大的努力,所以在我想要就这个问题征求社群意见的任何决定之前,先谢谢。

从平面文件中将数百万条记录插入SQL Server有哪些陷阱?

我即将开始编写一个Windows窗体应用程序的旅程,该应用程序将打开一个管道分隔的txt文件,大小约为230 mb。 然后,此应用程序将此数据插入到sql server 2005数据库中(显然这需要迅速发生)。 我正在使用c#3.0和.net 3.5来完成这个项目。 我不是要求应用程序,只是在这里提供一些公共建议和潜在的陷阱建议。 从我收集的网站上我发现SQL批量复制是一个先决条件,我应该考虑一下(我认为只需用表格应用程序打开txt文件将是一项很大的努力;可能会将其分解为blob数据?)。 谢谢,如果有人需要,我会编辑问题以便清楚。