amir tarek Ответов: 1

Вставить запрос в SQL сервером из C# ASP.NET веб-приложение запускается дважды


у меня есть asp.net веб-приложение, у меня есть проблема в том, что если страница (не все страницы) имеет кнопку вызова функции c#, которая вставляет запись в таблицу в базе данных sql server 2012, иногда запрос выполняется дважды, хотя я выполняю его только один раз.

эта проблема возникает только тогда, когда я развертываю приложение на сервере, и не происходит каждый раз, когда я развертываю это приложение на 4 серверах, 2 из них имеют эту проблему и не всегда случаются, и 2 из них работают нормально, хотя один из серверов, который работает нормально, имеет базу данных 60 ГБ (самая большая)

код, который используется для вставки
public static bool InsertToDB(SqlConnection Conn, string InsertStr)
        {
            SqlConnection LocalConnection = new SqlConnection();
            try
            {

                LocalConnection = new SqlConnection("user id=xxx;" +
                                            "password=" + pass + ";server=" + Server + " ;Trusted_Connection=no;" +
                                            "database=" + DataBaseName + "; " +
                                            "connection timeout=1000; MultipleActiveResultSets=True;max pool size=500");
                LocalConnection.Open();

                //DateTime startDate = DateTime.Now;
                SqlDataAdapter MySqlDataAdapter = new SqlDataAdapter();
                SqlCommand MySqlCommand = new SqlCommand();
                SqlCommand MySqlCommandWrite = new SqlCommand();
                MySqlCommandWrite.CommandText = InsertStr;
                MySqlCommandWrite.CommandTimeout = 999999999;
                MySqlCommandWrite.Connection = LocalConnection;
                MySqlCommandWrite.ExecuteNonQuery();
                LocalConnection.Close();
                LocalConnection.Dispose();
                SqlConnection.ClearPool(LocalConnection);
                return true;
            }
            catch (Exception ex)
            {
                LocalConnection.Close();
                LocalConnection.Dispose();
                SqlConnection.ClearPool(LocalConnection);
            }
        }


код за кнопкой

protected void BTN_Adddeposit_Click(object sender, EventArgs e)
        {
            double temp;
            int temp2;
            long temp3;
            try
            {


                int DivisionCode = 0;
                int SectorCode = Convert.ToInt32(HttpContext.Current.Session["SectorCode"]);
                int GenDivisionCode = Convert.ToInt32(HttpContext.Current.Session["GenDivisionCode"]);
                CLSDeposit OBJDeposit = new CLSDeposit(DivisionCode,SectorCode,GenDivisionCode);
                OBJDeposit.ClientID = ClientID;
                OBJDeposit.active = 0;
                OBJDeposit.DepositType = 1;
                OBJDeposit.DivisionCode = DivisionCode;
                OBJDeposit.DepositDate=Convert.ToDateTime(TXT_DepositDate.Text);
                OBJDeposit.DepositID=Convert.ToInt32(TXT_DepositID.Text);
                OBJDeposit.DepositValue=Convert.ToDouble(TXT_DepositValue.Text);
                OBJDeposit.InstallmentValue = OBJDeposit.DepositValue;
                OBJDeposit.InvoiceNo = Convert.ToInt64(TXT_DepositFatoora.Text).ToString();
                OBJDeposit.NumOfParts = 1;
                OBJDeposit.RearrangeDate = new DateTime(1900, 1, 1);
                OBJDeposit.IsPaid=0;
                OBJDeposit.Reason = TXT_Notes.Text;
                OBJDeposit.DebitBeforeChange = OBJDeposit.DepositValue;
                OBJDeposit.UserID = Convert.ToInt32(HttpContext.Current.Session["LoginUserID"]);
                bool OperationResult = OBJDeposit.InsertDeposit();

            }
            catch (Exception err)
            {
                //general exception
                ScriptManager.RegisterStartupScript(this, GetType(), "myFunction", "swal('خطأ في إتمام العملية','" + err.Message + "', 'error')", true);
            }
        }


код, который вставляют

public bool InsertDeposit()
        {
            string InsertDepositCommand = "INSERT INTO [dbo].[Deposits]([ser],[ClientID],[DDate],[DepitRemain],[Depit],[paid],[Paiddate],[UserID],[DivisionCode],[GenDivisionCode],[SectorCode],[DebitBeforeChange],Reason,installment,installmentVal,FormNo,DepType,RearrangeDate,active,RegisterDate) VALUES";
            InsertDepositCommand+="("+this.DepositID+","+this.ClientID+",convert(DATETIME,'" + DepositDateString + "',103)"+","+this.DepositValue+","+this.DepositRemain+","+this.IsPaid;
            InsertDepositCommand += ",convert(DATETIME,'" + PaidDateString + "',103)," + UserID + "," + this.DivisionCode + "," + this.GenDivisionCode + "," + this.SectorCode + "," + DebitBeforeChange + ",'" + Reason + "'," + NumOfParts + "," + InstallmentValue + "," + InvoiceNo + "," + DepositType + ",convert(DATETIME,'" + DepositDateString + "',103)," + active + ",convert(DATETIME,'" + RegiterDateString + "',103))";
            bool OperationResult = SQLDataBase.InsertToDB(SQLDataBase.LocalConnection, InsertDepositCommand);
            return OperationResult;
        }


Что я уже пробовал:

я пытался найти какое-либо решение для этого или, по крайней мере, какую-либо причину, но я не могу, так как это не постоянная проблема и не имеет постоянного состояния, чтобы произойти.

1 Ответов

Рейтинг:
0

OriginalGriff

Без вашего кода или какого - либо доступа к вашим данным мы действительно ничего не можем сделать, чтобы помочь-вы говорите: "Я выполняю его только один раз", но мы даже не можем увидеть это один раз!

Начните с регистрации действий: каждый раз, когда вы вставляете или обновляете запись, записывайте все детали в файл и просматривайте файл после возникновения проблемы. Вы можете получить информацию, которая поможет вам понять, почему он вставлен дважды.
Если это не поможет, добавьте триггер в SQL, который также регистрирует операции вставки, и сравните эти два журнала. Если журнал вставки SQL не согласуется с журналом приложения, то где - то в вашем приложении есть "скрытая Вставка"-либо потому, что вы ее не регистрировали, либо потому, что у вас есть обновление в БД, происходящее за кулисами, возможно, из связанной таблицы или чего-то подобного.

Соберите как можно больше информации и внимательно изучите ее - мы не можем сделать ничего конструктивного с такого расстояния!


amir tarek

я обновил вопрос и добавил код, который вставляет запись

OriginalGriff

Это на самом деле не помогает - кроме того, чтобы показать, что это не единственная ваша проблема, вы широко открыты для SQL - инъекции, потому что мы не можем сказать, является ли это единственным местом, где вы это делаете, или этот код выполняется только один раз.
Вам нужно войти в то, что происходит, и внимательно посмотреть на это. Это проблема "времени выполнения", и для ее отслеживания нужны данные времени выполнения - отдельные фрагменты кода не помогают, потому что они не связаны так же, как в запущенном приложении!