SSIS同步数据 SqlServer到Mysql

我正在使用VS2019的SSIS工具,对SqlServer中的一张表进行数据同步到MySql表中,数据源用的OLE_DB sqlserver 目标是ODBC的Mysql, 我现在是下面的操作,

img

根据主键进行匹配,有新数据就插入数据,无新数据就根据主键更新,但是目前 我不太清楚 如何对该表进行更新,试了很多办法,

想使用下面这个命令组件,但是不支持ODBC

img

要在SSIS中同步数据从SQL Server到MySQL,你可以使用以下步骤:

  1. 在SSIS中创建一个新的包。
  2. 添加一个数据流任务(Data Flow Task)。
  3. 在数据流任务中添加一个源组件和一个目标组件。
    • 源组件选择 "OLE DB Source",并配置连接到SQL Server数据库,选择要同步的表或查询作为数据来源。
    • 目标组件选择 "ADO.NET Destination",并配置连接到MySQL数据库,选择要同步的表作为数据目标。
  4. 连接源组件和目标组件,确认列的映射和转换规则。
  5. 运行包,验证数据同步是否成功。

在配置源和目标组件时,你需要提供适当的连接信息和凭据,以确保SSIS可以访问和提取源数据,并将其加载到目标数据库中。

注意:在使用SSIS同步数据之前,请确保已经安装了适当的驱动程序和连接管理器,以便SSIS可以正确连接到SQL Server和MySQL数据库。

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 以下回答由chatgpt基于相关博客总结生成:

    我了解到您想在SSIS中使用OLE DB和ODBC实现SqlServer到MySql的数据同步,并解决更新操作的问题。您可以按照以下步骤操作:

    1. 首先,确保您已经在SSIS中创建了一个数据流任务,并且配置了SqlServer和MySql的连接管理器。确保连接管理器使用的是正确的OLE DB和ODBC提供程序。

    2. 将一个数据源组件添加到数据流任务中,并配置它以连接到SqlServer数据库。使用OLE DB连接管理器,选择要同步的表,并指定查询或者表名。

    3. 添加一个数据流转换组件(通常是一个脚本组件),并将数据源组件连接到该转换组件。

    4. 在脚本组件中,您可以使用C#或VB.NET编写自定义代码来处理数据同步逻辑。以下是一个示例的C#代码片段,展示如何在脚本组件中实现数据更新操作:

    using System.Data.Odbc;
    using System.Data.OleDb;
    
    public void Main()
    {
        string odbcConnectionString = "YOUR_ODBC_CONNECTION_STRING";
        string oleDbConnectionString = "YOUR_OLE_DB_CONNECTION_STRING";
        string tableName = "YOUR_TABLE_NAME";
    
        // 创建ODBC连接和OLE DB连接
        using (OdbcConnection odbcConnection = new OdbcConnection(odbcConnectionString))
        using (OleDbConnection oleDbConnection = new OleDbConnection(oleDbConnectionString))
        {
            odbcConnection.Open();
            oleDbConnection.Open();
    
            // 查询源表数据
            string selectQuery = $"SELECT * FROM {tableName}";
            using (OdbcCommand odbcCommand = new OdbcCommand(selectQuery, odbcConnection))
            {
                using (OdbcDataReader odbcReader = odbcCommand.ExecuteReader())
                {
                    // 遍历源表数据
                    while (odbcReader.Read())
                    {
                        // 查询目标表是否有匹配的记录
                        string primaryKey = odbcReader["primary_key"].ToString();
                        string selectTargetQuery = $"SELECT * FROM {tableName} WHERE primary_key = '{primaryKey}'";
                        using (OleDbDataAdapter oleDbAdapter = new OleDbDataAdapter(selectTargetQuery, oleDbConnection))
                        {
                            DataTable targetTable = new DataTable();
                            oleDbAdapter.Fill(targetTable);
    
                            // 如果目标表有匹配的记录,则更新数据
                            if (targetTable.Rows.Count > 0)
                            {
                                DataRow targetRow = targetTable.Rows[0];
                                targetRow["column1"] = odbcReader["column1"];
                                targetRow["column2"] = odbcReader["column2"];
    
                                // 更新目标表数据
                                using (OleDbCommand oleDbCommand = new OleDbCommand($"UPDATE {tableName} SET column1 = ?, column2 = ? WHERE primary_key = ?", oleDbConnection))
                                {
                                    oleDbCommand.Parameters.AddWithValue("column1", targetRow["column1"]);
                                    oleDbCommand.Parameters.AddWithValue("column2", targetRow["column2"]);
                                    oleDbCommand.Parameters.AddWithValue("primary_key", targetRow["primary_key"]);
                                    oleDbCommand.ExecuteNonQuery();
                                }
                            }
                            // 否则,插入数据到目标表
                            else
                            {
                                using (OleDbCommand oleDbCommand = new OleDbCommand($"INSERT INTO {tableName} (column1, column2) VALUES (?, ?)", oleDbConnection))
                                {
                                    oleDbCommand.Parameters.AddWithValue("column1", odbcReader["column1"]);
                                    oleDbCommand.Parameters.AddWithValue("column2", odbcReader["column2"]);
                                    oleDbCommand.ExecuteNonQuery();
                                }
                            }
                        }
                    }
                }
            }
        }
    
        Dts.TaskResult = (int)ScriptResults.Success;
    }
    

    请根据实际情况修改代码中的连接字符串、表名和列名。

    1. 将脚本组件连接到目标组件,如数据库目标(使用ODBC连接MySql)或者其他适合您需求的组件。

    这样,您就可以使用SSIS中的OLE DB和ODBC连接管理器,并通过自定义代码实现SqlServer到MySql的数据同步,并解决表的更新操作问题。

    请注意,如果您在SSIS中无法直接使用ODBC连接,您可以尝试使用脚本组件来执行自定义代码,并使用ODBC连接来处理数据同步逻辑。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^