我有DataSetExcel表格填充.我想使用SQLBulk Copy在Lead_Hdr表中插入记录LeadIdPK.
我在执行以下代码时遇到以下错误:
给定的ColumnMapping与源或目标中的任何列都不匹配
string ConStr=ConfigurationManager.ConnectionStrings["ConStr"].ToString();
using (SqlBulkCopy s = new SqlBulkCopy(ConStr,SqlBulkCopyOptions.KeepIdentity))
{
if (MySql.State==ConnectionState.Closed)
{
MySql.Open();
}
s.DestinationTableName = "PCRM_Lead_Hdr";
s.NotifyAfter = 10000;
#region Comment
s.ColumnMappings.Clear();
#region ColumnMapping
s.ColumnMappings.Add("ClientID", "ClientID");
s.ColumnMappings.Add("LeadID", "LeadID");
s.ColumnMappings.Add("Company_Name", "Company_Name");
s.ColumnMappings.Add("Website", "Website");
s.ColumnMappings.Add("EmployeeCount", "EmployeeCount");
s.ColumnMappings.Add("Revenue", "Revenue");
s.ColumnMappings.Add("Address", "Address");
s.ColumnMappings.Add("City", "City");
s.ColumnMappings.Add("State", "State");
s.ColumnMappings.Add("ZipCode", "ZipCode");
s.ColumnMappings.Add("CountryId", "CountryId");
s.ColumnMappings.Add("Phone", "Phone");
s.ColumnMappings.Add("Fax", "Fax");
s.ColumnMappings.Add("TimeZone", "TimeZone");
s.ColumnMappings.Add("SicNo", "SicNo");
s.ColumnMappings.Add("SicDesc", "SicDesc");
s.ColumnMappings.Add("SourceID", "SourceID");
s.ColumnMappings.Add("ResearchAnalysis", "ResearchAnalysis");
s.ColumnMappings.Add("BasketID", "BasketID");
s.ColumnMappings.Add("PipeLineStatusId", "PipeLineStatusId");
s.ColumnMappings.Add("SurveyId", "SurveyId");
s.ColumnMappings.Add("NextCallDate", "NextCallDate");
s.ColumnMappings.Add("CurrentRecStatus", …Run Code Online (Sandbox Code Playgroud) 我正在将一些基于存储过程的报告例程转换为在C#中运行.一般的想法是使用C#/ .NET Framework的所有奇迹,然后将结果反馈到数据库中.除了我昨天遇到的一个问题并且今天已经解决之外,一切都在游动.
要进行导入,我是以编程方式创建DataTable并使用SqlBulkCopy将结果移动到服务器.
例如
DataTable detail = new DataTable();
detail.Columns.Add(new DataColumn("Stock", Type.GetType("System.Decimal")));
detail.Columns.Add(new DataColumn("Receipts", Type.GetType("System.Decimal")));
detail.Columns.Add(new DataColumn("Orders", Type.GetType("System.Decimal")));
Run Code Online (Sandbox Code Playgroud)
导入表按以下顺序包含字段.
...
Stock decimal(18,4),
Orders decimal(18,4),
Receipts decimal(18,4)
...
Run Code Online (Sandbox Code Playgroud)
从本质上讲,收据的价值是进入订单,反之亦然.
显然,这是因为SqlBulkCopy似乎没有尊重我告诉它填充的列名 - 它只是按顺序位置.
这对我来说是一个问题,因为我们使用Redgate的SQL Compare.将更改从一个数据库推送到另一个数据库时,不一定保持列的序号位置.(例如,如果您插入一个新列作为第三个序数字段,SQL Compare将在同步时将其附加到表中,使其成为最后一列).
这严重困扰我的解决方案.现在,这些只是"导入"表,因此如果需要,我可以删除并重新创建它们作为任意迁移脚本的一部分,序数位置保持不变.我宁愿不这样做.
有没有办法强制SqlBulkCopy遵守您告诉它填充的列名?
我正在使用C#并使用SqlBulkCopy.我有一个问题.我需要将质量插入到一个表中然后将另一个质量插入到另一个表中.
这2个具有PK/FK关系.
Table A
Field1 -PK auto incrementing (easy to do SqlBulkCopy as straight forward)
Table B
Field1 -PK/FK - This field makes the relationship and is also the PK of this table. It is not auto incrementing and needs to have the same id as to the row in Table A.
Run Code Online (Sandbox Code Playgroud)
所以这些表有一对一的关系,但我不确定如何取回质量插入所做的所有PK Id,因为我需要它们用于表B.
编辑
我可以这样做吗?
SELECT *
FROM Product
WHERE NOT EXISTS (SELECT * FROM ProductReview WHERE Product.ProductId = ProductReview.ProductId AND Product.Qty = NULL AND Product.ProductName != 'Ipad')
Run Code Online (Sandbox Code Playgroud)
这应该找到刚刚插入sql批量副本的所有行.我不确定如何从中获取结果,然后从SP进行质量插入. …
我SqlBulkCopy用来插入大量数据:
try
{
using (var bulkCopy = new SqlBulkCopy(connection))
{
connection.Open();
using (var tran = connection.BeginTransaction(IsolationLevel.ReadCommitted))
{
bulkCopy.DestinationTableName = "table";
bulkCopy.ColumnMappings.Add("...", "...");
using (var dataReader = new ObjectDataReader<MyObject>(data))
{
bulkCopy.WriteToServer(dataReader);
}
tran.Commit();
return true;
}
}
}
catch (Exception ex)
{
return false;
}
Run Code Online (Sandbox Code Playgroud)
但我总是得到例外:
Unexpected existing transaction.
Run Code Online (Sandbox Code Playgroud)
为什么发生这种异常?
我通过SqlBulkCopy这样插入数据:
public void testBulkInsert(string connection, string table, DataTable dt)
{
using (SqlConnection con = new SqlConnection(connection))
{
con.Open();
using (SqlBulkCopy bulkCopy = new SqlBulkCopy(con))
{
bulkCopy.DestinationTableName = table;
bulkCopy.WriteToServer(dt);
}
}
}
Run Code Online (Sandbox Code Playgroud)
这会自动包装在SQL事务中,这样如果出现问题,数据库的一半将保持与批量插入开始之前相同的状态吗?或者将插入一半的数据?
即我有必要明确地打电话 con.BeginTransaction
或者如果我调用SqlBulkCopy带有字符串的构造函数,这是一种更好的方法来使它在事务中发生吗?
public void testBulkInsert(string connection, string table, DataTable dt)
{
using (SqlBulkCopy bulkCopy = new SqlBulkCopy(connection))
{
bulkCopy.DestinationTableName = table;
bulkCopy.WriteToServer(dt);
}
}
Run Code Online (Sandbox Code Playgroud)
我发现这个问题的文档有点不清楚,因为他们最初表明了这一点
默认情况下,批量复制操作作为隔离操作执行.批量复制操作以非事务方式发生,没有机会将其回滚
但后来说明了
默认情况下,批量复制操作是其自己的事务.如果要执行专用批量复制操作,请使用连接字符串创建SqlBulkCopy的新实例,或使用不带活动事务的现有SqlConnection对象.在每个方案中,批量复制操作都会创建,然后提交或回滚事务.
所以有必要这样做:
public void testBulkInsert(string connection, string table, DataTable dt)
{
using (SqlConnection …Run Code Online (Sandbox Code Playgroud) 我收到一个包含数千条记录的每日XML文件,每条记录都是我需要存储在内部数据库中用于报告和计费的业务事务.我的印象是每天的文件只包含唯一的记录,但发现我对unique的定义与提供者的定义并不完全相同.
导入此数据的当前应用程序是C#.Net 3.5控制台应用程序,它使用SqlBulkCopy进入MS SQL Server 2008数据库表,其中列与XML记录的结构完全匹配.每个记录只有100多个字段,并且数据中没有自然键,或者更确切地说,我可以想出的字段,因为复合键最终也必须允许空值.目前该表有几个索引,但没有主键.
基本上整行必须是唯一的.如果一个字段不同,则它足以插入.我查看了创建整行的MD5哈希,将其插入数据库并使用约束来阻止SqlBulkCopy插入行,但我不知道如何将MD5哈希进入BulkCopy操作而我不是确定整个操作是否会失败并在任何一个记录失败时回滚,或者它是否会继续.
该文件包含大量记录,在XML中逐行进行,查询数据库以查找与所有字段匹配的记录,然后决定插入实际上是我能够看到能够执行此操作的唯一方法.我只是希望不必完全重写应用程序,并且批量复制操作要快得多.
有没有人知道一种方法来使用SqlBulkCopy,同时防止重复行,没有主键?或者有任何建议以不同的方式做到这一点?
我SQLBulkCopy用来插入批量记录
如何对已存在的记录执行更新(而不是插入)?这有可能SQLBulkCopy吗?
这是我的SQLBulkCopy代码
using (var bulkCopy = new SqlBulkCopy(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString, SqlBulkCopyOptions.KeepNulls & SqlBulkCopyOptions.KeepIdentity))
{
bulkCopy.BatchSize = CustomerList.Count;
bulkCopy.DestinationTableName = "dbo.tCustomers";
bulkCopy.ColumnMappings.Clear();
bulkCopy.ColumnMappings.Add("CustomerID", "CustomerID");
bulkCopy.ColumnMappings.Add("FirstName", "FirstName");
bulkCopy.ColumnMappings.Add("LastName", "LastName");
bulkCopy.ColumnMappings.Add("Address1", "Address1");
bulkCopy.ColumnMappings.Add("Address2", "Address2");
bulkCopy.WriteToServer(CustomerList);
}
Run Code Online (Sandbox Code Playgroud)
申请细节
我是JSON和SQLBulkCopy的新手.我有一个JSON格式的POST数据,我希望使用C#在Microsoft SQL中批量复制/插入.
JSON格式:
{
"URLs": [{
"url_name": "Google",
"url_address": "http://www.google.com/"
},
{
"url_name": "Yahoo",
"url_address": "http://www.yahoo.com/"
},
{
"url_name": "FB",
"url_address": "http://www.fb.com/"
},
{
"url_name": "MegaSearches",
"url_address": "http://www.megasearches.com/"
}]
}
Run Code Online (Sandbox Code Playgroud)
类别:
public class UrlData
{
public List<Url> URLs {get;set;}
}
public class Url
{
public string url_address {get;set;}
public string url_name {get;set;}
}
Run Code Online (Sandbox Code Playgroud)
我怎样才能有效地做到这一点?
我不知道为什么我得到上述异常,请有人看看它....
DataTable DataTable_Time = new DataTable("Star_Schema__Dimension_Time");
DataColumn Sowing_Day = new DataColumn();
Sowing_Day.ColumnName = "Sowing_Day";
DataColumn Sowing_Month= new DataColumn();
Sowing_Month.ColumnName = "Sowing_Month";
DataColumn Sowing_Year = new DataColumn();
Sowing_Year.ColumnName = "Sowing_Year";
DataColumn Visit_Day= new DataColumn();
Visit_Day.ColumnName = "Visit_Day";
DataColumn Visit_Month = new DataColumn();
Visit_Month.ColumnName = "Visit_Month";
DataColumn Visit_Year = new DataColumn();
Visit_Year.ColumnName = "Visit_Year";
DataColumn Pesticide_spray_day = new DataColumn();
Pesticide_spray_day.ColumnName = "Pesticide_spray_day";
DataColumn Pesticide_spray_Month = new DataColumn();
Pesticide_spray_Month.ColumnName = "Pesticide_spray_Month";
DataColumn Pesticide_spray_Year = new DataColumn();
Pesticide_spray_Year.ColumnName = "Pesticide_spray_Year";
DataTable_Time.Columns.Add(Pesticide_spray_Year);
DataTable_Time.Columns.Add(Sowing_Day);
DataTable_Time.Columns.Add(Sowing_Month);
DataTable_Time.Columns.Add(Sowing_Year); …Run Code Online (Sandbox Code Playgroud) 我目前的项目包括3个标准层:数据,业务和演示.我想使用数据实体来满足我的所有数据访问需求.应用程序的部分功能是需要将平面文件中的所有数据复制到数据库中.该文件不是很大,所以我可以使用SqlBulkCopy.我在.NET中找到了几篇关于SqlBulkCopy类用法的文章.但是,所有文章都使用DataTable来来回移动数据.
有没有办法将数据实体与SqlBulkCopy一起使用,还是必须使用DataTables?
sqlbulkcopy ×10
c# ×9
sql ×3
sql-server ×3
.net ×2
bulkinsert ×2
asp.net ×1
c#-4.0 ×1
t-sql ×1
transactions ×1