使用SQLBulkCopy时,处理主键冲突错误的最佳方法是什么
Violation of PRIMARY KEY constraint 'email_k__'. Cannot insert duplicate key in object 'lntmuser.email'.
Run Code Online (Sandbox Code Playgroud)
(即如果该行已存在于目标表中)?
有没有办法跳过插入重复行或是否必须事先检查和处理?
这是我目前使用的代码:
var conPro = tx_ProConStr.Text;
var conArc = tx_ArcConStr.Text;
var con = new SqlConnection {ConnectionString = conPro};
var cmd = new SqlCommand("SELECT * FROM dbo.email", con);
con.Open();
var rdr = cmd.ExecuteReader();
var sbc = new SqlBulkCopy(conArc) {DestinationTableName = "dbo.email"};
sbc.WriteToServer(rdr);
sbc.Close();
rdr.Close();
con.Close();
Run Code Online (Sandbox Code Playgroud) 根据接受的答案更新:
bool success = false;
using (var bulkCopy = new SqlBulkCopy(connection)) //using!
{
connection.Open();
//explicit isolation level is best-practice
using (var tran = connection.BeginTransaction(IsolationLevel.ReadCommitted))
{
bulkCopy.DestinationTableName = "table";
bulkCopy.ColumnMappings...
using (var dataReader = new ObjectDataReader<SomeObject>(paths))
{
bulkCopy.WriteToServer(dataReader);
success = true;
}
tran.Commit(); //commit, will not be called if exception escapes
}
}
return success;
Run Code Online (Sandbox Code Playgroud)
我使用BulkCopy类来进行大插入,效果很好。
执行WriteToServer并将数据保存到数据库后
,我不想知道所有数据是否已成功保存,以便我可以返回,true/false因为我需要保存全部或不保存?
var bulkCopy = new SqlBulkCopy(connection);
bulkCopy.DestinationTableName = "table";
bulkCopy.ColumnMappings...
using (var dataReader = new ObjectDataReader<SomeObject>(paths))
{ …Run Code Online (Sandbox Code Playgroud) 我有一个包含数千条记录的数据表。我有一个具有相同数据表字段的 postgres 表。我想每天截断这个表并再次填充数据表的数据。我见过 sql 批量复制,但它在 postgres 上不可用。那么,哪一种是最有效的方法呢?
谢谢。
我正在尝试将 Blob 存储中托管的 CSV 批量插入到 Azure SQL Server 中,如MSDN 帖子中所述。
我的代码几乎完全取自这个 Microsoft Github 示例。
运行它时,我收到以下错误:
找不到引用的外部数据源“MyAzureBlobStorage”。
-- Create Database Master Key
IF (select Count(*) from sys.symmetric_keys where name like '%DatabaseMasterKey%') = 0
BEGIN
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'MYPASSWORD';
END
-- Create Storage Credential
IF (select Count(*) from sys.database_credentials where name = 'MyAzureBlobStorageCredential') = 0
BEGIN
print 'Creating credential'
CREATE DATABASE SCOPED CREDENTIAL MyAzureBlobStorageCredential
WITH IDENTITY = 'SHARED ACCESS SIGNATURE',
SECRET = '<secret>';
END …Run Code Online (Sandbox Code Playgroud) 我有一个正在访问 API 的应用程序。因此,它对对象中的所有 ID 进行查询,然后必须对每个 ID 一次查询一个项目。我在 Parallel.For 循环中执行此操作并将每个项目数据添加到数据表中的一行。然后我使用 sqlbulkcopy 将数据表发送到 SQL 服务器表。
如果我在不使用 Parallel.For 的情况下执行此操作,则效果很好。但是,对于 Parallel.For,这一行:
workrow["id"] = Guid.NewGuid();
Run Code Online (Sandbox Code Playgroud)
正在生成重复的 Guid。它经常这样做并导致数据无法加载到 SQL 服务器表中,因为 SQL 中的 id 行是主键并且不允许重复。我尝试锁定:
lock (lockobject)
{
workrow["id"] = Guid.NewGuid();
}
Run Code Online (Sandbox Code Playgroud)
这没有帮助。
我尝试不为该字段分配一个 id,希望 SQL 会生成它(它在该字段上确实有 newid())。说它不能插入空值失败了。我似乎不能只是从数据表中删除 id 字段,因为当我执行 sqlbulkcopy 时,列不会对齐。
有人可以在这里帮助我吗?我要么需要弄清楚如何让 Guid.NewGuid() 停止生成重复项,要么我需要找出一种不传入 id(始终是数据表中的第一个字段)的方法,以便 SQL 生成 id。
这是我用来生成表之一的代码:
public static DataTable MakeWorkflowTable()
{
DataTable Workflow = new DataTable("Workflow");
DataColumn id = new DataColumn("id", System.Type.GetType("System.Guid"));
Workflow.Columns.Add(id);
DataColumn OrgInfoID = new DataColumn("OrgInfoID", System.Type.GetType("System.Guid"));
Workflow.Columns.Add(OrgInfoID);
DataColumn Name = …Run Code Online (Sandbox Code Playgroud) 我想在执行SqlBulkCopy之前截断一个表.在复制数据之前,SqlBulkCopy会自动截断表吗?
我们目前正在开发一个应用程序,它为每个用户会话在特定表中生成超过5-10,000行数据.目前我们使用sql text命令一次插入每行数据,因此保存操作可能需要一分钟.我们正在使用SqlBulkInserts并且已经看到时间下降到不到500ms.有没有人对在许多用户将使用该系统的生产应用程序中使用SqlBulkInserts有任何异议?
所有,
我有以下BulkCopy操作:
// Convert the FlexGrid to a DataTable.
DataTable currData = (DataTable)c1ErrFlexGrid.DataSource;
// Insert the data into the database.
SqlBulkCopy SqlBulkIns = new SqlBulkCopy(strConnString, SqlBulkCopyOptions.Default);
SqlBulkIns.BatchSize = 5000;
SqlBulkIns.DestinationTableName = String.Format("dbo.{0}", strTableName);
SqlBulkIns.WriteToServer(currData);
Run Code Online (Sandbox Code Playgroud)
where strConnectionString是定义的有效连接字符串.当表strTableName存在且字段已定义时,这在过去工作正常.我现在希望在运行时定义的BulkCopy操作上执行此操作DataTable; 也就是说,没有在SQL中预定义表结构.这可能吗?如果是这样,怎么样?
谢谢你的时间.
我有大约30M行每天在SQL Server中插入更新我有哪些选择?
如果我使用SqlBulkCopy,它是否处理不插入已存在的数据?
在我的场景中,我需要能够使用相同的数据一遍又一遍地运行它,而无需复制数据.
目前,我有一个带有update语句的存储过程和一个从DataTable读取数据的insert语句.
我应该寻找什么来获得更好的表现?
我无法使用C#webapi将大量数据插入Azure SQL服务器数据库
考虑
我想在SQL中插入60K>数据。在我的本地sql服务器中没有问题,但是在Azure SQL中,它的连接超时
我的方法:(所有人都在本地sql服务器中工作,但不在Azure sql服务器中工作)
1)使用EF对其插入记录进行一次尝试(10000次约10分钟,大多数情况下超时)
2)尝试将批量插入扩展与EF一起使用3)尝试在SqlBulkCopy中
4)尝试增加连接字符串中的连接超时
5)尝试在Dbcontext中增加命令超时。
异常StackTrace
Execution Timeout Expired. The timeout period elapsed prior to completion of the operation or the server is not responding.
System.Data.SqlClient.SqlException (0x80131904): Execution Timeout Expired. The timeout period elapsed prior to completion of the operation or the server is not responding. ---> System.ComponentModel.Win32Exception (0x80004005): The wait operation timed out
at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)
at System.Data.SqlClient.TdsParserStateObject.ReadSniError(TdsParserStateObject stateObj, UInt32 …Run Code Online (Sandbox Code Playgroud) sqlbulkcopy ×10
c# ×8
sql-server ×4
sql ×3
azure ×2
bulkinsert ×2
datatable ×2
.net ×1
csv ×1
database ×1
guid ×1
postgresql ×1