【问题标题】:How to fetch a web image and insert into varbinary(max) using SSIS如何使用 SSIS 获取 Web 图像并插入 varbinary(max)
【发布时间】:2016-03-23 14:34:52
【问题描述】:

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

使用执行 SQL 任务来获取我的图像 URL 的 ADO 记录集
在 ForEach 循环容器中使用该记录集,其中包含:
脚本任务在哪里:
我从适当的变量中读取了图像 URL
我使用 Webclient 从该 URL 下载图像数据
我将图像数据保存到对象 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,但我认为除了提供背景之外,它对最后的障碍没有多大帮助。

【问题讨论】:

标签: sql-server image variables object ssis


【解决方案1】:

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

Sooo,灯泡亮了,呵呵,为什么不直接从 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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-20
    • 1970-01-01
    相关资源
    最近更新 更多