วิธีวนซ้ำวัตถุทั่วไปใน SSIS Script Task

ฉันมีออบเจ็กต์ทั่วไปที่ส่งผ่านไปยังงานสคริปต์จากกระบวนการ SQL โดยพื้นฐานแล้ววัตถุจะเป็นตารางข้อมูล แต่เพื่อให้ได้ชุดผลลัพธ์ทั้งหมดจากกระบวนการ sql ฉันต้องจัดเก็บไว้ในวัตถุทั่วไป

ดังนั้นถ้าฉันมี:

Object A = Dts.Variables[0];

แล้วฉันจะแยกและจัดการค่าของมันได้อย่างไร

โดยพื้นฐานแล้วสิ่งที่ฉันต้องการทำคือ:

Object A = Dts.Variables[0];
strin x = A.Column[0].value.tostring();

แต่เห็นได้ชัดว่ามันใช้งานไม่ได้


person some_bloody_fool    schedule 11.11.2011    source แหล่งที่มา


คำตอบ (5)


ไม่มีอะไรผิดปกติกับการแยกวิเคราะห์ตารางข้อมูลจากออบเจ็กต์ ฉันเคยเห็น Andy Leonard ทำสิ่งนี้บนกรอบงาน ETL ของเขา

คุณมาถูกทางแล้ว แต่คุณไม่ได้เห็นภาพทั้งหมด รหัสนี้กำหนดวัตถุประเภท ตัวแปร (โดยประมาณ) ถึง A. คุณกำลังพยายามเข้าถึงคุณสมบัติที่ไม่มีอยู่

Object A = Dts.Variables[0];

คุณต้องคว้า value ของตัวแปร คุณสามารถทำมันเป็นการมอบหมายให้กับ A

Object A = Dts.Variables[0].Value;

หรือหากคุณต้องการทำอย่างอื่นกับตัวแปรจริง คุณจะต้องเก็บการกำหนดโค้ดปัจจุบันของคุณเป็น A จากนั้นจึงเข้าถึงคุณสมบัติ Value

Object A = Dts.Variables[0];
DataTable B = (DataTable) A.Value;
DataRow C = B.Row[0];
string x = C.Column[0].ToString();

โค้ดด้านบนสำหรับ datatable/datarow นั้นเป็นค่าโดยประมาณ สิ่งสำคัญที่ต้องดำเนินการคือการเข้าถึงสารพัดที่ตัวแปร SSIS ถือครองอยู่ คุณจะต้องเข้าถึงค่าของอ็อบเจ็กต์

person billinkc    schedule 11.11.2011
comment
Downvoter สนใจที่จะช่วยให้ฉันเข้าใจว่าควรทำอย่างไรเพื่อปรับปรุงคำตอบนี้ - person billinkc; 20.08.2013

ฉันไม่สามารถรับคำตอบข้างต้นใช้งานได้ ดังนั้นรายการด้านล่างนี้คือโค้ดที่ฉันใช้ในการโหลด DataTable "User::transactionalRepDBs" เป็นตัวแปร SSIS ของ Object (System.Object) ที่ถูกโหลดผ่าน "ชุดผลลัพธ์แบบเต็ม" จากสคริปต์งาน SQL ที่เรียกใช้งาน งานสคริปต์ที่ใช้คือ C# ลิงก์นี้ช่วยเหลือฉัน

using System.Data.OleDb;

DataTable dt= new DataTable();
OleDbDataAdapter adapter = new OleDbDataAdapter();
adapter.Fill(dt, Dts.Variables["User::transactionalRepDBs"].Value);
String _showMe;

foreach (DataRow row in dt.Rows)
{
   //insert what you want to do here
           for (int i = 0, _showMe = ""; i < row.ItemArray.Length; i++ )
           {
               _showMe += row.ItemArray[i].ToString() + " | ";
           }

           MessageBox.Show("Data row #" + dt.Rows.IndexOf(row).ToString() + " value: " + _showMe);
}
person Tequila    schedule 31.12.2012

คำแนะนำ #1: เข้าถึงตัวแปรตามชื่อ ไม่ใช่ดัชนีตัวเลข

คำแนะนำ #2: ส่งผลลัพธ์ของคุณสมบัติ Value ไปเป็นประเภทของออบเจ็กต์ที่คุณคาดหวัง

ดังนั้น:

string myString = (string)Dts.Variables["MyString"].Value;
DataTable myTable = (DataTable)Dts.Variables["MyTable"].Value;
DataTable myOtherTable = Dts.Variables["MyOtherTable"].Value as DataTable;
person Edmund Schweppe    schedule 11.11.2011
comment
ไม่; นั่นคือตัวดำเนินการ C# as มันเหมือนกับการดำเนินการร่าย แต่จะคืนค่า null หากไม่สามารถทำการร่ายได้ ดู msdn.microsoft.com/en-us/library/cscsdfbt.aspx เพื่อดูรายละเอียด - person Edmund Schweppe; 11.11.2011
comment
ความเมตตา นั่นมีประโยชน์ มันช่วยลดความซับซ้อนของตรรกะบางอย่างที่ฉันมีในไลบรารีการเข้าถึงข้อมูลได้ง่ายขึ้นอย่างแน่นอน - person billinkc; 11.11.2011

ผู้ชายที่ยอดเยี่ยม

มันทำงานได้อย่างสมบูรณ์ดี ..

DataTable dt= new DataTable();
OleDbDataAdapter adapter = new OleDbDataAdapter();
adapter.Fill(dt, Dts.Variables["User::transactionalRepDBs"].Value);
person Aswartha    schedule 15.03.2013

person    schedule
comment
แม้ว่าข้อมูลโค้ดนี้อาจช่วยแก้ปัญหาได้ แต่ การรวมคำอธิบาย จะช่วยปรับปรุงได้จริงๆ คุณภาพของโพสต์ของคุณ โปรดจำไว้ว่าคุณกำลังตอบคำถามให้กับผู้อ่านในอนาคต และคนเหล่านั้นอาจไม่ทราบสาเหตุของการแนะนำโค้ดของคุณ - person DimaSan; 14.03.2017