Die Transaction-Eigenschaft der Befehl wurde nicht initialisiert
Ich versuche zu laufen ExecuteNonQuery mit der Transaktion, aber ich bekomme immer diese Fehler
OleDbException : ExecuteNonQuery erfordert der Befehl, um eine
Transaktion, wenn die Verbindung dem Befehl zugewiesen ist, in einem
ausstehende lokale Transaktion. Die Transaction-Eigenschaft des command -
wurde nicht initialisiert.
Hier ist mein code: Was ist das problem?
_dataManager = new DataManager();
bool bTrance = false;
_dataManager.BuildConnectionString("server", "MyId", "MyPwd");
_dataManager.Connect();
try
{
Console.WriteLine("Begin Trans");
var res = _dataManager.BeginTransaction();
if (res)
{
bTrance = true;
Console.WriteLine(" Trans Success");
}
Console.WriteLine("Query Executed");
return _dataManager.ExecuteQuery("call SP_MySp");
}
catch (OleDbException objDBExc)
{
Console.WriteLine("OleDbException : " + objDBExc.Message);
if (bTrance)
{
_dataManager.RollbackTransaction();
}
return false;
}
catch (Exception objExc)
{
Console.WriteLine("OleDbException : " + objExc.Message);
if (bTrance)
{
bTrance = false;
_dataManager.RollbackTransaction();
}
return false;
}
finally
{
Console.WriteLine("Done!");
if (bTrance)
{
_dataManager.CommitTransaction();
}
}
public class DataManager
{
private OleDbConnectionStringBuilder dbConnStr;
private OleDbConnection dbConn;
private OleDbTransaction dbTransaction;
private OleDbCommand dbCommand;
private bool beginTransaction;
public bool BeginTransaction()
{
try
{
if (beginTransaction == false)
{
dbTransaction = dbConn.BeginTransaction();
dbCommand.Transaction = dbTransaction;
beginTransaction = true;
}
else
dbCommand.Transaction = dbTransaction;
}
catch (Exception)
{
throw;
}
return beginTransaction;
}
public bool ExecuteQuery(string command)
{
try
{
dbCommand.ExecuteNonQuery();
}
catch (OleDbException objDbEx)
{
throw;
}
catch (Exception objEx)
{
throw;
}
dbCommand.Parameters.Clear();
dbCommand.Connection = null;
return true;
}
}
Viel einfacher damit das Framework die details kümmern:
Der Datamanager classcode gehört eigentlich zu einer DLL. Es wird von vielen anderen Anwendungen.
using (var tx = new TransactionScope()) { your DB code goes here }
. Aufruf tx.Commit()
am Ende des Blocks, sofern Sie zurücksetzen möchten.Der Datamanager classcode gehört eigentlich zu einer DLL. Es wird von vielen anderen Anwendungen.
InformationsquelleAutor Amit Kumar | 2016-02-12
Du musst angemeldet sein, um einen Kommentar abzugeben.
Rufen Sie die BeginTransaction-Methode des SqlConnection-Objekts markieren den Beginn der Transaktion. Die BeginTransaction-Methode gibt eine Referenz auf die Transaktion. Dieser Referenz zugewiesen ist, das SqlCommand-Objekte, die in der Transaktion eingetragen.
Weisen Sie die Transaktion Gegenstand der Transaktion-Eigenschaft des SqlCommand-Objekt ausgeführt werden. Wenn ein Befehl ausgeführt wird, auf eine Verbindung mit einer aktiven Transaktion und die Transaktion-Objekt zugeordnet wurde, die Transaction-Eigenschaft des Command-Objekts, wird eine Ausnahme geworfen.
Führen Sie die erforderlichen Befehle.
Rufen Sie die Commit-Methode der SqlTransaction-Objekt um die Transaktion abzuschließen, oder rufen Sie die Rollback-Methode, um die Transaktion abgebrochen. Wenn die Verbindung geschlossen oder entsorgt wird, bevor entweder die Commit-oder Rollback-Methode ausgeführt wurde, die Transaktion wird ein Rollback ausgeführt.
Finden https://msdn.microsoft.com/en-us/library/2k2hy99x(VS.80).aspx
InformationsquelleAutor Bharat