我已经阅读了很多对此问题的先前版本的回复,但似乎都没有.
每次我在Visual Studio 2015(v14.0.25431.01 update 3)中打开我的脚本组件时,它都会告诉我我缺少对Newtonsoft.Json的引用.所以我进入NuGet包管理器,它要求我恢复我做的,并说它成功完成.
然后我保存并尝试运行我的SSIS包并得到以下错误.
无法加载文件或程序集"Newtonsoft.Json,Version = 11.0.0.0,Culture = neutral,PublicKeyToken = 30ad4fe6b2a6aeed"或其中一个依赖项.该系统找不到指定的文件.
我的packages.config文件看起来像这样.
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="Newtonsoft.Json" version="11.0.1" targetFramework="net45" />
</packages>
Run Code Online (Sandbox Code Playgroud)
我的app.config文件看起来像这样.
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="Newtonsoft.Json"
publicKeyToken="30AD4FE6B2A6AEED" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-11.0.0.0" newVersion="11.0.0.0"/>
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>
Run Code Online (Sandbox Code Playgroud)
我可以导航到它正在查找的文件夹并查看.dll文件
C:\ Users \用户lp1.db \应用程序数据\本地的\ Temp\VSTA\SSIS_SC130\VstaGbmf__V5kCUWonnRT2qrG_g \包\ Newtonsoft.Json.11.0.1\LIB \net45\Newtonsoft.Json.dll
有没有其他人有这个持续的问题,它失去了找到文件的能力,尽管被设置.
我将一列Json数据传递给脚本组件进行处理.它一直很好,直到我有一个包含超过600,000长度的Json数据,然后发生跟随错误.

我确实将MaxBuffer大小更改为10MB,我的数据只有600K左右,但它仍然不起作用,请咨询.
我创建了SSIS包,并使用Integration Services部署向导将其部署到服务器.我通过SQL Server 2012手动转到Integration Services Catalog访问,右键单击并执行我的包.
但是,程序包保持失败,当我检查执行报告的消息时,我收到以下错误.
他们似乎在我有脚本组件的数据任务上失败了.
分配:错误:CS2001 - 无法找到源文件'C:\ Windows\TEMP.NETFramework,Version = v4.0.AssemblyAttributes.cs',CSC,0,0
分配:错误:无法编译包中包含的脚本.在SSIS设计器中打开包并解决编译错误.
我正在构建一个ssis包,我希望在Script Component中使用现有的OleDbConnection.这是我的代码:
public override void AcquireConnections(object Transaction)
{
base.AcquireConnections(Transaction);
cm = this.Connections.Connection;
con = (OleDbConnection)cm.AcquireConnection(Transaction);
MessageBox.Show(con.ToString());
}
Run Code Online (Sandbox Code Playgroud)
当我关闭BIDS时,我收到以下消息:"System.InvalidCastException:无法将类型为'System .__ ComObject'的COM对象强制转换为类类型'System.Data.OleDb.OleDbConnection'.表示COM组件的类型的实例不能是转换为不代表COM组件的类型;但只要底层COM组件支持对接口的IID的QueryInterface调用,它们就可以转换为接口.
使用Ado.Net连接时,相同的代码可以正常工作.我可以在这里使用OleDbConnection,或者Script Component仅支持Ado.Net吗?
提前致谢.
我创建了一个SSIS包(在VS 2013中),其中包含一个包含多个脚本组件的数据流任务。我需要添加另一个与现有数据流任务类似的数据流任务,因此我将其复制并粘贴到包中,并添加了优先级约束,以便新任务在旧任务之后运行。我根据业务需求更改了新数据流任务中脚本组件中的代码,并运行了该程序包。我很快意识到,当新数据流任务运行时,旧数据流中的脚本组件正在执行。奇怪的。
经过一些互联网搜索,我找到了以下页面:
http://kohera.be/blog/sql-server/the-dangers-of-copying-script-components-in-ssis/
其中描述了数据流任务的复制如何不更改新数据流中任何脚本组件中的程序集名称或根名称空间。显然,在运行时,新脚本的汇编将被旧脚本的汇编覆盖。网页上说可以通过将脚本组件复制到另一个程序包,然后再将其复制回原始程序包来解决此问题。大概会更改每个脚本组件的程序集名称。我很高兴它对他有用,但对我没有用。
我还尝试在此处的脚本编辑器中更改程序集名称:
但这也不起作用。旧脚本组件中的代码仍在新数据流中运行。我猜想根目录名称空间需要更改,但是它是灰色的,所以我不能手动更改它。因此,我仍在寻找一种不涉及从头开始重新创建脚本组件的解决方案,因为它们包含多个输出,每个输出中都有许多列。希望你能有一个答案。
我现在一直在寻找解决方案,我似乎仍然无法找到解决方案.我在脚本组件中获取连接时遇到问题.在将其插入之前,我需要查询我的数据库以检索要使用的Id
public override void AcquireConnections(object Transaction)
{
connMgr = base.Connections.Connection;
conn = (SqlConnection)connMgr.AcquireConnection(null);
}
Run Code Online (Sandbox Code Playgroud)
我在这里得到一个例外.
System.InvalidCastException: Unable to cast COM object of type 'System.__ComObject' to class type 'System.Data.SqlClient.SqlConnection'. Instances of types that represent COM components cannot be cast to types that do not represent COM components; however they can be cast to interfaces as long as the underlying COM component supports QueryInterface calls for the IID of the interface.
Run Code Online (Sandbox Code Playgroud)
有解决方案吗
我一直在使用中发现的OAuthBase类这里我SSIS 2008 C#脚本组件(.NET 3.5).
它一直运行良好,但最近我遇到了问题,如果我在同一个数据流任务中执行多个脚本组件,使用上面的OAuthBase类中的GenerateNonce方法,我最终得到相同的随机数(随机数).
以下是生成nonce的OAuthBase类的摘录:
using System;
using System.Security.Cryptography;
using System.Collections.Generic;
using System.Text;
using System.Web;
namespace OAuth {
public class OAuthBase {
....snip......
protected Random random = new Random();
public virtual string GenerateNonce() {
// Just a simple implementation of a random number between 123400 and 9999999
return random.Next(123400, 9999999).ToString();
}
}
}
Run Code Online (Sandbox Code Playgroud)
在每个脚本组件中,我使用此C#代码来启动类并生成一个nonce:
OAuthBase oAuth = new OAuthBase();
string nonce = oAuth.GenerateNonce();
Run Code Online (Sandbox Code Playgroud)
从我的搜索周围,我认为这与它不是线程安全有关?我不完全确定.
我只能在SSIS 2008中运行.NET 3.5,所以我知道在.NET 4.0中引入的一些我不能使用的新东西.
关于如何修改OAuthBase类和/或我的C#脚本组件代码的任何想法?
我试图在我的脚本组件转换中从PipelineBuffer获取列名和索引是SSIS并将它们添加到Hashtable.我知道如果我将我的类public class ScriptMain : UserComponent改为:ScriptMain : PipelineComponent并使用此代码,这是可能的:
public override void ProcessInput(int InputID, Microsoft.SqlServer.Dts.Pipeline.PipelineBuffer Buffer)
{
inputBuffer = Buffer;
hash = new Hashtable();
IDTSInput100 i = ComponentMetaData.InputCollection.GetObjectByID(InputID);
foreach (IDTSInputColumn100 col in i.InputColumnCollection)
{
int colIndex = BufferManager.FindColumnByLineageID(i.Buffer, col.LineageID);
hash.Add(col.Name, colIndex);
}
}
Run Code Online (Sandbox Code Playgroud)
然而; 当我这样做时,我不能再覆盖:public override void Input0_ProcessInputRow(Input0Buffer Row)因为这在PipelineComponent类中不可用,并且我不能再通过调用这样的东西来访问我的连接管理器:IDTSConnectionManager100 connMgr = this.Connections.DbConnection;从我所看到的,UserComponent类中没有BufferManager.有没有办法使用UserComponent完成此任务?