2015-01-11 67 views
0

我有一個腳本組件,它可以拍攝一張圖像,用c#代碼縮小它,然後嘗試將byte []結果設置到該列。在這一點上,我得到一個錯誤:具有腳本組件中數據的SSIS設置列

at 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\AppData\Local\Temp\vsta\65b7c0a9d6444e7f987741e111376505\main.cs:line 127 at UserComponent.Input0_ProcessInput(Input0Buffer Buffer) in c:\Users\e032955999\AppData\Local\Temp\vsta\65b7c0a9d6444e7f987741e111376505\ComponentWrapper.cs:line 36 at UserComponent.ProcessInput(Int32 InputID, String InputName, PipelineBuffer Buffer, OutputNameMap OutputMap) in c:\Users\e032955999\AppData\Local\Temp\vsta\65b7c0a9d6444e7f987741e111376505\ComponentWrapper.cs:line 27 at 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; 
} 
+0

在'MakeSmallImage'中,如果用try/catch塊封裝if語句,錯誤會消失嗎? – billinkc

+0

我把它包起來了。錯誤沒有消失。 –

回答

1

也許是由於null?當BytePicture.Length < iSmallImageMaxSize條件爲假時MakeSmallImage方法將返回null
BlobColumn類有SetNull方法,所以你應該使用它來取消blob。

+0

就是這樣。完善! –