2011-01-03 2 views
1

Я tansfering данные из MSSQL в MySQL с помощью SSIS.I сделали отображение всех tables.But во время выполнения пакета я получаю сообщение об ошибке:ошибка MySQL при выполнении SSIS пакета

[tabl_name [1056]] Error: An exception has occurred during data insertion, the message returned from the provider is: ERROR [07006] [MySQL][ODBC 3.51 Driver][mysqld-5.1.33-community-log]Restricted data type attribute violation(SQL_C_NUMERIC)

[product [402]] Error: An exception has occurred during data insertion, the message returned from the provider is: Unable to cast object of type 'System.Int32' to type 'System.Char[]'.

Я также сравнил тип данных всех столбцов, и я нашел его таким же. После этого я провел некоторое исследование и обнаружил, что проблема с типом данных десятичная (10,2). Но я не нахожу решение.

Заранее спасибо.

ответ

0

Один простой способ избавиться от этой проблемы - временно преобразовать этот проблемный столбец из десятичной в varchar, после завершения переноса, преобразовать его обратно в десятичную.

Вышеупомянутое может применяться к MSSQL, поскольку ошибка исправлена ​​в MSSQL.

+0

да..и думал, что такое же решение ... но проблема в том, что я не могу изменить таблицу MS SQL. Также нужно найти способ манипулировать MySQL. Также я выяснил, что проблема связана с типом данных BIT, в MSSQL он показывает true и false вместо 0 n 1, поэтому я изменил свой тип данных на varchar и пробовал все возможности, но не имел успеха ... поэтому я ищу эквивалент MYSQL для типа данных MS SQL Bit.спасибо – Dharmesh

+0

mysql не имеет типа данных BIT (ближайший is int) – ajreal

+0

Да ... thats what .... Я изменил тип данных на INT, но он работает dint ... Я пытался использовать другие типы данных, такие как varchar, binary tinyint и boolean ... до сих пор нет ответа ... очень любопытно узнать, что такое хак .. спасибо за ответ. – Dharmesh

0

Либо использовать преобразование данных в задаче потока данных, либо использовать недопустимые типы в исходном запросе.

 
DECLARE @bit as bit 
set @bit = 1 
SELECT CAST(@bit as int) 
0

У меня такая же ошибка при преобразовании из 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()) 

Я знаю, что это awfull, но это работает: ошибка появляется только на первом ExecuteReader. Все остальные идут хорошо.

0

На этой неделе я получил ту же большую головную боль. Я пробовал много способов. Слава Богу, в общем, один из них работал. Надеюсь, это поможет вам немного.

Для некоторых столбцов с типом данных Int, datetime, decimal ...., здесь я идентифицирован как ColumnA, и я использовал его как тип даты.

  1. в источнике потока данных используйте команду SQL для извлечения данных. Sth как выберите ISNULL (Columna, '1800-01-01'), как Columna, C1, C2 , ... Cn из таблицы

Обязательно используйте функцию IsNull для всех столбцов с указанным выше типом данных.

  1. Возьмите SSIS pkg. Он должен работать.

  2. Вернитесь к Control Flow, в рамках задачи потока данных добавьте элемент управления SQL Task для замены данных. Я имею в виду, обновить ColumnA от «1800-01-01» до нулевого значения.

Это работает для меня. В моей ситуации я не могу использовать опцию ignore failure. Потому что, если я это сделаю, я потеряю тысячи строк данных.

Смежные вопросы