.NET从SQL Server到MySQL插入数据而无需循环访问数据

时间:2019-04-02 15:29:17

标签: mysql .net dapper

我正在使用.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配置,因此正在寻找批量插入数据的最有效方法。

1 个答案:

答案 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