2012-06-27 73 views
1

在大家的幫助下,我管理了以下僅適用於ADO.NET連接的代碼段。但是當我改變我的連接到OLEDB時,這似乎失敗了。我不確定爲什麼會發生,但希望在您的幫助下解決此問題。檢查有效的ADO.NET/OLEDB連接

此代碼的目的是檢查ADO.NET或OLEDB連接的存在。如果它們都不存在,則會引發錯誤。如果其中任何一個存在,則使用該連接類型將變量值插入到表中。

歡迎任何建議,改進!

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; 

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; 
    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; 
      } 

      DbConnection connection = connections[_connectionName].AcquireConnection(null) as DbConnection; 
      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) 
VALUES (@EventType, @PackageName, @TaskName, @EventCode, @EventDescription, @PackageDuration, @Host, @Executionid, @handlerdatetime)"; 

      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.ExecuteNonQuery(); 
      } 

      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"); 
     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; 
     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(); 
    } 
} 
+0

它是拋出一個錯誤還是隻是通過並沒有返回預期的結果? – Brian

+0

當我在SSIS中使用由此代碼生成的DLL時,它僅適用於ADO.NET連接類型。如果我使用OLEDB類型的連接,它會失敗,我說「[CustomLoggingTask-Validate]錯誤:連接不是有效的ADO.NET連接」。我把檢查在那裏,以確保它處理ADO.NET和OLEDB,但不知道爲什麼它給了我這個錯誤。 – rvphx

+0

我的猜測是OLEDB不明白DbConnection是什麼,即使它是從DbConnection繼承的。 – Brian

回答

0

我從另一個問題發現了這個問題的答案。只是在這裏更新它。 Question