我正在努力将数据库从MS Access移动到SQL Server.为了将数据移动到新表中,我决定编写一个同步例程,因为模式已经发生了很大变化,它允许我对运行它的程序运行测试,并在需要新的测试数据时重新同步.然后最终我将进行最后一次同步并在新的sql server版本上启动.
不幸的是我遇到了麻烦,我的方法是从Access到SQLServer的复制
public static void BulkCopyAccessToSQLServer
(string sql, CommandType commandType, DBConnection sqlServerConnection,
string destinationTable, DBConnection accessConnection, int timeout)
{
using (DataTable dt = new DataTable())
using (OleDbConnection conn = new OleDbConnection(GetConnection(accessConnection)))
using (OleDbCommand cmd = new OleDbCommand(sql, conn))
using (OleDbDataAdapter adapter = new OleDbDataAdapter(cmd))
{
cmd.CommandType = commandType;
cmd.Connection.Open();
adapter.SelectCommand.CommandTimeout = timeout;
adapter.Fill(dt);
using (SqlConnection conn2 = new SqlConnection(GetConnection(sqlServerConnection)))
using (SqlBulkCopy copy = new SqlBulkCopy(conn2))
{
conn2.Open();
copy.DestinationTableName = destinationTable;
copy.BatchSize = 1000;
copy.BulkCopyTimeout = timeout;
copy.WriteToServer(dt); …Run Code Online (Sandbox Code Playgroud) 当不依赖于表时,我可以使用以下代码执行 SqlBulkCopy:
//TableData and FieldData have column info in memory.
using (SqlConnection connection = new SqlConnection(@"Data Source=WLO1;Initial Catalog=GenTest2;Integrated Security=True"))
{
connection.Open();
foreach (string tableName in tablesInOrderToProcess)
{
if (tableDataList.ContainsKey(tableName))
{
TableData td = tableDataList[tableName];
SqlBulkCopy copy = new SqlBulkCopy(connection);
copy.BatchSize = 10000;
copy.DestinationTableName = tableName;
System.Data.DataTable dt = new DataTable();
foreach (FieldData fd in td.FieldList.Values)
{
string fieldName = fd.Name;
string fieldDataType = fd.DataType;
string fieldSize = fd.Size.ToString(); ;
string fieldConstant = fd.constantValue;
string fieldAverage = fd.averageSize;
string fieldPickList = …Run Code Online (Sandbox Code Playgroud) 我将大量记录加载到我的应用程序中(100万+)并对它们进行大量处理.处理要求它们都在内存中.
之后,我想将所有(现在已修改的)记录转储到空表中.
加载记录只需几秒钟,我最终得到了大量的MyRecord项目.
节省使用也SqlBulkCopy需要几秒钟.
但是SqlBulkCopy需要(我相信)a DataTable- 并将我的记录加载到一个DataTable缓慢的 - 每分钟约7500条记录使用
dataTable.Rows.Add(myRecord.Name, myRecord.Age, ....)
Run Code Online (Sandbox Code Playgroud)
有没有更快的方法来执行这个中间步骤?
我们有一个巨大的列表(比如100,000),需要转换DataTable为SqlBulkcopy.
你能指导什么是最快的方法,而不使用for循环?现在我们这样做 - 在下面的代码listDos是对象列表
using (var dataTable = new DataTable(dataTableName))
{
dataTable.Locale = CultureInfo.CurrentCulture;
var columns = new[]
{
new DataColumn("Id", typeof(int)),
new DataColumn("FkId", typeof(int)),
new DataColumn("Status", typeof(string)),
new DataColumn("RecordFrom", typeof(DateTime))
};
dataTable.Columns.AddRange(columns);
foreach (ObjectDo listDo in listDos)
{
var row = dataTable.NewRow();
if (rebuildDo.Id != null) row["Id"] = rebuildDo.Id;
if (rebuildDo.FkId!= null) row["FkId"] = rebuildDo.FkId;
row["Status"] = rebuildDo.Status;
row["RecordFrom"] = rebuildDo.RecordFrom;
dataTable.Rows.Add(row);
}
return dataTable;
}
Run Code Online (Sandbox Code Playgroud) SqlBulkCopy我已经使用实体框架很长时间了。我刚刚迁移到 Entity Framework Core。在我做类似的事情之前:
var itemsDT = jobs.ToDataTable<ProfileJob>();
using (var connection = new SqlConnection(_connStr))
{
connection.Open();
using (var bulkCopy = new SqlBulkCopy(connection))
{
bulkCopy.BatchSize = 1000;
bulkCopy.DestinationTableName = "dbo.JobRemoveUniquePermissionsFailed";
bulkCopy.WriteToServer(itemsDT);
}
}
Run Code Online (Sandbox Code Playgroud)
这ToDataTable是一个基于旧实体框架构建的大型扩展类。我还没有找到任何与 core 类似的样本。
有人有一个如何SqlBulkCopy与 EF Core 一起使用的小样本吗?
任何人都可以帮助将C#中的字符串值转换为Sql中的等效位.我正在尝试将数据表的值批量复制到Sql表中.我在数据表中的所有值都是字符串格式.当我尝试批量复制到SQL表时,我遇到了bit数据类型列的错误.任何人都可以在我批量复制到SQL表之前发布C#代码将字符串转换为位类型.
谢谢,Vix
所有以下处理都在localmachine上进行:
我有一个源数据库(在服务器上)和一个目标数据库(本地机器).我有一个表格列表,我希望从源文件复制到目标,即服务器 - >本地.
我首先使用简单的SELECT*语句并使用Adpter.Fill(myDataTable)将来自服务器的所有数据存储在DataTable数组中,然后将myDataTable添加到DataTable数组中.
然后在本地我运行一个我在磁盘上的SQL脚本来删除本地数据库并重新创建它.使用[RightClick - > Tasks - > Generate Scripts]从SSMS获取脚本
删除并重新创建本地数据库后,我使用SqlBulkCopy和前面的DataTable数组将服务器数据复制到新创建的本地数据库中.
问题是,在我点击SqlBulkCopy部分之前,一切都按预期工作.我没有例外,没有消息,也没有触发的bcp_SqlRowsCopied事件.数据根本没有被复制过......这里发生了什么,我至少会发现某种错误......
以下是控制台应用程序的完整代码:请注意,它还没有生产就绪,因为还没有任何类型的错误处理.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
using System.Configuration;
using System.Data;
using System.IO;
using System.Diagnostics;
namespace TomboDBSync
{
class Program
{
//Names of all the tables to copy from the server (the source) to our local db (the destination)
public static string[] tables = new string[] {"br_Make_Model", "br_Model_Series", "br_Product_EngineCapacity", "br_Product_ProductAttributeDescription", "CompanyPassword", "dtproperties", "EngineCapacity", "Make", "Model", "PetrolType", "Product", "ProductAttribute", "ProductAttributeDescription", "ProductsImport", "ProductType", …Run Code Online (Sandbox Code Playgroud) 我对表上的每个插入执行触发器.我正在使用批量复制来对此表进行批量插入.我读过FireTriggers会在桌子上触发我的触发器,但它只进行一次,而不是每次插入.触发器从插入的项中获取一些数据,并将其插入另一个表中.我只看到在另一个表中插入了一行,而不是一行.我错过了一个选项吗?
var bulkCopy = new SqlBulkCopy(connection, SqlBulkCopyOptions.Default | SqlBulkCopyOptions.FireTriggers, transaction);
Run Code Online (Sandbox Code Playgroud) 尝试使用 SqlBulkCopy 插入数据,我收到此错误:
他们推荐以下两件事之一:
但我很高兴发生“隐式截断”...(即数据库插入或 SqlBulkCopy 本身将用户提供的值削减到适当的大小)
问题:
SET ANSI_WARNINGS OFF”时一样,以便“当OFF时,数据被截断为列的大小并且语句成功”我正在尝试DataTable在Sql Server上写入目标表.DataTable dt只包含一列及其调用Email.我的目标表中包含tpid,lastname,age,date和email.这是我用于批量复制的代码:
using (SqlConnection sqlConn = new SqlConnection(sqlCs))
{
sqlConn.Open();
using (SqlBulkCopy bulkCopy = new SqlBulkCopy(sqlConn.ConnectionString, SqlBulkCopyOptions.KeepIdentity | SqlBulkCopyOptions.UseInternalTransaction))
{
bulkCopy.DestinationTableName = destinationTableName;
bulkCopy.WriteToServer(dt);
}
}
Run Code Online (Sandbox Code Playgroud)
我看到的是,在我的目标表中,我从我的DataTable中获取了Email的值,tpid而不是插入到列中email.我这里没有使用列映射,但是不应该自动批量复制电子邮件与电子邮件匹配?
我有 100 多个文件要导入 sql server,其中大部分是 500 MB。我想利用 SQL Server 的并行导入实用程序并阅读了许多网页,如下所示:
如何在 30 分钟内加载 1 TB 数据
https://technet.microsoft.com/en-us/library/dd537533(v=sql.100).aspx
使用表级锁定并行导入数据
https://technet.microsoft.com/en-us/library/ms186341(v=sql.105).aspx
控制批量导入的锁定行为
https://technet.microsoft.com/en-us/library/ms180876(v=sql.105).aspx
以及 stackoverflow 中的答案
然而,他们都没有给出一个简单的代码示例。我知道如何使用批量插入/bcp,但我不知道从哪里开始并行导入?任何人都可以帮助我吗?
我的系统是Windows,我使用的是SQL server 2016。源数据文件为txt格式。
在此先感谢您的帮助!
杰森
sql-server parallel-processing bulkinsert sqlbulkcopy bulk-load
我有一个任务是将Excel数据导入Sql server.excel数据来自excel模板.有不同的excel模板可用于不同的cleint,因此excel中的列在所有模板中都不相同.必须将数据导入到SQl的一个公共表中.
我用google搜索,网上有很多样本,但我无法确定哪种方法最好.
我可以请你指导我如何实现上述考虑模板的动态列.
在excel模板中,开始行和结束行不是固定的.
sqlbulkcopy ×12
c# ×10
sql-server ×8
sql ×4
.net ×2
asp.net ×2
bulkinsert ×2
bulk-load ×1
datacontext ×1
datatable ×1
linq ×1
ms-access ×1
ssis ×1
triggers ×1