SSIS设置列,包含脚本组件中的数据

时间:2015-01-11 10:27:38

标签: c# .net ssis

我有一个脚本组件,用于获取图像,使用c#代码将其缩小,然后尝试将byte []结果设置为列。此时我收到一个错误:

  

在   Microsoft.SqlServer.Dts.Pipeline.Wrapper.IDTSManagedComponentWrapper100.AddBLOBData(IDTSBuffer100   pIDTSBuffer,Int32 hRow,Int32 hCol,Byte []& ppsaData)at   Microsoft.SqlServer.Dts.Pipeline.PipelineBuffer.AddBlobData(的Int32   columnIndex,Byte [] data)at   ScriptMain.Input0_ProcessInputRow(Input0Buffer Row)in   C:\ Users \用户e032955999 \应用程序数据\本地\ TEMP \ VSTA \ 65b7c0a9d6444e7f987741e111376505 \ main.cs:线   在UserComponent.Input0_ProcessInput(Input0Buffer Buffer)中的127   C:\ Users \用户e032955999 \应用程序数据\本地\ TEMP \ VSTA \ 65b7c0a9d6444e7f987741e111376505 \ ComponentWrapper.cs:线   36在UserComponent.ProcessInput(Int32 InputID,String InputName,   PipelineBuffer Buffer,OutputNameMap OutputMap)in   C:\ Users \用户e032955999 \应用程序数据\本地\ TEMP \ VSTA \ 65b7c0a9d6444e7f987741e111376505 \ ComponentWrapper.cs:线   27点   Microsoft.SqlServer.Dts.Pipeline.ScriptComponent.ProcessInput(的Int32   InputID,PipelineBuffer buffer)at   Microsoft.SqlServer.Dts.Pipeline.ScriptComponentHost.ProcessInput(的Int32   inputID,PipelineBuffer buffer)

enter image description here

代码:

    public override void Input0_ProcessInputRow(Input0Buffer Row)
{

    //Row.BigImage = Row.Image;
    Row.FilePath = Row.Path;
    byte[] arr = MakeSmallImage(Row.Image);
    Row.SmallImage.ResetBlobData();
    Row.BigImage.AddBlobData(arr);
    Row.SmallImage.AddBlobData(arr);

}



private byte[] MakeSmallImage(Microsoft.SqlServer.Dts.Pipeline.BlobColumn blobColumn)
{
    const int iSmallImageMaxSize = 15 * 1024;
    const int iSmallImageMinSize = 10 * 1024;

    byte[] BytePicture = blobColumn.GetBlobData(0, (int)blobColumn.Length);//Get the picture bytes from the blob.
    byte[] SmallPicture = null;

    if (BytePicture.Length < iSmallImageMaxSize)
    {

        using (MemoryStream oOriginalPictureStream = new MemoryStream(BytePicture))
        {
            Image oPicture;

            int sourceX = 0;
            int sourceY = 0;

            int destX = 0;
            int destY = 0;

            oPicture = Image.FromStream(oOriginalPictureStream);
            Size OriginalPictureSize = oPicture.Size;

            int CompressedPictureBytes = BytePicture.Length;
            MemoryStream oCompressedPictureStream = new MemoryStream(iSmallImageMaxSize);
            Size CompressedPictureSize = OriginalPictureSize;

            double Ratio = ((double)OriginalPictureSize.Width) / OriginalPictureSize.Height;
            Size CompressedPictureMinSize = new Size((int)(120 * Ratio), 120);
            Size CompressedPictureMaxSize = OriginalPictureSize;

            int Count = 1;
            do
            {
                oCompressedPictureStream.Position = 0;
                switch (Count)
                {
                    case 1:
                        Count++;
                        break;
                    case 2:
                        Ratio = Math.Sqrt(((double)iSmallImageMaxSize) / CompressedPictureBytes);
                        CompressedPictureSize.Width = (int)(CompressedPictureSize.Width * Ratio);
                        CompressedPictureSize.Height = (int)(CompressedPictureSize.Height * Ratio);
                        Count++;
                        break;
                    default:
                        if (iSmallImageMaxSize > CompressedPictureBytes)
                        {
                            CompressedPictureMinSize = CompressedPictureSize;
                        }
                        else
                        {
                            CompressedPictureMaxSize = CompressedPictureSize;
                        }
                        CompressedPictureSize = (CompressedPictureMaxSize - CompressedPictureMinSize);
                        CompressedPictureSize.Width = CompressedPictureSize.Width / 2;
                        CompressedPictureSize.Height = CompressedPictureSize.Height / 2;
                        CompressedPictureSize += CompressedPictureMinSize;
                        break;
                }

                Bitmap CompressedPicture = new Bitmap(CompressedPictureSize.Width, CompressedPictureSize.Height,
                                                      PixelFormat.Format24bppRgb);
                CompressedPicture.SetResolution(Math.Min(oPicture.HorizontalResolution, 72),
                                                Math.Min(oPicture.VerticalResolution, 72));

                Graphics grPhoto = Graphics.FromImage(CompressedPicture);
                grPhoto.InterpolationMode = InterpolationMode.HighQualityBicubic;

                grPhoto.DrawImage(oPicture,
                                  new Rectangle(destX, destY, CompressedPictureSize.Width,
                                                CompressedPictureSize.Height),
                                  new Rectangle(sourceX, sourceY, OriginalPictureSize.Width,
                                                OriginalPictureSize.Height),
                                  GraphicsUnit.Pixel);

                grPhoto.Dispose();
                CompressedPicture.Save(oCompressedPictureStream, System.Drawing.Imaging.ImageFormat.Jpeg);

                CompressedPicture.Dispose();
                CompressedPictureBytes = (int)oCompressedPictureStream.Position;
                oCompressedPictureStream.SetLength(CompressedPictureBytes);
            } while (((CompressedPictureMaxSize - CompressedPictureMinSize).Width > 50) &&
                     ((CompressedPictureBytes > iSmallImageMaxSize) ||
                      (CompressedPictureBytes < iSmallImageMinSize)));
            oPicture.Dispose();
            //SmallPicture = new byte[oCompressedPictureStream.Length];
            SmallPicture = oCompressedPictureStream.ToArray();
            oCompressedPictureStream.Dispose();
        }

        //oDAL.UploadFileToDatabase(SmallPicture, BytePicture, lTmunaID);

    }

    return SmallPicture;
}

1 个答案:

答案 0 :(得分:1)

也许是因为null?当BytePicture.Length < iSmallImageMaxSize条件为假时,MakeSmallImage方法将返回null BlobColumn类具有SetNull方法,因此您应该使用它来清空blob。