【问题标题】:XML Configuration File error in SSIS PackageSSIS 包中的 XML 配置文件错误
【发布时间】:2017-06-02 02:51:43
【问题描述】:

我一直在使用 SSIS 包,但目前遇到了这个问题。我一直在使用我在包变量中编写的连接字符串进行开发,该值通过表达式进入连接管理器。像这样:@[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>

我在末尾添加了密码,正如开头的链接所建议的那样,并尝试在脚本任务中获取这样的连接字符串:

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 时,它是相同的,但没有我写的 Password 值。就像它没有从 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。

【问题讨论】:

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


【解决方案1】:

最后,经过几天的努力,我终于成功了。这是一个愚蠢的解决方案,但在一千年内我都不会想到它! this question 帮助了我,不是公认的答案,而是这部分:

您可以通过转到属性并添加 password=yourpassword 将密码存储在配置字符串中,但非常重要的是在“密码”单词之前和“;”之后放置一个空格

它起作用的事实让我大吃一惊,这很简单,但很难找到。之后,在脚本任务中我会使用

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

在脚本组件(数据流任务)中,我必须配置连接管理器选项卡(将其命名为:OLEDB_CONNECTION),然后在脚本中使用:

String cn = This.Connections.OLEDBCONNECTION.ConnectionString;

而且效果很好!

【讨论】:

  • 哇,我不知道。另一种方法是始终使用 Windows 集成身份验证。那你就不需要密码了
  • 是的,我想这样做,但特别要求我使用 SQL Server 身份验证
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多