如何使用SSIS

时间:2016-03-23 14:34:52

标签: sql-server image variables object ssis

我正在使用SSIS来读取,分割和存储XML提要。这一切都有效。但是,feed中引用的图像也需要存储在DB中,所以这是我到目前为止在新的SSIS包中所做的:

使用执行SQL任务获取图像URL的ADO记录集
在ForEach循环容器中使用该记录集,其中包含:
脚本任务在哪里:
我从相应的变量中读取了图片网址 我使用Webclient从该URL下载图像数据 我将图像数据保存到Object SSIS变量中     执行SQL任务,我想将我的Object变量插入VARBINARY(MAX)字段

这是最后一步(我尝试使用一些不同的SSIS组件!)似乎在打败我,我已经搜索了两天,却找不到有人做同样的事情(这看起来很奇怪)。使用执行SQL任务我尝试使用此SQL:

insert into [ATOMimagedata]  select @[User::entryid] , @[User::mcid], @[User::NCImgURL], null, @[User::NCImgData] 

但它不接受SQL,我也尝试将所有变量映射到参数并使用:

insert into [ATOMimagedata]  values( ?, ?, ?, null, ? ) 

但我找不到用于图像数据变量参数的适当数据类型。

所以,总而言之,我有一个循环,我在每次迭代时都拥有所有的SSIS变量,包括我的图像数据。 如何将它们插入到我的表中?我可以显示更多代码,例如我加载图像变量的VB,但我认为除了提供背景之外,它对最后的障碍没有多大帮助。

1 个答案:

答案 0 :(得分:0)

好吧,所以,在睡觉之后,我得出结论,图像/对象的数据输入等(将图像数据传递给另一个任务)太乱了,找不到解决方案,也许没有解决方案(目前还没有人提出解决方案)。

Sooo,灯泡继续,doh,为什么不直接从VB脚本将数据写入数据库?

所以这是我的代码,以防其他人有同样的挫折,实际上,一旦你采取正确的方法,很容易解决:

    Public Sub Main()

    Dim sqlConn As System.Data.SqlClient.SqlConnection
    Dim sqlComm As System.Data.SqlClient.SqlCommand
    Dim sins As String
    Dim tmpURL As String
    Dim tmpImg As Object
    Dim eid As Long
    Dim mid As Long

    tmpURL = CStr(Me.Dts.Variables("NCImgURL").Value)
    Using WC As New System.Net.WebClient()
        WC.Encoding = System.Text.Encoding.UTF8
        tmpImg = WC.DownloadData(tmpURL)
        'Me.Dts.Variables("NCImgData").Value = tmpImg
        eid = CLng(Me.Dts.Variables("entryid").Value)
        mid = CLng(Me.Dts.Variables("mcid").Value)
        'now try to write the image
        sins = "insert into [ATOMimagedata]([entry_Id],[mediacontent_Id],[orgurl],[newurl],[img])"
        sins = sins + " values(" + CStr(eid) + "," + CStr(mid) + ",'" + tmpURL + "',null, @IMG)"

        sqlConn = DirectCast(Dts.Connections("LocalADO").AcquireConnection(Dts.Transaction), SqlClient.SqlConnection)
        sqlComm = New System.Data.SqlClient.SqlCommand(sins, sqlConn)
        sqlComm.Parameters.Add("@IMG", SqlDbType.Image)
        sqlComm.Parameters("@IMG").Value = tmpImg

        sqlComm.ExecuteNonQuery()
    End Using

    Dts.TaskResult = ScriptResults.Success

End Sub

所以,最后它很简单,但是我浪费了很多时间才想到我不知不觉地把自己封闭在盒子外面 - 这是最重要的教训!