缺少库以引用OLEDB连接类型

我从SSIS Team Blog获得了以下代码来转换OLEDB连接类型,以便AcquireConnection()方法可以使用它。 现在我不确定为什么Dts.Connections部分不起作用。 我不知道我必须添加的库以使其工作。 我几乎添加了最重要的包括Dts.RuntimeWrap。 如果您需要有关该问题的更多信息,请与我们联系。

ConnectionManager cm = Dts.Connections["oledb"]; Microsoft.SqlServer.Dts.Runtime.Wrapper.IDTSConnectionManagerDatabaseParameters100 cmParams = cm.InnerObject as Microsoft.SqlServer.Dts.Runtime.Wrapper.IDTSConnectionManagerDatabaseParameters100; OleDbConnection conn = cmParams.GetConnectionForSchema() as OleDbConnection; 

编辑以下是此组件的完整代码。

 using System; using System.Collections.Generic; using System.Data; using System.Data.SqlClient; using Microsoft.SqlServer.Dts.Runtime; using System.Data.OleDb; using System.Data.Common; using System.Linq; using System.Configuration; using System.Collections; //using System.Data.OleDb; namespace AOC.SqlServer.Dts.Tasks { [DtsTask( DisplayName = "Custom Logging Task", Description = "Writes logging info into a table")] public class CustomLoggingTask : Task { private string _packageName; private string _taskName; private string _errorCode; private string _errorDescription; private string _machineName; private double _packageDuration; private string _connectionName; private string _eventType; private string _executionid; private DateTime _handlerdatetime; private string _uid; public string ConnectionName { set { _connectionName = value; } get { return _connectionName; } } public string Event { set { _eventType = value; } get { return _eventType; } } public override DTSExecResult Validate(Connections connections, VariableDispenser variableDispenser, IDTSComponentEvents componentEvents, IDTSLogging log) { const string METHOD_NAME = "CustomLoggingTask-Validate"; try { if (string.IsNullOrEmpty(_eventType)) { componentEvents.FireError(0, METHOD_NAME, "The event property must be specified", "", -1); return DTSExecResult.Failure; } if (string.IsNullOrEmpty(_connectionName)) { componentEvents.FireError(0, METHOD_NAME, "No connection has been specified", "", -1); return DTSExecResult.Failure; } //SqlConnection connection = connections[_connectionName].AcquireConnection(null) as SqlConnection; DbConnection connection = connections[_connectionName].AcquireConnection(null) as DbConnection; ConnectionManager cm = Dts.Connections["oledb"]; Microsoft.SqlServer.Dts.Runtime.Wrapper.IDTSConnectionManagerDatabaseParameters100 cmParams = cm.InnerObject as Microsoft.SqlServer.Dts.Runtime.Wrapper.IDTSConnectionManagerDatabaseParameters100; OleDbConnection conn = cmParams.GetConnectionForSchema() as OleDbConnection; if (connection == null) { componentEvents.FireError(0, METHOD_NAME, "The connection is not a valid ADO.NET connection", "", -1); return DTSExecResult.Failure; } if (!variableDispenser.Contains("System::SourceID")) { componentEvents.FireError(0, METHOD_NAME, "No System::SourceID variable available. This task can only be used in an Event Handler", "", -1); return DTSExecResult.Failure; } return DTSExecResult.Success; } catch (Exception exc) { componentEvents.FireError(0, METHOD_NAME, "Validation Failed: " + exc.ToString(), "", -1); return DTSExecResult.Failure; } } public override DTSExecResult Execute(Connections connections, VariableDispenser variableDispenser, IDTSComponentEvents componentEvents, IDTSLogging log, object transaction) { try { string commandText = @"INSERT INTO SSISLog (EventType, PackageName, TaskName, EventCode, EventDescription, PackageDuration, Host, ExecutionID, EventHandlerDateTime,UID) VALUES (@EventType, @PackageName, @TaskName, @EventCode, @EventDescription, @PackageDuration, @Host, @Executionid, @handlerdatetime,@uid)"; ReadVariables(variableDispenser); DbConnection connection = connections[_connectionName].AcquireConnection(transaction) as DbConnection; //SqlConnection connection = (SqlConnection)connections[_connectionName].AcquireConnection(transaction); DbCommand command = null; //using (SqlCommand command = new SqlCommand()) if (connection is SqlConnection) command = new SqlCommand(); else if (connection is OleDbConnection) command = new OleDbCommand(); { command.CommandText = commandText; command.CommandType = CommandType.Text; command.Connection = connection; command.Parameters.Add(new SqlParameter("@EventType", _eventType)); command.Parameters.Add(new SqlParameter("@PackageName", _packageName)); command.Parameters.Add(new SqlParameter("@TaskName", _taskName)); command.Parameters.Add(new SqlParameter("@EventCode", _errorCode ?? string.Empty)); command.Parameters.Add(new SqlParameter("@EventDescription", _errorDescription ?? string.Empty)); command.Parameters.Add(new SqlParameter("@PackageDuration", _packageDuration)); command.Parameters.Add(new SqlParameter("@Host", _machineName)); command.Parameters.Add(new SqlParameter("@ExecutionID", _executionid)); command.Parameters.Add(new SqlParameter("@handlerdatetime", _handlerdatetime)); command.Parameters.Add(new SqlParameter("@uid", _uid)); command.ExecuteNonQuery(); } connection.Close(); return DTSExecResult.Success; } catch (Exception exc) { componentEvents.FireError(0, "CustomLoggingTask-Execute", "Task Errored: " + exc.ToString(), "", -1); return DTSExecResult.Failure; } } private void ReadVariables(VariableDispenser variableDispenser) { variableDispenser.LockForRead("System::StartTime"); variableDispenser.LockForRead("System::PackageName"); variableDispenser.LockForRead("System::SourceName"); variableDispenser.LockForRead("System::MachineName"); variableDispenser.LockForRead("System::ExecutionInstanceGUID"); variableDispenser.LockForRead("System::EventHandlerStartTime"); variableDispenser.LockForRead("User::UID"); bool includesError = variableDispenser.Contains("System::ErrorCode"); if (includesError) { variableDispenser.LockForRead("System::ErrorCode"); variableDispenser.LockForRead("System::ErrorDescription"); } Variables vars = null; variableDispenser.GetVariables(ref vars); DateTime startTime = (DateTime)vars["System::StartTime"].Value; _packageDuration = DateTime.Now.Subtract(startTime).TotalSeconds; _packageName = vars["System::PackageName"].Value.ToString(); _taskName = vars["System::SourceName"].Value.ToString(); _machineName = vars["System::MachineName"].Value.ToString(); _executionid = vars["System::ExecutionInstanceGUID"].Value.ToString(); _handlerdatetime = (DateTime)vars["System::EventHandlerStartTime"].Value; _uid = vars["User::UID"].Value.ToString(); if (includesError) { _errorCode = vars["System::ErrorCode"].Value.ToString(); _errorDescription = vars["System::ErrorDescription"].Value.ToString(); } // release the variable locks. vars.Unlock(); // reset the dispenser variableDispenser.Reset(); } } } 

通过您发布的代码,我终于找到了您想要完成的任务。

这些是我为使其发挥作用所做的事情:

A)您收到的编译错误:

 "Error 1 The type or namespace name 'Connections' does not exist in the namespace 'AOC.SqlServer.Dts' (are you missing an assembly reference?)" 

只是因为你试图获得oledb连接管理器的方式:

 ConnectionManager cm = Dts.Connections["oledb"]; 

Dts对象是脚本任务组件中可用的工具。 您应该用以下内容替换该行:

 ConnectionManager cm = connections["oledb"]; 

我已经在你的代码中看到你以这种方式访问Connection Manager ,所以也许你只是留下了一些东西。

B)要validation连接管理器是ADO.NET连接管理器还是OLEDB连接管理器,请更改以下代码:

 DbConnection connection = connections[_connectionName].AcquireConnection(null) as DbConnection; ConnectionManager cm = Dts.Connections["oledb"]; Microsoft.SqlServer.Dts.Runtime.Wrapper.IDTSConnectionManagerDatabaseParameters100 cmParams = cm.InnerObject as Microsoft.SqlServer.Dts.Runtime.Wrapper.IDTSConnectionManagerDatabaseParameters100; OleDbConnection conn = cmParams.GetConnectionForSchema() as OleDbConnection; if (connection == null) { componentEvents.FireError(0, METHOD_NAME, "The connection is not a valid ADO.NET connection", "", -1); return DTSExecResult.Failure; } 

首先,在类级别添加一个私有变量来存储连接:

 private DbConnection _connection; 

然后,修改validation以检查连接是否为ADO.NET,如果不是,则检查它是否为OLEDB:

 _connection = connections[_connectionName].AcquireConnection(null) as DbConnection; if (_connection == null) { ConnectionManager cm = connections[_connectionName]; Microsoft.SqlServer.Dts.Runtime.Wrapper.IDTSConnectionManagerDatabaseParameters100 cmParams = cm.InnerObject as Microsoft.SqlServer.Dts.Runtime.Wrapper.IDTSConnectionManagerDatabaseParameters100; _connection = cmParams.GetConnectionForSchema() as OleDbConnection; if (_connection == null) { componentEvents.FireError(0, METHOD_NAME, "The connection is not a valid ADO.NET or OLEDB connection", "", -1); return DTSExecResult.Failure; } } 

请注意,我用_connectionName变量替换了硬编码的"oledb" ,并且在两种情况下_connection为null时也修改了错误字符串。

C)要使用OLEDB提供程序执行命令,必须进行以下更改:

  • 使用新的_connection变量,它保存先前检索的连接。
  • 添加到命令的参数必须是OleDbParameter而不是SqlParameter
  • OLE DB .NET提供程序不支持命名参数。 那么,需要修改INSERT语句命令中的VALUES部分才能使用?

D)这是完整的工作代码:

 using System; using System.Data; using System.Data.Common; using System.Data.OleDb; using System.Data.SqlClient; using Microsoft.SqlServer.Dts.Runtime; //using System.Data.OleDb; namespace AOC.SqlServer.Dts.Tasks { [DtsTask( DisplayName = "Custom Logging Task", Description = "Writes logging info into a table")] public class CustomLoggingTask : Task { private string _packageName; private string _taskName; private string _errorCode; private string _errorDescription; private string _machineName; private double _packageDuration; private string _connectionName; private string _eventType; private string _executionid; private DateTime _handlerdatetime; private string _uid; public string ConnectionName { set { _connectionName = value; } get { return _connectionName; } } public string Event { set { _eventType = value; } get { return _eventType; } } private DbConnection _connection; public override DTSExecResult Validate(Connections connections, VariableDispenser variableDispenser, IDTSComponentEvents componentEvents, IDTSLogging log) { const string METHOD_NAME = "CustomLoggingTask-Validate"; try { if (string.IsNullOrEmpty(_eventType)) { componentEvents.FireError(0, METHOD_NAME, "The event property must be specified", "", -1); return DTSExecResult.Failure; } if (string.IsNullOrEmpty(_connectionName)) { componentEvents.FireError(0, METHOD_NAME, "No connection has been specified", "", -1); return DTSExecResult.Failure; } //SqlConnection connection = connections[_connectionName].AcquireConnection(null) as SqlConnection; _connection = connections[_connectionName].AcquireConnection(null) as DbConnection; if (_connection == null) { ConnectionManager cm = connections[_connectionName]; Microsoft.SqlServer.Dts.Runtime.Wrapper.IDTSConnectionManagerDatabaseParameters100 cmParams = cm.InnerObject as Microsoft.SqlServer.Dts.Runtime.Wrapper.IDTSConnectionManagerDatabaseParameters100; _connection = cmParams.GetConnectionForSchema() as OleDbConnection; if (_connection == null) { componentEvents.FireError(0, METHOD_NAME, "The connection is not a valid ADO.NET or OLEDB connection", "", -1); return DTSExecResult.Failure; } } if (!variableDispenser.Contains("System::SourceID")) { componentEvents.FireError(0, METHOD_NAME, "No System::SourceID variable available. This task can only be used in an Event Handler", "", -1); return DTSExecResult.Failure; } return DTSExecResult.Success; } catch (Exception exc) { componentEvents.FireError(0, METHOD_NAME, "Validation Failed: " + exc.ToString(), "", -1); return DTSExecResult.Failure; } } public override DTSExecResult Execute(Connections connections, VariableDispenser variableDispenser, IDTSComponentEvents componentEvents, IDTSLogging log, object transaction) { try { string commandText = null; ReadVariables(variableDispenser); //DbConnection connection = connections[_connectionName].AcquireConnection(transaction) as DbConnection; //SqlConnection connection = (SqlConnection)connections[_connectionName].AcquireConnection(transaction); DbCommand command = null; //using (SqlCommand command = new SqlCommand()) if (_connection is SqlConnection) { commandText = @"INSERT INTO SSISLog (EventType, PackageName, TaskName, EventCode, EventDescription, PackageDuration, Host, ExecutionID, EventHandlerDateTime,UID) VALUES (@EventType, @PackageName, @TaskName, @EventCode, @EventDescription, @PackageDuration, @Host, @Executionid, @handlerdatetime,@uid)"; command = new SqlCommand(); command.Parameters.Add(new SqlParameter("@EventType", _eventType)); command.Parameters.Add(new SqlParameter("@PackageName", _packageName)); command.Parameters.Add(new SqlParameter("@TaskName", _taskName)); command.Parameters.Add(new SqlParameter("@EventCode", _errorCode ?? string.Empty)); command.Parameters.Add(new SqlParameter("@EventDescription", _errorDescription ?? string.Empty)); command.Parameters.Add(new SqlParameter("@PackageDuration", _packageDuration)); command.Parameters.Add(new SqlParameter("@Host", _machineName)); command.Parameters.Add(new SqlParameter("@ExecutionID", _executionid)); command.Parameters.Add(new SqlParameter("@handlerdatetime", _handlerdatetime)); command.Parameters.Add(new SqlParameter("@uid", _uid)); } else if (_connection is OleDbConnection) { commandText = @"INSERT INTO SSISLog (EventType,PackageName,TaskName,EventCode,EventDescription,PackageDuration,Host,ExecutionID,EventHandlerDateTime,UID) VALUES (?,?,?,?,?,?,?,?,?,?)"; command = new OleDbCommand(); command.Parameters.Add(new OleDbParameter("@EventType", _eventType)); command.Parameters.Add(new OleDbParameter("@PackageName", _packageName)); command.Parameters.Add(new OleDbParameter("@TaskName", _taskName)); command.Parameters.Add(new OleDbParameter("@EventCode", _errorCode ?? string.Empty)); command.Parameters.Add(new OleDbParameter("@EventDescription", _errorDescription ?? string.Empty)); command.Parameters.Add(new OleDbParameter("@PackageDuration", _packageDuration)); command.Parameters.Add(new OleDbParameter("@Host", _machineName)); command.Parameters.Add(new OleDbParameter("@ExecutionID", _executionid)); command.Parameters.Add(new OleDbParameter("@handlerdatetime", _handlerdatetime)); command.Parameters.Add(new OleDbParameter("@uid", _uid)); } command.CommandText = commandText; command.CommandType = CommandType.Text; command.Connection = _connection; command.ExecuteNonQuery(); _connection.Close(); return DTSExecResult.Success; } catch (Exception exc) { componentEvents.FireError(0, "CustomLoggingTask-Execute", "Task Errored: " + exc.ToString(), "", -1); return DTSExecResult.Failure; } } private void ReadVariables(VariableDispenser variableDispenser) { variableDispenser.LockForRead("System::StartTime"); variableDispenser.LockForRead("System::PackageName"); variableDispenser.LockForRead("System::SourceName"); variableDispenser.LockForRead("System::MachineName"); variableDispenser.LockForRead("System::ExecutionInstanceGUID"); variableDispenser.LockForRead("System::EventHandlerStartTime"); variableDispenser.LockForRead("User::UID"); bool includesError = variableDispenser.Contains("System::ErrorCode"); if (includesError) { variableDispenser.LockForRead("System::ErrorCode"); variableDispenser.LockForRead("System::ErrorDescription"); } Variables vars = null; variableDispenser.GetVariables(ref vars); DateTime startTime = (DateTime)vars["System::StartTime"].Value; _packageDuration = DateTime.Now.Subtract(startTime).TotalSeconds; _packageName = vars["System::PackageName"].Value.ToString(); _taskName = vars["System::SourceName"].Value.ToString(); _machineName = vars["System::MachineName"].Value.ToString(); _executionid = vars["System::ExecutionInstanceGUID"].Value.ToString(); _handlerdatetime = (DateTime)vars["System::EventHandlerStartTime"].Value; _uid = vars["User::UID"].Value.ToString(); if (includesError) { _errorCode = vars["System::ErrorCode"].Value.ToString(); _errorDescription = vars["System::ErrorDescription"].Value.ToString(); } // release the variable locks. vars.Unlock(); // reset the dispenser variableDispenser.Reset(); } } } 

只是为了记录,我给你留下了一些我发现有用的开发,部署和调试自定义组件的链接(但也许你已经完成了它们!):

http://bennyaustin.wordpress.com/2009/06/30/steps-to-build-and-deploy-custom-ssis-components/

http://msdn.microsoft.com/en-us/library/ms403356%28v=sql.105%29.aspx

http://toddmcdermid.blogspot.com.ar/2009/06/converting-your-script-task-into-custom_22.html

干杯。