Korzystając z kontrolki Script Task natknąłem się na problem z korzystania z danych w zmiennej typu Object.
VB:
Dim oleDA As New OleDbDataAdapter
Dim dt As New System.Data.DataTable
...
oleDA.Fill(dt, Dts.Variables("ObjectivesList").Value)
Dts.Variables("ObjectivesList").Value = dt
C#
using System.Data.OleDb;
using System.Data.DataTable;
...
OleDbDataAdapter oleDA = new OleDbDataAdapter();
DataTable dt = new DataTable();
oleDA.Fill(dt, Dts.Variables["ObjectivesList"].Value);
Dts.Variables["ObjectivesList"].Value = dt;
Po przekazaniu wypełnieniu zmiennej przez przekazanie danych z DataTable, korzystanie ze zmiennej nie było możliwe bez użycia For Each Conteiner, ze wskazaniem kolekcji ADO, co nie zawsze jest optymalne.
Problem wynika z tego, że zastosowanie przypisanie Dts.Variables("ObjectivesList").Value = dt powoduje, iż zmienna zmienia się z typu ADODB na System.Data.DataTable.
Rozwiązaniem jest zmiana typu zmiennej na ADODB:
VB
Dim oleDA As New OleDbDataAdapter
Dim dt As New System.Data.DataTable
If Not (Dts.Variables("ObjectivesList").Value.GetType.IsAssignableFrom(dt.GetType)) Then
oleDA.Fill(dt, Dts.Variables("ObjectivesList").Value)
Dts.Variables("ObjectivesList").Value = dt
Else
dt = CType(Dts.Variables("ObjectivesList").Value, System.Data.DataTable)
End If
C#
using System.Data.OleDb;
using System.Data.DataTable;
...
OleDbDataAdapter oleDA = new OleDbDataAdapter();
DataTable dt = new DataTable();
oleDA.Fill(dt, Dts.Variables["ObjectivesList"].Value);
dt = (DataTable)(Dts.Variables["ObjectivesList"].Value);
Opis oczywiście nie jest fachowy, bo nie jestem informatykiem tylko praktykiem.
Poniżej wyszperane źródło:
http://social.msdn.microsoft.com/Forums/en-US/sqlintegrationservices/thread/7b7e6c2f-ca84-4d56-9751-97c8c2becaed
Brak komentarzy:
Prześlij komentarz