2013-10-02 3 views
1

SSIS 패키지의 코드에서 변수를 설정하려고합니다. C#에서 시작합니다.C#에서 SSIS 변수 값을 변경하는 방법

Package pkg = app.LoadPackage(ConfigurationManager.AppSettings["SsisPkg"].ToString(), null); 
pkg.Variables["User::FolderPath"].Value = Path.GetDirectoryName(e.FullPath); 
pkg.Variables["User::FileName"].Value = Path.GetFileNameWithoutExtension(e.FullPath); 

디버깅하는 동안 값을 직접 설정 한 후에 검사하지만 아무 것도 변경되지 않았습니다. 값에 들여다 볼 수 있습니다 (가리키고 탐색하고 값을 편집). 은 편집 할 수 없으므로으로 보입니다.

내가 여기서 잘못하고있는 아이디어가 있습니까?

업데이트 : billinkc 덕분에 다른 조건이 충족 될 때까지 내가해야 할 일이 편안 할 것입니다. 코드에서 직접 할당이 실패했음을 알았습니다 (오류가 발생하지 않고 "수행하지 않음"). 조사 식 창에서 값을 편집 할 수 없습니다. I 값을 검사 할 때 값을 수정할 수 있습니다.

실제 문제는 읽기 전용으로 설정되어 있다는 것입니다. 찾을 수

답 : 값을 설정하기 전에 변수를 쓸 수 있도록 필요한 :

 pkg.Variables["User::FileName"].EvaluateAsExpression = false; 
+0

디버깅하는 동안, 내부'Path.GetDirectoryName (e.FullPath)'와'경로 무엇. GetFileNameWithoutExtension (e.FullPath)'입니다. 그것들은 실제 가치입니까? –

+0

e는 실제로 새로 만든 파일에 대한 정보가있는 FileSystemEventArgs 매개 변수입니다. –

답변

1

는 당신이 바로 그 일을하고 있습니다. 기본 SSIS 패키지를 만들었습니다. 하나의 변수, FolderPath, 유형 문자열이 있습니다. 정보 이벤트와 그 내용이 내가 다음이

public class InformationListener : DefaultEvents 
{ 
    public override void OnInformation(DtsObject source, int informationCode, string subComponent, string description, string helpFile, int helpContext, string idofInterfaceWithError, ref bool fireAgain) 
    { 
     //base.OnInformation(source, informationCode, subComponent, description, helpFile, helpContext, idofInterfaceWithError, ref fireAgain); 
     Console.WriteLine(string.Format("{0} {1}", subComponent, description)); 
    } 

} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     string sourcePackage = string.Empty; 
     string path = string.Empty; 
     string variableName = string.Empty; 
     string designValue = string.Empty; 
     string newValue = string.Empty; 
     InformationListener listener = null; 

     sourcePackage = @"J:\Src\SO\SSIS\Package.dtsx"; 
     path = @"J:\runtime"; 
     variableName = "User::FolderPath"; 
     listener = new InformationListener(); 

     Application app = new Application(); 
     Package pkg = null; 
     Variable ssisVariable = null; 
     pkg = app.LoadPackage(sourcePackage, null); 

     ssisVariable = pkg.Variables[variableName]; 
     designValue = ssisVariable.Value.ToString(); 

     Console.WriteLine(string.Format("Designtime value = {0}", designValue)); 

     ssisVariable.Value = path; 

     newValue = ssisVariable.Value.ToString(); 
     Console.WriteLine(string.Format("new value = {0}", newValue)); 

     DTSExecResult results = DTSExecResult.Canceled; 

     results = pkg.Execute(null, null, listener, null, null); 

     Console.WriteLine("Press any key to continue"); 
     Console.ReadKey(); 

    } 
} 

으로 같은 기본적인 C의 # 콘솔 응용 프로그램을 만들어

enter image description here

FolderPath 변수의 값을 노출 발사 하나의 스크립트 작업이 있습니다 당신은

enter image description here

과에서 변수 검사에서 말할 수있는 내 인쇄 문

내가 위에서 내 문자열을 탈출하는 것을 잊었다하지만 우리가 J:\runtime을 보여줍니다 척 할 수 있기 때문에 C:\designTime의 디자인 타임 값이 J:로 이동

enter image description here

.

이 모든 내용은 SaveToXml 메서드를 호출하여 패키지를 serialize하지 않으면 개체가 범위를 벗어나면 User :: FolderPath 값이 디자인 시간 값으로 다시 설정됩니다. 영구적으로 대답에

app.SaveToXml(sourcePackage, pkg, null); 

OP 편집이 토론과 예제처럼 보일 것이다 저를 주도 업데이트 : http://social.msdn.microsoft.com/Forums/sqlserver/en-US/dad8e218-1fe0-49db-89da-5715fb6d4b21/sql-2008-r2-ssis-c-script-task-not-setting-variable

+0

접근 방식을 확인해 주셔서 감사합니다. 이제 변수가 세미 읽기 전용 인 이유가 나에게 남아 있습니다.내 코드 값 할당은 조사 식 창을 통해 편집하려는 시도만큼 실패하지만 변수를 검사하는 동안 드릴링하면 편집 할 수 있습니다. –

+2

위와 같은 간단한 간단한 예제를 만들면 여전히 동일한 결과가 나타 납니까? 변수에 할당 된 표현식이나 할당이 통과하지 못하게하는 구성이있을 수 있습니까? – billinkc

+0

다시 한번 감사드립니다. 토론을 통해 내가 추가 한 답을 찾을 수있었습니다. 벽에서 내 머리를 때리는 데 몇 시간이 걸렸는지 모르겠다. –

관련 문제