![](/img/trans.png)
[英]ADO.NET connection error “System.Data.OleDb.OleDbException”
[英]Check for either ADO.NET / OLEDB Connection presence and then insert to DB
我最初發布的問題是檢查是否存在ADO.NET/OLEDB連接類型。 正在解決的問題是,我想知道如何在插入數據庫時更改代碼。
例如,當連接類型是ADO.NET時,我們在連接類型中使用“Transaction”。
SqlConnection connection = (SqlConnection)connections[_connectionName].AcquireConnection(transaction);
現在如果我有OLEDB連接(而不是ADO.NET),我想在這段代碼中處理這種情況。 我需要做什么。 對不起,如果我聽起來不夠技術,但我不是C#人。 再次感謝您的幫助。
編輯我在這里粘貼整個代碼,因為我似乎無法使用OLEDB類型的連接。 我只能使用ADO.NET ...我知道它很簡單,但我不知道它是什么。
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();
}
}
}
由於connections[_connectionName].AcquireConnection(transaction);
你的代碼的一部分與SqlConnection
無關(你之后只是轉換為SqlConnection
),你應該能夠聲明與var
connection
,然后對你需要的connection
做任何事情。
var connection = connections[_connectionName].AcquireConnection(transaction);
獲得connection
對象后,可以將其轉換為所需的任何連接類型,並執行與將connection
變量聲明為該類型相同的操作。 例如
if(connection is DbConnection)
{
// ((DbConnection)connection).SomethingToDoWithDbConnection
}
if(connection is SqlConnection)
{
// ((SqlConnection)connection).SomethingToDoWithSqlConnection
}
if(connection is OleDbConnection)
{
// ((OleDbConnection)connection).SomethingToDoWithOleDbConnection
}
在System.Data.Common
您將找到具體數據庫類型(SqlConnection,OleDbConnection,SqlDataAdapter等)都派生自的基類。
如果你使用那些,即。 DbConnection
,使用哪個具體實現並不重要,代碼將是相同的。
DbConnection connection = connections[_connectionName]
.AcquireConnection(transaction) as DbConnection;
然后,您可以調用DbConnection.BeginTransaction()
而不是SqlConnection.BeginTransaction()
,無論連接是OleDbConnection還是SqlConnection都無關緊要。
只要您需要調用的所有方法都從DbConnection繼承,這將起作用。
其余的代碼也可以使用基類型,所以DbTransaction
, DbDataAdapter
, DbDataReader
等。
因為您的AquireConnection()
方法不返回具體的連接類型,所以您可以利用依賴注入並編寫非特定於實現的代碼。
具體來說,對於插入,您將具有以下內容:
DbCommand command = null;
if (connection is SqlConnection)
command = new SqlCommand();
else if (connection is OleDbConnection)
command = new OleDbCommand();
command.CommandText = "INSERT STATEMENT HERE";
command.Connection = connection;
command.ExecuteNonQuery();
不要忘記你需要connection.Close()
。在某處關閉connection.Close()
。 (如果使用ConnectionManager,則為ReleaseConnection)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.