Thành phần tập lệnh SSIS - Cách sửa đổi Output0Buffer


10

Tôi có một thành phần tập lệnh chấp nhận các bản ghi từ bảng cơ sở dữ liệu SQL Azure. Kịch bản sau đó gọi một dịch vụ web, trả về số lượng hồ sơ thất bại và thành công.

Đối với tất cả các bản ghi, tôi muốn thêm trường Trạng thái có "thành công" hoặc "thất bại" và điều này nhận được đầu ra từ thành phần tập lệnh.

Tôi sau đó đăng nhập những đầu ra vào một tập tin văn bản.

Vấn đề: Tôi không thể thêm trạng thái cho mỗi bản ghi đầu vào do cuộc gọi dịch vụ web chỉ xảy ra khi thực hiện bài.

Tôi đã thử điều này nhưng vẫn không hoạt động:

public override void Input0_ProcessInputRow(Input0Buffer Row)
{
         listOfData.Add(new ClockData 
         {
             TimeClockID=Row.TimeClockID,
             PersonID=Row.EmployeeCode,
             LocationCode=Row.ClockInServiceContextID,
             ClockInDateTime=Row.ClockInDateTime,
             ClockOutDateTime=Row.ClockOutDateTime

         });
 }

 public override void CreateNewOutputRows()
 {
     MessageBox.Show("Test CreateNewOutputRows");
     MessageBox.Show(listOfData.Count.ToString());
     foreach (var item in listOfData)
     {
         Output0Buffer.AddRow();
         Output0Buffer.EmployeeCode = item.PersonID;
         MessageBox.Show(item.PersonID);
     }
 }

1
Tại sao bạn không thể thực hiện cuộc gọi dịch vụ web trong quá trình xử lý? Tất cả các dữ liệu đã đi xuống đường ống một khi nó ra khỏi phương pháp đó. Bạn đang tích lũy dữ liệu trong biến cục bộ của mình nhưng tại thời điểm này, nó giống như giữ một hình ảnh của một chiếc xe vừa lái đi - vâng, nó trông giống như vậy nhưng nó sẽ không quay trở lại
billinkc

@flybyte: có gì hữu ích trong câu trả lời của tôi không?
Mary

Câu trả lời:


6

Mọi thứ trong Chuyển đổi được thực hiện trong Input0_ProcessInputRow Giải pháp về cơ bản sẽ là

public override void Input0_ProcessInputRow(Input0Buffer Row)
{
         listOfData.Add(new ClockData 
         {
             TimeClockID=Row.TimeClockID,
             PersonID=Row.EmployeeCode,
             LocationCode=Row.ClockInServiceContextID,
             ClockInDateTime=Row.ClockInDateTime,
             ClockOutDateTime=Row.ClockOutDateTime
         });
         Output0Buffer.AddRow();
         Output0Buffer.EmployeeCode = item.PersonID;
         MessageBox.Show(item.PersonID);
}

Bạn có thể thực hiện các bước đầu ra trong PostExecute, CreateNewOutputRows không được chạy trong Chuyển đổi, chỉ trong các tập lệnh Đích.


3

Tôi không thành thạo SSIS, nhưng tôi nghĩ rằng bạn có thể thử các ý tưởng sau:

  • đi đến thành phần script và chỉnh sửa nó,
  • đi đến phần Đầu vào và Đầu ra (phần 3),
  • đi tới Output0 - Cột đầu ra,
  • thêm một cột mới (đặt tên và loại, hãy nói Status - boolean).

Sau đó, bạn sẽ có cột trống cho đầu ra của mình và bạn sẽ cần điền vào đó một số dữ liệu cho từng hàng đầu vào:

Public Overrides Sub Input0_ProcessInputRow(ByVal Row As Input0Buffer)
    Row.Status = IIf(String.IsNullOrEmpty(rowValues.GetValue(1).ToString()), 0, 1)

Điều này sẽ giúp bạn thêm một cột Trạng thái vào bảng đầu ra của bạn. Hy vọng đây là những gì bạn muốn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.