SSIS包中的XML配置文件错误

时间:2017-01-17 21:30:35

标签: c# sql-server sql-server-2008 ssis

我一直在使用SSIS软件包,而且我目前陷入了这个问题。我一直在使用我在Package Variable中编写的连接String进行开发,该值通过Expression传递给Connection Mannager。这样的事情: @ [User :: Connection]

它非常适合调试。因为我需要在脚本任务和脚本组件中调用一些存储过程,所以我只是将Package变量称为与数据库的字符串连接。由于我是ETL世界的新手(不到一个月),而且我一直在做一些软件包(实际上是6个),最近我才读到我应该将我的ConnectionString保存在xml文件和存储中用户,密码之类的东西(因为生产服务器可能会有不同的用户帐户,如上所述herehere

现在,我已经尝试过它所说的,但它并不适合我。所以我创建了一个新的SSIS包来进行测试,它包含一个脚本任务,它调用一个简单的存储过程。程序包Configuration仅包含Connection Manager中的ConnectionString属性,它看起来像这样:

<?xml version="1.0" ?> 
- <DTSConfiguration>
- <DTSConfigurationHeading>
  <DTSConfigurationFileInfo GeneratedBy="JohnSmith" GeneratedFromPackageName="Package" GeneratedFromPackageID="{2C421533-C76C-4583-841C-367C50DB61C1}" GeneratedDate="17/01/2017 --:--:-- p.m." /> 
  </DTSConfigurationHeading>
- <Configuration ConfiguredType="Property" Path="\Package.Connections[OLEDB_CONNECTION].Properties[ConnectionString]" ValueType="String">
  <ConfiguredValue>Data Source=ServerName;User ID=UserName;Initial Catalog=DatabaseName;Provider=SQLNCLI10.1;Auto Translate=False;Application Name=SSIS-Package-{C24F1A69-A9A3-40D4-8A1E-7EA61E0EB57D}ServerName.DatabaseName.UserName;Use Encryption for Data=False;Password=abc123;</ConfiguredValue> 
  </Configuration>
  </DTSConfiguration>

我在最后添加了密码,就像开头建议的链接一样,并尝试在脚本任务中获取这样的connetionString:

String cn = Dts.Connections["OLEDB_CONNECTION"].ConnectionString;

然后在存储过程中调用它,如下所示:

 using (OleDbConnection con = new OleDbConnection(cn))
 {
     using (OleDbCommand cmd = new OleDbCommand("dbo.usp_sgn_conseguirNumDoc", con))
     {
         cmd.CommandType = CommandType.StoredProcedure;
         cmd.Parameters.Add("@var_CODDOC", OleDbType.VarChar, 3).Value = "001"; 
         cmd.Parameters.Add("@var_NUMDOC", OleDbType.BigInt).Direction = ParameterDirection.Output;
         con.Open();
         cmd.ExecuteNonQuery();
         result = Int64.Parse(cmd.Parameters["@var_NUMDOC"].Value.ToString());
     }
  }

但它在 con.Open()中失败,所以当我检查ConnectionString时,它是相同的但没有我写的密码值。就像它从xml配置文件中读取它一样。当我在错误列表窗口中检查消息选项卡时,我看到了:

<DTS:ConnectionManager>
<DTS:Property DTS:Name="DelayValidation">0</DTS:Property>
<DTS:Property DTS:Name="ObjectName">OLEDB_CONNECTION</DTS:Property>
<DTS:Property DTS:Name="DTSID">{C24F1A69-A9A3-40D4-8A1E-7EA61E0EB57D}</DTS:Property>
<DTS:Property DTS:Name="Description"></DTS:Property>
<DTS:Property DTS:Name="CreationName">OLEDB</DTS:Property><DTS:ObjectData><DTS:ConnectionManager>
<DTS:Property DTS:Name="Retain">0</DTS:Property><DTS:Password DTS:Name="Password" Sensitive="1"></DTS:Password>
<DTS:Property DTS:Name="ConnectionString">Data Source=ServerName;User ID=UserName;Initial Catalog=DatabaseName;Provider=SQLNCLI10.1;Auto Translate=False;Application Name=SSIS-Package-{C24F1A69-A9A3-40D4-8A1E-7EA61E0EB57D}ServerName.DatabaseName.UserName;Use Encryption for Data=False;</DTS:Property></DTS:ConnectionManager></DTS:ObjectData></DTS:ConnectionManager>

我对如何做的想法,任何帮助将不胜感激

我正在使用Visual Studio 2008和SQL Server 2008。

1 个答案:

答案 0 :(得分:0)

最后,经过几天把我的头撞到桌子后,设法做到了。这是一个愚蠢的解决方案,但它在一千年内不会超越我的想法! this question帮助了我,而不是接受的答案,但这一部分就在这里:

  

您可以通过转到属性并添加password = yourpassword将密码存储在配置字符串中,但非常重要的是在密码&#39;之前加上空格。在&#39;;&#39;

之后

它起作用的事实引起了我的注意,这是一件非常简单而又难以找到的事情。之后,在脚本任务中我会使用

String cn = Dts.Connections["OLEDB_CONNECTION"].ConnectionString;

并在脚本组件(数据流任务)中我必须配置连接管理器选项卡(给它相同的名称:OLEDB_CONNECTION),然后在脚本中,我会使用:

String cn = This.Connections.OLEDBCONNECTION.ConnectionString;

它运作得很好!