ปัญหาแปลก ๆ ในการตั้งค่าประเภทข้อมูลตัวแปรผู้ใช้เพื่อใช้ในงานเขียนสคริปต์

นี่เป็นส่วนขยายของคำถามนี้ ฉันได้ตั้งค่าตัวแปร User ชื่อ Type และตั้งค่าประเภทข้อมูลเป็น Int16 ในงานการเขียนสคริปต์ของฉัน ขึ้นอยู่กับผลลัพธ์ของการทดสอบเนื้อหาของตัวแปร User อื่นที่เรียกว่า fileName ฉันกำลังตั้งค่า User::Type ให้เป็นหนึ่งใน 3 ค่า ค่าเหล่านี้ทั้งหมดเป็นจำนวนเต็ม ค่าเริ่มต้นของ User::Type คือ 0 และค่าใหม่ 3 ค่าคือ 1, 2 และ 3 งานสคริปต์เป็นองค์ประกอบแรกภายใน Foreach Loop Container ใน Control Flow ของฉัน รหัสสำหรับงานสคริปต์:

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.

บอกฉันว่าปัญหาอาจไม่ได้อยู่ที่งานสคริปต์ของคุณ แต่เกิดจากการแมปตัวแปรใน For Each Loop Container คุณกำลังตั้งค่าตัวแปร Type ให้เป็นสตริงซึ่งอาจผิดพลาดในงานนั้นหรือไม่?

ป้อนคำอธิบายรูปภาพที่นี่

person grapefruitmoon    schedule 25.02.2011
comment
ไม่ ฉันไม่ได้ตั้งค่าประเภทในงานสคริปต์อย่างชัดเจน ฉันกำหนดค่าเช่น: Dts.Variables.Item(User::Type).Value = 1 ซึ่งฉันคิดว่าจะอนุมานได้ว่าเป็น INT แต่นั่นไม่เป็นเช่นนั้น เมื่อฉันใช้ตัวแปร User อื่น (3 รายการคือบูลีน - ดังที่เห็นในคำถามอื่นของฉัน) มันยังคงให้ข้อผิดพลาดประเภทข้อมูล Script Task ส่งออกประเภท String เสมอหรือไม่ นี่เป็นการเดินทางครั้งแรกของฉันลงไปในโพรงกระต่าย SSIS ที่ลึกกว่าแค่ Foreach Loop และไฟล์แบบแบนบางไฟล์ - person wergeld; 25.02.2011
comment
ฉันคิดว่าข้อผิดพลาดไม่ได้อยู่ในงานสคริปต์เลย สิ่งที่คุณมีอยู่ ควร ได้ผล แต่ตัวแปร Type ได้รับการแก้ไขในแท็บ Variable Mapping ของงาน For Each หรือไม่ เนื่องจากดูเหมือนว่าจะเป็นสิ่งที่ระบุข้อผิดพลาด (ดูภาพที่เพิ่มเข้าไปในคำตอบด้านบน) - person grapefruitmoon; 25.02.2011
comment
ฉันสร้างตัวแปร User::Type โดยตรวจสอบให้แน่ใจว่าได้เลือก Control Flow แล้ว (คลิกด้านนอก Foreach ของฉันในพื้นที่ว่าง) จากนั้นใช้เมนูเครื่องมือเลื่อนออกตัวแปรเพื่อป้อนชื่อและประเภทข้อมูลตลอดจนค่าเริ่มต้น . ฉันไม่ได้สร้างตัวแปร User::Type โดยใช้ Foreach Loop Editor แต่อยู่ในหน้าต่าง Variable Mappings และตั้งค่าเป็น Index = 0 (ฉันไม่สามารถแก้ไขตัวแปรได้จากที่นี่) - person wergeld; 25.02.2011
comment
คุณสามารถลบตัวแปร Type ออกจากการแมปในงาน For Each ได้หรือไม่ ฉันคิดว่าคุณไม่จำเป็นต้องแมปมันที่นั่น และคุณกำลังแมปตัวแปรสำหรับเส้นทางของไฟล์ใช่ไหม - person grapefruitmoon; 25.02.2011
comment
ฉันกำลังแมป User::fileName ใน Foreach Loop ถ้าฉันลบ User::Type ออกจาก Variable Mapping ใน Foreach Loop (ยังคงอยู่ในเมนูเลื่อนตัวแปรส่วนกลาง) ฉันได้รับข้อผิดพลาดว่าตัวแปร User::Type ไม่สามารถเข้าถึงได้ในขอบเขตของงานสคริปต์ . - person wergeld; 25.02.2011
comment
ขอบเขตของตัวแปร Type คืออะไร? ในกรณีนี้ควรเป็นชื่อของแพ็คเกจ - person grapefruitmoon; 25.02.2011
comment
ฉันเพิ่งรันแพ็คเกจอีกครั้งโดยไม่มีการเปลี่ยนแปลงนอกจากการลบตัวแปร User::Type ออกจากหน้าต่าง Foreach Loop Variable Mapping และคราวนี้มันทำงานโดยไม่มีข้อผิดพลาด...ฉันไม่ได้เปลี่ยนแปลงอะไรเลยจากการรันครั้งถัดไป ขอบเขตของตัวแปรทั้งสอง (ชื่อไฟล์และประเภท) มีไว้สำหรับแพ็คเกจทั้งหมด - person wergeld; 25.02.2011
comment
ฟังดูเหมือนคุณใช้งานได้แล้ว แต่อาจมีความเป็นไปได้ที่คุณจะมีตัวแปรสองตัวที่มีชื่อเหมือนกัน แต่มีขอบเขตต่างกัน คุณสามารถตรวจสอบได้โดยคลิกปุ่มแสดงตัวแปรทั้งหมดบนหน้าต่างตัวแปร - person grapefruitmoon; 25.02.2011
comment
ตรวจสอบว่า...แสดงเฉพาะ 2 ตัวแปร Type และ fileName ตอนนี้ทุกอย่างกำลังดี ขอบคุณสำหรับความช่วยเหลือในเรื่องนี้ - person wergeld; 25.02.2011
comment
ฉันได้รับข้อความแสดงข้อผิดพลาดที่คล้ายกัน แต่มีการแมปตัวแปรแล้ว จากนั้น ฉันดูประเภทข้อมูลของตัวแปรอย่างละเอียด ซึ่งฉันทำเครื่องหมายว่าเป็น UInt โดยไม่ได้ตั้งใจ แทนที่จะเป็น Int32 - person brentlightsey; 09.03.2013

ฉันมีสถานการณ์ที่คล้ายกัน เพียงกำหนดตัวแปรอื่นเป็นชื่อไฟล์สำหรับ 'สำหรับแต่ละลูป' คุณไม่จำเป็นต้องใช้ 'ชื่อไฟล์' ในสคริปต์ กำหนดตัวแปรแพ็คเกจอื่นของ int32 เป็น 'นับ' สำหรับใช้ในสคริปต์ของคุณ มันได้ผล!

person Kumar    schedule 21.03.2011

ปัญหาเดียวกัน ความผิดพลาดของฉันคือฉันแมปคอลัมน์มากเกินไปใน Foreach loop ตามคำแนะนำของ Grapefruitmoon ฉันยังระบุจำนวนคอลัมน์ผิดในการสืบค้น ดังนั้นฉันจึงจับคู่ชื่อคอลัมน์ผิดกับตัวแปรที่ฉันใช้เป็นชื่อไฟล์ เมื่อฉันเปลี่ยนหมายเลขคอลัมน์ในการแมปและลบตัวแปรที่ไม่จำเป็นออก แพ็คเกจใช้งานได้

person Petros    schedule 09.04.2019