Mam zadanie skryptu, które przekazuje pewne przekazywane obiekty z jednego serwera na drugi. Jest to kodPakiet SSIS działa poprawnie w programie Visual Studio, ale kończy się niepowodzeniem, gdy jest uruchamiany ręcznie w wdrożonym polu
public void Main()
{
try
{
string schemaName = Dts.Variables["$Package::SchemaName"].Value.ToString();
string objectName = Dts.Variables["$Package::ObjectName"].Value.ToString();
//object rawETLConnection = Dts.Connections["etl"].AcquireConnection(Dts.Transaction);
//Server etlServer = (Server)rawETLConnection;
Server etlServer = new Server("ciesqldeva04");
Database etlDB;
etlDB = etlServer.Databases["sell_side_content"];
//object rawReportingConnection = Dts.Connections["reporting"].AcquireConnection(Dts.Transaction);
//Server reportingServer = (Server)rawReportingConnection;
Server reportingServer = new Server("ciesqldeva05");
Transfer xfr;
xfr = new Transfer(etlDB);
xfr.DestinationServer = reportingServer.Name;
xfr.DestinationDatabase = "sell_side_content";
xfr.DropDestinationObjectsFirst = true;
xfr.CopyAllObjects = false;
xfr.CopyData = true;
xfr.CopySchema = true;
xfr.Options.DriAll = true;
xfr.ObjectList.Add(etlDB.Tables[objectName, schemaName]);
xfr.TransferData();
}
catch (SmoException smoex)
{
Dts.Events.FireError(120, " SMO - TransferObjects.dtsx", smoex.Message, "", 0);
}
catch (Exception ex)
{
Dts.Events.FireError(120,"Non SMO - TransferObjects.dtsx",ex.Message,"",0);
}
Dts.TaskResult = (int)ScriptResults.Success;
}
To działa dobrze, gdy go uruchomić za pomocą Visual Studio 2012. Ale gdy wdrożyć go na polu i go uruchomić poprzez kliknięcie prawym przyciskiem nazwę pakietu w SSMS i uderzanie wykonać, to nie z ten komunikat "Przenieś obiekt za pomocą SMO: Błąd: Wystąpił błąd podczas przesyłania danych.Więcej szczegółów na temat wewnętrznego wyjątku."
Przekonwertowałem skrypt do aplikacji konsolowej i uruchomiłem go na pudełku, w którym poprzednio wdrożyłem pakiet, i uruchomiłem go za pośrednictwem terminala. Był on w stanie pomyślnie przesłać, więc nie wygląda na problem z brakującymi bibliotekami DLL .
Jest to kod dla tej aplikacji konsoli
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data;
using Microsoft.SqlServer.Dts.Runtime;
using Microsoft.SqlServer.Management.Smo;
using System.Collections.Specialized;
using System.Collections;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
Server etlServer = new Server("ciesqldeva04");
Database etlDB;
etlDB = etlServer.Databases["sell_side_content"];
//object rawReportingConnection = Dts.Connections["reporting"].AcquireConnection(Dts.Transaction);
//Server reportingServer = (Server)rawReportingConnection;
Server reportingServer = new Server("ciesqldeva05");
try
{
Transfer xfr;
xfr = new Transfer(etlDB);
xfr.DestinationServer = reportingServer.Name;
xfr.DestinationDatabase = "sell_side_content";
xfr.DropDestinationObjectsFirst = true;
xfr.CopyAllObjects = false;
xfr.CopyData = true;
xfr.CopySchema = true;
xfr.Options.DriAll = true;
xfr.ObjectList.Add(etlDB.Tables["award_sector", "people"]);
xfr.TransferData();
}
catch (SmoException smoex)
{
Console.WriteLine("This is an SMO Exception");
//Display the SMO exception message.
Console.WriteLine(smoex.Message);
//Display the sequence of non-SMO exceptions that caused the SMO exception.
}
}
}
}
próbowałem różnych rzeczy, ale bez powodzenia. Każda pomoc byłaby bardzo cenna.
P.S. Używam tego na SQL Server 2012.
Jeśli zmienisz wiadomość dziennika obejmują smoex.Inner, kropki dostarczać żadnego wglądu co do błędu? Kiedy uruchamiasz ten pakiet na serwerze zdalnym, w jaki sposób go wywołujesz? Czy jest to przy użyciu modelu wdrażania projektu (nowy) lub modelu wdrażania pakietu? – billinkc
Używam modelu wdrażania projektu. Wzywam go, logując się do tego serwera za pomocą SSMS, a następnie przechodząc do projektu w katalogach usług integracji-> ssisdb -> ..., a następnie klikając prawym przyciskiem myszy na pakiet i wykonując komendę execute. – bootkick
Również wykonywanie odesów nie pomaga, ponieważ wyjątek, który jest rejestrowany, nie jest tym, który wyrzucam. Otrzymuję listę błędów za pomocą tego komunikatu wybierz message_type, \t wiadomość z ssisdb.internal.operation_messages gdzie operation_id = 74404 \t sortuj według message_time asc – bootkick