0

テーブルにロードできなかった行をエラー ファイルにリダイレクトしたいと考えています。

ここに画像の説明を入力

赤の例外パスには 3 つの入力列が入っていることがわかります。「フラット ファイル ソース エラー出力列」には、ファイル内の元のデータが含まれています。

ここに画像の説明を入力

問題は、ファイルを開くと、すべての行の後に余分なキャリッジ リターン\ライン フィード文字があることです。追加された CRLF 文字をすべて削除することなく、エラーを手動で修正して再処理できるようにしたいと考えています。そこで、スクリプト コンポーネントを追加して、追加される文字を削りました。

public override void Input0_ProcessInputRow(Input0Buffer Row)
{

    string buffer = GetString(Row.FlatFileSourceErrorOutputColumn.GetBlobData(0, (int)(Row.FlatFileSourceErrorOutputColumn.Length)));
    System.Windows.Forms.MessageBox.Show(buffer);       
    byte[] ThisBytes = GetBytes("Test");
    Row.FlatFileSourceErrorOutputColumn.ResetBlobData();
    Row.FlatFileSourceErrorOutputColumn.AddBlobData(ThisBytes);
    }

static string GetString(byte[] bytes)
{
    char[] chars = new char[bytes.Length / sizeof(char)];
    System.Buffer.BlockCopy(bytes, 0, chars, 0, bytes.Length);
    return new string(chars);
}
static byte[] GetBytes(string str)
{
    byte[] bytes = new byte[str.Length * sizeof(char)];
    System.Buffer.BlockCopy(str.ToCharArray(), 0, bytes, 0, bytes.Length);
    return bytes;
}

しかし、私のデバッグ メッセージ ボックスには、表示できない文字がブロックとして表示されます。

ここに画像の説明を入力

ファイルに何が入るかを制御できるかどうかを確認するために、リテラルの「TEST」を出力ファイルに強制しようとすると、すべての文字の後に NULL (ASCII 0) 文字が表示されます。

ここに画像の説明を入力

スクリプトブロックコンポーネントを使用せずに出力列をファイルにリダイレクトして、書き込まれたデータを変更しようとすると、SSIS が CRLF を追加するのはなぜですか? CRLF を取り除くにはどうすればよいですか? データ列のバイト配列を読み取って文字列として表示できないのはなぜですか? 「TEST」リテラルのすべての文字の間に NULLS があるのはなぜですか? 私の ByteArray 変換関数は間違っていますか?

4

1 に答える 1

0

とった。

public override void Input0_ProcessInputRow(Input0Buffer Row)
{
    string buffer = GetString(Row.FlatFileSourceErrorOutputColumn.GetBlobData(0, (int)(Row.FlatFileSourceErrorOutputColumn.Length - 2)));
    System.Windows.Forms.MessageBox.Show(buffer);
    byte[] ThisBytes = GetBytes(buffer);
    Row.FlatFileSourceErrorOutputColumn.ResetBlobData();
    Row.FlatFileSourceErrorOutputColumn.AddBlobData(ThisBytes);
    }

static string GetString(byte[] bytes)
{
    System.Text.Encoding enc = System.Text.Encoding.ASCII;
    return enc.GetString(bytes);

}
static byte[] GetBytes(string str)
{
    System.Text.Encoding enc = System.Text.Encoding.ASCII;
    return enc.GetBytes(str);
}

SSISがCRLFを追加している理由を知りたいのですが。

于 2012-05-31T20:40:34.717 に答える