C# 使用sql bulkcopy类c在循环中插入数据#
我有两个数据库,现在我必须在循环中将数据从一个数据库插入到另一个数据库。我知道位sql批量复制,但我不知道如何使用sql批量复制一次插入一个数据 这是我的桌子结构C# 使用sql bulkcopy类c在循环中插入数据#,c#,sqlbulkcopy,C#,Sqlbulkcopy,我有两个数据库,现在我必须在循环中将数据从一个数据库插入到另一个数据库。我知道位sql批量复制,但我不知道如何使用sql批量复制一次插入一个数据 这是我的桌子结构 CREATE TABLE [CandidateApplication]( [EmailID] [varchar](300) NOT NULL, [Name] [varchar](300) NULL, [FileName] [varchar](500) NULL, [IsDownloaded] [bit] NOT NULL )
CREATE TABLE [CandidateApplication](
[EmailID] [varchar](300) NOT NULL,
[Name] [varchar](300) NULL,
[FileName] [varchar](500) NULL,
[IsDownloaded] [bit] NOT NULL
)
基本上,我需要用isdownload=0
这样的子句从一个db中获取数据,然后我需要在循环中迭代。使用in-loop,我将从FileName
字段获取文件路径并下载该文件。如果文件下载成功,那么我必须将数据从db1保存到db2,并将字段isdownload=1
更新到db1
我可以使用sqlbulk copy类在循环中处理从一个db到另一个db的数据插入吗。请建议。谢谢,很简单,伙计:)对不起,我在VB.net中的代码,希望你不要介意
注意:重要的是数据表和目标表中的数据类型。它们应该是相同的
您不需要逐个插入数据,只需将集合传递给WriteToServer()方法 例如:
HashSet dataLines=newhashset();
foreach(someCollection中的var实体)
{
if(entity==somecondition)
{
添加(新的SomeObject)
{
CollectionItem1=entity.Property1,
CollectionItem2=entity.Property2,
CollectionItem3=entity.Property3,
CollectionItem4=entity.Property4,
CollectionItem5=entity.Property5,
CollectionItem6=entity.Property6,
CollectionItem7=entity.Property7,
});
}
}
尝试
{
_context.Connection.Open();
EntityConnection连接=_context.connection作为EntityConnection;
SqlConnection-SqlConnection=null;
if(连接!=null)
{
sqlConnection=connection.StoreConnection作为sqlConnection;
}
if(sqlConnection!=null)
{
SqlBulkCopy bulkInsert=新的SqlBulkCopy(sqlConnection);
bulkInsert.DestinationTableName=“SomeTable”;
bulkInsert.ColumnMappings.Add(“CollectionItem1”、“Column1”);
bulkInsert.ColumnMappings.Add(“CollectionItem2”、“Column2”);
bulkInsert.ColumnMappings.Add(“CollectionItem3”、“Column3”);
bulkInsert.ColumnMappings.Add(“CollectionItem4”、“Column4”);
bulkInsert.ColumnMappings.Add(“CollectionItem5”、“Column5”);
bulkInsert.ColumnMappings.Add(“CollectionItem6”、“Column6”);
bulkInsert.ColumnMappings.Add(“CollectionItem7”、“Column7”);
//数据线是对象的集合
bulkInsert.WriteToServer(dataLines.AsDataReader());
_SaveChanges();
}
}
最后
{
_context.Connection.Close();
}
batchsize是300秒内25000行。我知道如何使用SqlBulkCopy类。我的问题是不同的,当我要使用SqlBulkCopy时,我可以更新循环中的数据吗?意味着一次更新一行?如果您想一次更新一行,那么您不需要SqlBulkCopy。SqlBulkCopy在这种情况下速度较慢。我需要知道在循环中使用SqlBulkCopy逐个更新数据是否可行……如果是,那么您可以用代码示例指导我。感谢使用循环更新是不可行的,批量更新意味着您拥有大量数据,并且希望在DB和本语句中进行更新。我不明白你为什么需要循环?你能给我一点完整的代码吗。给我数据线的代码。在这种情况下,thanksdatalines只是一个HashSet。在插入数据库之前,如何将数据分配给数据线?我已经为您修改了上面的内容,我们不能用List代替HashSet吗?如果没有,请告诉我原因。
Public Shared Function BulkSave(ByVal dt As DataTable) As Boolean
Dim mydb As New CSdatabase
Try
Dim connectionString = "Connection String"
'' so there is no need to map columns.
Using bulkCopy As SqlBulkCopy = New SqlBulkCopy(connectionString)
bulkCopy.BatchSize = 25000
bulkCopy.BulkCopyTimeout = 300
bulkCopy.ColumnMappings.Add("EmailID", "EmailID")
bulkCopy.ColumnMappings.Add("Name", "Name")
bulkCopy.ColumnMappings.Add("FileName", "FileName")
bulkCopy.ColumnMappings.Add("IsDownloaded", "IsDownloaded")
bulkCopy.DestinationTableName = "dbo.CandidateApplication"
bulkCopy.WriteToServer(dt)
End Using
Catch ex As Exception
Throw ex
Finally
'mydb.closeConnection() ' Close your conneciton here
End Try
Return True
End Function
HashSet<SomeObject> dataLines = new HashSet<SomeObject>();
foreach (var entity in someCollection)
{
if(entity == somecondition)
{
dataLines.Add(new SomeObject
{
CollectionItem1 = entity.Property1,
CollectionItem2 = entity.Property2,
CollectionItem3 = entity.Property3,
CollectionItem4 = entity.Property4,
CollectionItem5 = entity.Property5,
CollectionItem6 = entity.Property6,
CollectionItem7 = entity.Property7,
});
}
}
try
{
_context.Connection.Open();
EntityConnection connection = _context.Connection as EntityConnection;
SqlConnection sqlConnection = null;
if (connection != null)
{
sqlConnection = connection.StoreConnection as SqlConnection;
}
if (sqlConnection != null)
{
SqlBulkCopy bulkInsert = new SqlBulkCopy(sqlConnection);
bulkInsert.DestinationTableName = "SomeTable";
bulkInsert.ColumnMappings.Add("CollectionItem1", "Column1");
bulkInsert.ColumnMappings.Add("CollectionItem2", "Column2");
bulkInsert.ColumnMappings.Add("CollectionItem3", "Column3");
bulkInsert.ColumnMappings.Add("CollectionItem4", "Column4");
bulkInsert.ColumnMappings.Add("CollectionItem5", "Column5");
bulkInsert.ColumnMappings.Add("CollectionItem6", "Column6");
bulkInsert.ColumnMappings.Add("CollectionItem7", "Column7");
// dataLines is a collection of objects
bulkInsert.WriteToServer(dataLines.AsDataReader());
_context.SaveChanges();
}
}
finally
{
_context.Connection.Close();
}