SSIS脚本任务中的OleDbCommand.ExecuteNonQuery()函数中的未指定错误

时间:2013-01-16 08:37:14

标签: vb.net ssis

我有一个SSIS包,它有一个FOREACH循环容器,在循环内我有一个脚本任务。脚本任务中的代码如下所示

Imports System
Imports System.Data
Imports System.Math
Imports Microsoft.SqlServer.Dts.Runtime
Imports System.Data.SqlClient
Imports System.Data.OleDb
Imports System.Configuration

<System.AddIn.AddIn("ScriptMain", Version:="1.0", Publisher:="", Description:="")> _
<System.CLSCompliantAttribute(False)> _
Partial Public Class ScriptMain
    Inherits Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTARTScriptObjectModelBase
Public Sub Main()
Try
            Dim oleConn As New OleDbConnection()
            Dim strConn As String = Dts.Variables("ConfiguredValue").Value.ToString()
            oleConn.ConnectionString = strConn
            Dim oleDA As New OleDbDataAdapter()
            Dim dt As New DataTable()
            oleDA.Fill(dt, Dts.Variables("Source_Data").Value)
            oleConn.Open()
            Dim oleComm As New OleDbCommand("Insert_Into_Destination")
            oleComm.CommandType = CommandType.StoredProcedure
            oleComm.Connection = oleConn
            oleComm.Parameters.AddWithValue("@tvp", dt)
            oleDA.InsertCommand = oleComm
            oleComm.ExecuteNonQuery()
            oleConn.Close()
        Catch ex As Exception
            Throw ex
        End Try
    End Sub
End Class

变量Dts.Variables的值(“ConfiguredValue”)。For Each容器的每次迭代中的值都会发生变化。它看起来像 -

"Data Source=server_name;Initial Catalog=db_name;User ID=user_id;Password = Password;Provider=SQLOLEDB.1; Persist Security Info=True;Integrated Security=SSPI;Auto Translate=False;"

问题是 - 当执行包时,ExecuteNonQuery()会抛出一个异常,显示“Unspecified Error”。

当我尝试使用类似的代码插入整数值时没有错误。当它作为输入参数传递给SP的数据表时会引起问题。

任何避免这种情况的解决方案?

2 个答案:

答案 0 :(得分:0)

我相信你所缺少的是告诉参数它应该是什么TVP和它的类型(最后2行)。我的table valued parameter在C#中,但同样的概念也适用。

    command = new System.Data.SqlClient.SqlCommand("TwitterAdd");
    command.CommandType = System.Data.CommandType.StoredProcedure;
    command.Connection = connection;

    // Assigning a table valued parameter looks much like any other parameter
    System.Data.SqlClient.SqlParameter tvp = command.Parameters.AddWithValue("@tvp", dataTable);

    // this is the only special sauce
    tvp.SqlDbType = System.Data.SqlDbType.Structured;
    tvp.TypeName = "dbo.MY_TABLE_VALUED_PARAMETER";

这在VB中应该相同,减去分号。

答案 1 :(得分:0)

我遇到了同样的问题。我收到的错误消息是: 由于符号不匹配或数据溢出以外的原因,无法转换“命令参数[0]”数据值。“

在上面引用的MSDN文章中,我看不到对OLE DB的任何引用 - TVP似乎只是SqlClient。

此外,在System.Data.OleDB.OleDbType枚举中,Structured没有选项。

我将OLEDB连接更改为ADO.Net Connection,并且工作正常。