我正在使用.NET应用程序,用户可以在其中选择一些过滤器,例如日期,ID等。
我需要做的是使用这些过滤器查询SQL Server数据库表,并将其转储到MySQL表中。我不需要表中的所有字段,只需几个。
到目前为止,我需要遍历SQL Server数据集中的所有记录,并将它们一一插入到我的MySQL表中。
总有没有取得更好的性能?我一直在和Dapper一起玩,但是找不到解决方法:
Insert into MySQLTable (a,b,c)
Select a,b,c from SQLServerTable
where a=X and b=C
有什么想法吗?
无法使用链接服务器选项,因为我们无法访问SQL Server配置,因此正在寻找批量插入数据的最有效方法。
答案 0 :(得分:0)
如果要使用dapper在.NET内执行此操作,请使用c#并执行以下操作;
假设:
两个表中具有相同架构的表;
CREATE Events (
EventId int,
EventName varchar(10));
.Net类
public class Event
{
public int EventId { get; set; }
public string EventName { get; set; }
}
下面的代码片段应为您提供一些可以用作基础的内容。
List<Event> Events = new List<Event>();
var sqlInsert = "Insert into events( EventId, EventName ) values (@EventId, @EventName)";
using (IDbConnection sqlconn = new SqlConnection(Sqlconstr))
{
sqlconn.Open();
Events = sqlconn.Query<Event>("Select * from events").ToList();
using (IDbConnection mySqlconn = new SqlConnection(Sqlconstr))
{
mySqlconn.Open();
mySqlconn.Execute(sqlInsert, Events);
}
}
上面的代码段从SQL Server中的事件表中选择行,并填充“事件”列表。通常,Dapper将返回IEnumerable <>,但是您正在投射该ToList()。现在有了“事件”列表,您可以连接到MySQL并针对“事件”列表执行插入语句。 此片段只是一个准系统示例。如果在Execute上没有事务,则将自动提交每一行。如果添加事务,则将在插入“事件”列表中的所有项目时提交。
当然,这样做有弊端。要意识到的一件重要事情是,如果您尝试从SQL向MySQL插入100万行,则该列表将包含100万个条目,这将增加内存占用。在那种情况下,我会使用Dapper的Buffered = false选项。这将一次返回100万行1行。您的c#代码可以让他们枚举结果并将行添加到列表中并保留一个计数器。在将1000行插入列表之后,您可以将插入部分插入MySQL,然后清除列表并枚举行。
这将在处理大量行的同时减小应用程序的内存占用。
话虽如此,在服务器级别上,没有什么比批量插入更胜一筹了。
-HTH