0

FOREACH ループ コンテナーを含む SSIS パッケージがあり、ループ内にスクリプト タスクがあります。スクリプト タスクのコードは次のとおりです。

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").Value は、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に渡すデータテーブルである場合に問題が発生します。

これを回避する解決策はありますか?

4

2 に答える 2

0

私は同じ問題にぶつかりました。私が受け取っていたエラーメッセージは次のとおりでした:「コマンドパラメータ[0] ''データ値は、符号の不一致またはデータオーバーフロー以外の理由で変換できませんでした。」

上記で参照した MSDN の記事では、OLE DB への参照が見当たりません。TVP は SqlClient のみのようです。

また、System.Data.OleDB.OleDbType列挙には構造化のオプションはありません。

OLEDB 接続を ADO.Net 接続に変更したところ、問題なく動作しました。

于 2014-05-01T16:04:28.503 に答える
0

あなたが見逃しているのは、パラメーターにどのTVPであるべきか、そしてそのタイプ(最後の2行)を伝えることだと思います。私のテーブル値パラメーターは 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 のこれは、セミコロンを除いたものと同じである必要があります。

于 2013-01-16T14:32:43.857 に答える