【问题标题】:mysql error while executing SSIS package执行SSIS包时出现mysql错误
【发布时间】:2011-06-02 19:57:14
【问题描述】:

我正在使用 SSIS 将数据从 MSSQL 传输到 MySQL。我已经完成了所有表的映射。但是在执行包时我遇到了错误:

[tabl_name [1056]] 错误:数据插入过程中发生异常,提供者返回的消息是:ERROR [07006] [MySQL][ODBC 3.51 Driver][mysqld-5.1.33-community-log]受限数据类型属性违规(SQL_C_NUMERIC)

[product [402]] 错误:数据插入过程中发生异常,提供程序返回的消息是:无法将“System.Int32”类型的对象转换为“System.Char[]”类型。

我还比较了所有列的数据类型,发现都是一样的。 之后我做了一些研究,发现数据类型小数(10,2)存在问题。但我没有找到解决方案。

提前致谢。

【问题讨论】:

    标签: mysql sql-server ssis


    【解决方案1】:

    解决此类问题的一个简单方法是将有问题的列从十进制临时转换为 varchar,完成迁移后,将其转换回十进制。

    以上可以适用于 MSSQL,因为错误是在 MSSQL 中抱怨的。

    【讨论】:

    • 是的..我认为相同的解决方案...但问题是我无法更改 MS SQL 表..所以需要找到某种方式来操作 MySQL.Also 我发现问题出在 BIT 数据类型上,在 MSSQL 中它显示 true 和 false 而不是 0 n 1 ,所以我将数据类型更改为 varchar 并尝试了所有可能性但没有成功......所以我正在寻找 MS SQL Bit 数据类型的 MYSQL 等价物......谢谢跨度>
    • mysql没有BIT数据类型(最接近的是int)
    • 是的......就是这样......我将数据类型更改为 INT,但它不起作用......我尝试了其他数据类型,如 varchar、binary tinyint 和 boolean......仍然没有答案...非常想知道黑客是什么...感谢您的回复。
    • 得到了破解......有一个选项说忽略失败......之后它现在工作正常:) 谢谢。
    【解决方案2】:

    在数据流任务中使用数据转换或在源查询中强制转换无效类型。

    将@bit 声明为位 设置@bit = 1 SELECT CAST(@bit as int)

    【讨论】:

      【解决方案3】:

      从 Access 转换为 ODBC 时,我遇到了同样的错误(在 64 位 MS JET 上不会再出现)。我的 FldSeqnr 字段是十进制(15,0) 定义:

              Dim gtSelectSQL As String = "SELECT FldText FROM Data WHERE CollCode = ? AND CollSeq = ? AND FldCode = ? AND FldSeqnr = ?"
              Dim DRgtSelect As odbcDataReader = Nothing
              Dim DbCgtSelect As odbcCommand
              Dim gtSelP1 As New odbcParameter("@CollCode", odbc.odbcType.VarChar, 4)
              Dim gtSelP2 As New odbcParameter("@CollSeq", Odbc.OdbcType.Int, 4)
              Dim gtSelP3 As New odbcParameter("@FldCode", odbc.odbcType.VarChar, 4)
              Dim gtSelP4 As New odbcParameter("@FldSeqnrs", odbc.odbcType.Decimal, 16)
              DbCgtSelect = New odbcCommand(gtSelectSQL, DbConn)
              Dim NrErr As Integer = 0
         Retrysql:
         Try     
              dSelP1.Value = CollCode
              dSelP2.Value = CollSeq
              dSelP3.Value = p.FldCode
              dSelP4.Value = strt
              dSelP5.Value = endn
              DRdSelect = DbCdSelect.ExecuteReader()
              Do While (DRdSelect.Read())
                   ...
              End Do
          Catch ex As Exception
              If ex.Message.Substring(0, 13) = "ERROR [07006]" Then
                 If NrErr = 0 Then
                     NrErr += 1
                     GoTo retrySql
                 End If
              End If
              MsgBox(ex.ToString())
      

      我知道这很糟糕,但它确实有效:错误仅出现在第一个 ExecuteReader 上。其他一切顺利。

      【讨论】:

        【解决方案4】:

        这周我也同样头疼。我尝试了很多方法。感谢上帝,最后,其中一个起作用了。希望对你有所帮助。

        对于一些数据类型为Int、datetime、decimal....的列,这里我标识为ColumnA,我用它作为datetime类型。

        1. 在数据流源中,使用 SQL 命令检索数据。某事喜欢 选择 isnull(ColumnA,'1800-01-01') 作为 ColumnA, C1, C2, ... cn 来自表

        确保对具有上述数据类型的所有列使用 Isnull 函数。

        1. 执行 SSIS pkg。它应该可以工作。

        2. 回到Control Flow,在数据流任务下,添加SQL Task控件,将数据替换回来。我的意思是,再次将 ColumnA 从 '1800-01-01' 更新为 null。

        这对我有用。在我的情况下,我不能使用忽略失败选项。因为如果这样做,我将丢失数千行数据。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-06-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-05-28
          • 1970-01-01
          相关资源
          最近更新 更多