如何使用SSIS获取web映像并插入varbinary(max)



我正在使用SSIS读取、分解和存储XML提要。这一切都有效。然而,提要中引用的图像也需要存储在DB中,所以这就是我迄今为止在一个新的SSIS包中所做的:

使用执行SQL任务获取我的图像URL的ADO记录集
在ForEach循环容器中使用该记录集,该容器包含:
 nbsp nbsp;编写任务脚本,其中:
 nbsp nbsp nbsp nbsp;我从相应的变量中读取了图像URL
 nbsp nbsp nbsp nbsp;我使用Web客户端从该URL下载图像数据
 nbsp nbsp nbsp nbsp;我将图像数据保存到对象SSIS变量中
 nbsp nbsp;在要将Object变量插入VARBINARY(MAX)字段的位置执行SQL任务

这最后一步(我已经尝试使用了几个不同的SSIS组件!)似乎让我很沮丧,我已经搜索了两天,但找不到做同样事情的人(这似乎很奇怪)。使用"执行SQL"任务,我尝试过使用以下SQL:

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

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

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

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

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

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

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

所以,最终这很简单,但我浪费了很多时间,才跳出框框,不知不觉地把自己封闭起来——这是这里最大的教训!

最新更新