Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Visual studio 2008 为什么将包中的变量指定给解决方案中另一个包的作用域?_Visual Studio 2008_Expression_Flat File_Ssis - Fatal编程技术网

Visual studio 2008 为什么将包中的变量指定给解决方案中另一个包的作用域?

Visual studio 2008 为什么将包中的变量指定给解决方案中另一个包的作用域?,visual-studio-2008,expression,flat-file,ssis,Visual Studio 2008,Expression,Flat File,Ssis,因此,我更新了SSIS包中的DB源查询。但是现在包在目的地失败了。在调试中,我得到以下输出: 文件名属性无效。文件名是设备或包含无效字符。 及 未提供目标平面文件名。确保平面文件连接管理器配置了连接字符串。如果多个组件使用平面文件连接管理器,请确保连接字符串包含足够的文件名。 根据我的研究,我认为日期变量没有正确地转换。这令人困惑,因为我没有触及表达式(FileLocation变量除外),它的计算结果正确 下面是一个表达: @[User::FileLocation] + "\\GRA

因此,我更新了SSIS包中的DB源查询。但是现在包在目的地失败了。在调试中,我得到以下输出:

文件名属性无效。文件名是设备或包含无效字符。

未提供目标平面文件名。确保平面文件连接管理器配置了连接字符串。如果多个组件使用平面文件连接管理器,请确保连接字符串包含足够的文件名。

根据我的研究,我认为日期变量没有正确地转换。这令人困惑,因为我没有触及表达式(FileLocation变量除外),它的计算结果正确

下面是一个表达:

@[User::FileLocation]  + "\\GRADE_" + Right((DT_STR,4,1252) DatePart("yyyy",getdate()),2) +
Right("0" + (DT_STR,4,1252) DatePart("m",getdate()),2) +
Right("0" + (DT_STR,4,1252) DatePart("d",getdate()),2) + "_" + 
Right("0" + (DT_STR,4,1252) DatePart("Hh",getdate()),2) + 
Right("0" + (DT_STR,4,1252) DatePart("Mi",getdate()),2) + 
Right("0" + (DT_STR,4,1252) DatePart("Ss",getdate()),2) + 
Right("0" + (DT_STR,4,1252) DatePart("Ms",getdate()),2) + ".txt"
按照建议,我将变量的
EvaluatedAsExpression
设置为
True
,但没有效果

我努力编码文件夹路径,而不是使用变量,这似乎解决了问题。但是我需要使用一个可配置的变量。 问题是什么

更新: 我注意到我使用的变量的范围在另一个包中。我怎样才能查看范围外的变量?如果我突出显示了正确的包,并尝试创建一个包级别变量,那么它的作用域会被指定为不同的包吗


您面临的问题是通过复制现有包来创建新包。这个例子说明了你的情况

我创建了一个新的SSIS 2008R2解决方案,以说明包变量范围中的情况。当您创建一个新的项目解决方案时,默认情况下,它还会创建一个名为
Package1.dtsx
的新包。我已在路径
C:\temp\SSIS.2008R2

如果导航到项目文件夹位置,将看到包文件。右键单击dtsx文件并在记事本或记事本++中打开它。我更喜欢记事本++。在文件中搜索
ObjectName
。您会注意到包的ObjectName是Package1,它与文件名相同。因此,BIDS为包和文件提供了相同的名称。但是,并非强制要求两者具有相同的名称

现在,尝试将包重命名为
InquiryFile.dtsx
。重命名包时,BIDS将抛出以下警告消息。BIDS试图告诉您正在重命名包,因此对象名可能与文件名不同步,是否要重命名它。对于这个包裹,让我们说是的。保存包

返回项目文件夹位置,在文本编辑器中再次打开dtsx文件。搜索
ObjectName
,您会注意到对象名称已更改为
InquiryFile
,因为这是我们为重命名包而指定的名称

现在,回到项目解决方案。复制包InquiryFile.dtsx并将其粘贴到SSIS包节点上以创建新包。该包将命名为
InquiryFile 1.dtsx

如果尝试在此新变量上创建包变量,则会注意到,即使已打开包文件
InquiryFile 1.dtsx
,作用域仍为
InquiryFile
。那可能会把你彻底甩了

为什么范围设置为
InquiryFile
,而不是
InquiryFile 1
?要找到它,我们必须转到项目文件夹位置。这次在文本编辑器中打开文件InquiryFile 1.dtsx。您会注意到ObjectName仍然设置为InquiryFile,因为我们通过复制现有文件InquiryFile.dtsx创建了这个包。BIDS将只重命名文件,而不重命名其中的对象名

在变量窗格中看到的范围实际上是对象名,而不是文件名

现在回到BIDS项目解决方案,让我们将文件
InquiryFile 1.dtsx
重命名为
GradeFile.dtsx
。出现以下警告提示时,请确保单击“是”

保存包并关闭它。现在,重新打开包,您会注意到变量窗格上的范围显示
GradeFile

这是因为在重命名文件时,单击“是”也会重命名对象。您可以转到“项目解决方案”文件夹,在文本编辑器中打开文件
GradeFile.dtsx
,以发现objectname已正确重命名。这是您在变量范围部分中看到的对象名称

希望您能够理解范围是如何工作的

要解决您的问题,只需尝试重命名包,当提示重命名对象名称时,请确保单击


虽然我没有找到问题的根源(我认为这与我的变量有关),但我的同事找到了解决办法:

在遵循湿婆在她的回答中给出的指示(纠正了我变量的范围,但没有解决问题)之后:

我的同事创建了两个额外的字符串变量,一个包含文件夹路径,另一个用于计算文件名。他还在包的开头创建了一个脚本任务,然后将这两个变量组合成第三个变量


然后在目标连接处,连接字符串表达式包含最终连接的变量。瞧,目标文件名被接受,包成功完成

您说过整个表达式“计算正确”,您是如何在更改
FileLocation
前后验证该表达式的实际值的?@Pondlife在表达式生成器中,我可以点击“计算表达式”,它显示:
C: