Как интегрировать в SQL транзакции между одним более даты дата функция
первая функция для удаления из таблицы
вторая функция для вставки в таблицу
я хочу использовать одну транзакцию для начала trans ans commit trans между функциями буксировки
но я использую sqlcommand в первой функции и другую sqlcommand во второй функции
и так происходит ошибка
Что я уже пробовал:
это метод удаления
public virtual Tuple<bool,SqlTransaction> DeleteFromTabel(SqlConnection cnn, string TabelName, bool useTruncate = false, bool useCommetTrans = false, string WherCondtion = null,bool useContuniTrans =false,params object[] Paramter) { #region Variables int Result; SqlCommand DeleteCommand = new SqlCommand(); SqlTransaction DeleteTransAction=null; #endregion if (useCommetTrans | useContuniTrans) { DeleteTransAction = cnn.BeginTransaction(); DeleteCommand.Transaction = DeleteTransAction; } if (useTruncate) // Delete all table Data Without Condtion { DeleteCommand.CommandText = "truncate Table " + TabelName; } else //Delete data table By Condtion { if (Paramter.Length!=0) { string[] ParameterName = new string[Paramter.Length]; int i = 0; foreach (SqlParameter Par in Paramter) { ParameterName[i] = Par.ParameterName; DeleteCommand.Parameters.AddWithValue(Par.ToString(), Par.Value); i++; } string DeleteString = "Delete from " + TabelName + " where " + WherCondtion; DeleteString = string.Format(CultureInfo.InvariantCulture, DeleteString, ParameterName); DeleteCommand.CommandText = DeleteString; } else { DeleteCommand.CommandText = "Delete from " + TabelName; } } DeleteCommand.Connection = cnn; Result= DeleteCommand.ExecuteNonQuery(); #region Result if (useCommetTrans) { // DeleteTransAction.Commit(); } if (Result == 0) return new Tuple<bool, SqlTransaction>(false, DeleteTransAction); else return new Tuple<bool, SqlTransaction>(true, DeleteTransAction); #endregion }
Это метод вставки
public virtual Tuple<bool, SqlTransaction> InsertIntoTable(SqlConnection cnn, string TabelName, string FieldsName, string FieldsValue, bool useCommetTrans = false, string SelectFromAnotherTable = null, params object[] ParamterValues) { #region Variables int Result; SqlCommand InsertCommand = new SqlCommand(); SqlTransaction InsertTransAction = null; #endregion if (useCommetTrans ) { InsertTransAction = cnn.BeginTransaction(); InsertCommand.Transaction = InsertTransAction; } if (ParamterValues.Length != 0 && FieldsName != null) { string[] ParameterName = new string[ParamterValues.Length]; int i = 0; foreach (SqlParameter Par in ParamterValues) { ParameterName[i] = Par.ParameterName; InsertCommand.Parameters.AddWithValue(Par.ToString(), Par.Value); i++; } string InsertIntoTable = "Insert Into " + TabelName + "(" + FieldsName + ") Values (" + FieldsValue + ")"; InsertIntoTable = string.Format(CultureInfo.InvariantCulture, InsertIntoTable, ParameterName); InsertCommand.CommandText = InsertIntoTable; } else { if (ParamterValues.Length != 0) { string[] ParameterName = new string[ParamterValues.Length]; int i = 0; foreach (SqlParameter Par in ParamterValues) { ParameterName[i] = Par.ParameterName; InsertCommand.Parameters.AddWithValue(Par.ToString(), Par.Value); i++; } string InsertIntoTable = "Insert Into " + TabelName + " " + "Select " + SelectFromAnotherTable; InsertIntoTable = string.Format(CultureInfo.InvariantCulture, InsertIntoTable, ParameterName); InsertCommand.CommandText = InsertIntoTable; } else { string InsertIntoTable = "Insert Into " + TabelName + " " + "Select " + SelectFromAnotherTable; InsertCommand.CommandText = InsertIntoTable; } } InsertCommand.Connection = cnn; Result = InsertCommand.ExecuteNonQuery(); #region Result if (useCommetTrans) { InsertTransAction.Commit(); } if (Result == 0) return new Tuple<bool, SqlTransaction>(false, InsertTransAction); else return new Tuple<bool, SqlTransaction>(true, InsertTransAction); #endregion }
DerekT-P
Вы, похоже, не передаете транзакцию, созданную в Delete, в методы Insert... и даже если бы вы это сделали, вы либо всегда устанавливаете транзакцию в null, либо начинаете новую транзакцию (в зависимости от useCommetTrans - мы действительно не знаем, что это означает). Чтобы мы могли лучше помочь вам, предложите вам упростить оба метода, чтобы вы просто оставили код, который будет выполняться, если вы хотите перенести транзакцию от удаления до вставки, а также вызывающий код.
Кроме того, имейте в виду, что при использовании Truncate эта команда не является невыполнимой, то есть в любом случае не участвует в транзакции; DDL (который не поддерживается во всех реализациях СУБД) является командой DDL, а не DML и на самом деле не должен рассматриваться как "альтернатива" использованию Delete.