Странная проблема с установкой типа данных пользовательской переменной для использования в задаче создания сценариев

Это расширение этого вопроса. Я установил пользовательскую переменную с именем Type и установил для нее тип данных Int16. В моей задаче «Сценарий», в зависимости от результатов проверки содержимого другой пользовательской переменной с именем fileName, я устанавливаю значение User::Type в одно из трех значений. Все эти значения являются целыми числами. Значение по умолчанию User::Type — 0, а 3 новых значения — 1, 2 и 3. Задача «Сценарий» — это первый элемент внутри контейнера цикла по каждому элементу в моем потоке управления. Код для задачи сценария:

Imports System
Imports System.Data
Imports System.Math
Imports System.IO
Imports Microsoft.SqlServer.Dts.Runtime

Public Class ScriptMain
    ' Created: Zack Bethem – AmberLeaf
    Public Sub Main()
        Dim fileName As String
        Dts.Variables.Item("User::Type").Value = 0
        If Dts.Variables.Contains("User::fileName") = True Then
            fileName = CStr(Dts.Variables.Item("User::fileName").Value)
            'System.Windows.Forms.MessageBox.Show(fileName)
            If fileName.Contains("0074000") = True Then
                Dts.Variables.Item("User::Type").Value = 1
            ElseIf fileName.Contains("0072000") = True Then
                Dts.Variables.Item("User::Type").Value = 2
            ElseIf fileName.Contains("0022000") = True Then
                Dts.Variables.Item("User::Type").Value = 3
            End If
            Dts.TaskResult = Dts.Results.Success
        Else
            Dts.TaskResult = Dts.Results.Failure
        End If
    End Sub
End Class

Ошибка, которую я получаю:

SSIS package "ACS_ALL_Import .dtsx" starting.
Error: 0xC001F009 at ACS_ALL_Import: The type of the value being assigned to variable "User::Type" differs from the current variable type. Variables may not change type during execution. Variable types are strict, except for variables of type Object.
Error: 0xC001C012 at Foreach Loop Container: ForEach Variable Mapping number 2 to variable "User::Type" cannot be applied.
Warning: 0x80019002 at ACS_ALL_Import: SSIS Warning Code DTS_W_MAXIMUMERRORCOUNTREACHED.  The Execution method succeeded, but the number of errors raised (4) reached the maximum allowed (1); resulting in failure. This occurs when the number of errors reaches the number specified in MaximumErrorCount. Change the MaximumErrorCount or fix the errors.
SSIS package "ACS_ALL_Import .dtsx" finished: Failure.

Если я изменю тип данных User::Type на любой другой элемент, а также обновлю сценарий, чтобы назначить этот тип данных, я все равно получаю эту ошибку. Я удалил эту ссылку на переменную из задачи создания сценариев и удалил саму переменную из пакета, а затем снова добавил ее, но все равно получаю ту же ошибку.

Пока я не установил тип переменной String. Тогда это сработало. Есть ли какое-то другое преобразование типа данных, которое происходит за кулисами, но я не могу его увидеть?


person wergeld    schedule 25.02.2011    source источник


Ответы (3)


только что видел ваш комментарий по этому поводу на предыдущий вопрос. Эта строка в вашей ошибке:

Foreach Loop Container: ForEach Variable Mapping number 2 to variable "User::Type" cannot be applied.

указывает мне, что проблема может быть не в вашей задаче Script, а в сопоставлении переменных в контейнере For Each Loop Container. Вы устанавливаете переменную Type в строку, возможно ошибочно, в этой задаче?

введите здесь описание изображения

person grapefruitmoon    schedule 25.02.2011
comment
Нет, я не устанавливал тип в задаче сценария явно. Я присвоил значение, например: Dts.Variables.Item(User::Type).Value = 1, что, как я думал, будет означать, что это INT. Но это не так. Когда я использовал другие пользовательские переменные (3 из них, логические - как видно из моего другого вопроса), он все еще выдавал ошибку типа данных. Может быть, задача сценария всегда выводит тип String? Это мое первое путешествие в кроличью нору SSIS глубже, чем просто цикл по каждому элементу и несколько плоских файлов. - person wergeld; 25.02.2011
comment
Я думал, что ошибка вовсе не в Скриптовой задаче; то, что у вас есть, должно работать. Но изменяется ли переменная «Тип» на вкладке «Сопоставление переменных» задачи «Для каждой», поскольку именно на это указывает ошибка? (см. изображение, добавленное к ответу выше) - person grapefruitmoon; 25.02.2011
comment
Я создал переменную User::Type, убедившись, что выбран поток управления (щелкнув за пределами моего Foreach в пустом месте), а затем с помощью выдвижного меню «Переменные» введите имя и тип данных, а также значение по умолчанию. . Я не создавал переменную User::Type с помощью редактора циклов по каждому элементу, но она находится в окне сопоставления переменных и имеет значение Index = 0 (здесь я не могу редактировать переменную). - person wergeld; 25.02.2011
comment
Можете ли вы удалить переменную Type из сопоставления в задаче «Для каждого»? Я предполагаю, что вам не нужно сопоставлять его там, и что вы сопоставляете переменную для пути к файлу? - person grapefruitmoon; 25.02.2011
comment
Я сопоставляю User::fileName в цикле Foreach. Если я удаляю User::Type из сопоставления переменных в цикле по каждому элементу (он все еще находится в выдвижном меню глобальной переменной), я получаю сообщение об ошибке, что переменная User::Type недоступна в области действия задачи сценария. . - person wergeld; 25.02.2011
comment
Какова область действия переменной Type? В данном случае это должно быть имя пакета. - person grapefruitmoon; 25.02.2011
comment
Я просто снова запустил пакет без каких-либо изменений, кроме удаления переменной User::Type из окна сопоставления переменных цикла по каждому элементу, и на этот раз он работал без ошибок... Я ничего не менял от одного запуска к другому. Область действия обеих переменных (имя файла и тип) относится ко всему пакету. - person wergeld; 25.02.2011
comment
Похоже, у вас это работает сейчас. Но может быть вероятность, что у вас есть две переменные с одинаковым именем, но с разной областью действия. Вы можете проверить это, нажав кнопку «Показать все переменные» в окне «Переменные». - person grapefruitmoon; 25.02.2011
comment
Проверено, что... показаны только две переменные Type и fileName. Сейчас все идет хорошо. Спасибо за помощь в этом. - person wergeld; 25.02.2011
comment
Я получил похожее сообщение об ошибке, но имел сопоставление переменных. Затем я внимательно посмотрел на тип данных переменной, которую я случайно пометил как UInt, а не Int32. - person brentlightsey; 09.03.2013

у меня была похожая ситуация. Просто определите другую переменную как имя файла для «для каждого цикла», вам не нужно использовать «имя файла» в сценарии. определите другую переменную пакета int32 как «счетчик» для использования в вашем скрипте. Это работает!

person Kumar    schedule 21.03.2011

Та же проблема, моя ошибка заключалась в том, что я отображал слишком много столбцов в своем цикле Foreach в соответствии с предложением грейпфрутовой луны. У меня также было неправильное количество столбцов в моем запросе, поэтому неправильное имя столбца было сопоставлено с переменной, которую я использовал для имени моего файла. Однажды я изменил номер столбца в сопоставлении и удалил ненужные переменные. Пакет заработал.

person Petros    schedule 09.04.2019