Tag: sqlbulkcopy

SqlBulkCopy – 给定的ColumnName与源或目标中的任何列都不匹配

我正在尝试使用SqlBulkCopy将数据复制到SQL数据库表中,但它(错误地)说列不匹配。 他们匹配。 如果我使用断点来查看要映射的列的名称,它们是正确的。 错误消息显示列的名称,并且它是正确的。 这是我的方法。 我有一个相同的方法可以工作,唯一的区别是它从哪里获取列名称。 但是,包含列名的字符串完全相同。 public static bool ManualMapImport(DataTable dataTable, string table) { if(dataTable != null) { SqlConnection connection = new SqlConnection(connectionString); SqlBulkCopy import = new SqlBulkCopy(connection); import.DestinationTableName = “[” + table + “]”; foreach (string s in Global.SelectedColumns) { /* The s string variable here is the EXACT same as the c.ToString() […]

带有WellKnownText空间数据列的SqlBulkCopy DataTable

我正在尝试批量复制具有以下列的DataTable : “ID” – System.Int32 “Geom” – System.String 使用以下列进入SQL数据库: “Id” – int “形状” – geometry 谁能建议最好的方法来做到这一点? 一些测试代码,如果有帮助…… DataTable dataTable = new DataTable(); dataTable.Columns.Add(“ID”, typeof(Int32)); dataTable.Columns.Add(“Geom”, typeof(String)); dataTable.Rows.Add(1, “POINT(‘20,20’)”); dataTable.Rows.Add(1, “POINT(‘40,25’)”); dataTable.Rows.Add(1, “POINT(‘60,30’)”); SqlBulkCopy sqlBulkCopy = new SqlBulkCopy(connection); sqlBulkCopy.DestinationTableName = “MySpatialDataTable”; sqlBulkCopy.WriteToServer(dataTable); 我的原始post未能解释执行上述操作会导致抛出以下exception。 InvalidOperationException:数据源中String类型的给定值无法转换为指定目标列的类型udt。 我假设SqlBulkCopy不知道geometry列类型,因此不知道如何从string转换为它。 谁能证实这一点?

百万插入: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 + “;”, […]

如何使用Dapper .Net进行SQL批量复制?

我正在使用Dapper .net在SQL表中进行批量插入操作。 我想用Dapper .Net用户SQKBulk副本但没有任何经验如何使用Dapper .Net使用SqlbulkCopy 非常感谢您的帮助

如何使用来自其他来源的数据更新SQL Server表(DataTable)

我有一个从.xls表生成的DataTable 。 我想将此DataTable存储到SQL Server数据库中的现有表中。 我使用SqlBulkCopy来存储具有唯一PK的行。 问题是,我还有其他行与SQL Server表具有相同的PK ,但包含与 SQL Server表相比具有不同值的单元格 。 简而言之: 让我们在我的DataTable说我有这样一行: id(PK)| 名字| 数 005 | abc | 123 006 | lge | 122 对于我的SQL服务器,我有这样的想法; id(PK)| 名字| 数 004 | cbs | 345 005 | lks | 122 现在您可以看到行006可以使用SqlBulkCopy直接上传到SQL Server。 另一方面,由于SQL服务器表包含具有相同PK的行,因此无法使用它插入行005 。 现在我尝试手动提取行。 将每个单个单元格提取到ArrayList中,然后生成UPDATE Table语句。 但是这个方法似乎不可行,因为我要处理这么多行。 我正在寻找一种更好的方法来实现这一目标。 任何帮助表示赞赏。 谢谢

Sqlbulkcopy似乎不适合我

我已经创建了一个数据表并试图通过SqlBulkCopy插入该数据表但不知何故它似乎对我不起作用…. 我收到了错误, The given value of type DateTime from the data source cannot be converted to type decimal of the specified target column. 我的数据源是, DataTable dt = new DataTable(); dt.Columns.Add(new DataColumn(“EmpId”, typeof(Int64))); dt.Columns.Add(new DataColumn(“FromDate”, typeof(DateTime))); dt.Columns.Add(new DataColumn(“ToDate”, typeof(DateTime))); dt.Columns.Add(new DataColumn(“DaysPresent”, typeof(decimal))); dt.Columns.Add(new DataColumn(“OpeningAdvance”, typeof(double))); dt.Columns.Add(new DataColumn(“AdvanceDeducted”, typeof(double))); dt.Columns.Add(new DataColumn(“RemainingAdvance”, typeof(double))); dt.Columns.Add(new DataColumn(“SalaryGiven”, typeof(double))); dt.Columns.Add(new DataColumn(“CreatedDate”, […]

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 […]

SqlBulkCopy像糖蜜一样慢

我正在寻找通过c#加载批量数据的最快方法。 我有这个脚本可以完成工作但速度很慢。 我读过SqlBulkCopy最快的证词。 1000记录2.5秒。 文件包含接近5000条记录到250k的任何内容有哪些可以减慢它的速度? 表格定义: CREATE TABLE [dbo].[tempDispositions]( [QuotaGroup] [varchar](100) NULL, [Country] [varchar](50) NULL, [ServiceGroup] [varchar](50) NULL, [Language] [varchar](50) NULL, [ContactChannel] [varchar](10) NULL, [TrackingID] [varchar](20) NULL, [CaseClosedDate] [varchar](25) NULL, [MSFTRep] [varchar](50) NULL, [CustEmail] [varchar](100) NULL, [CustPhone] [varchar](100) NULL, [CustomerName] [nvarchar](100) NULL, [ProductFamily] [varchar](35) NULL, [ProductSubType] [varchar](255) NULL, [CandidateReceivedDate] [varchar](25) NULL, [SurveyMode] [varchar](1) NULL, [SurveyWaveStartDate] […]

从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个产品的价格更新。 他可能会开始发送有关新产品的数据,但这种情况并不常见。

标识列上具有父/子关系的SqlBulkCopy和DataTables

我们需要根据父表中的Identity主键更新多个具有父/子关系的表,父表由一个或多个子表作为外键引用。 由于数据量很大,我们希望在内存中构建这些表,然后使用C#中的SqlBulkCopy从DataSet或单个DataTables更新数据库。 我们还希望从多个线程,进程和可能的客户端并行执行此操作。 我们在F#中的原型显示了很多承诺,性能提高了34倍,但是这段代码强制了父表中已知的Identity值。 如果没有强制,当SqlBulkCopy插入行时,Identity列会在数据库中正确生成,但Identity值不会在内存中的DataTable中更新。 此外,即使它们是,也不清楚DataSet是否能正确地修复父/子关系,以便随后可以用正确的外键值写入子表。 任何人都可以解释如何使用SqlBulkCopy更新标识值,以及如何配置数据集以保留和更新父/子关系,如果在单个DataTables上调用DataAdapter到FillSchema时不自动完成。 我不想要的答案: 读取数据库以查找当前最高的Identity值,然后在创建每个父行时手动递增它。 不适用于多个进程/客户端,据我所知,失败的事务可能会导致某些标识值被跳过,因此这种方法可能会破坏关系。 一次一个地写出父行,并要求返回Identity值。 通过使用SqlBulkCopy,这至少会破坏一些收益(是的,有多个子行比父类行多,但仍有很多父行)。 类似于以下未回答的问题: 如何使用自动生成的标识密钥更新数据集父子表?