Вставить запрос в 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; }
Что я уже пробовал:
я пытался найти какое-либо решение для этого или, по крайней мере, какую-либо причину, но я не могу, так как это не постоянная проблема и не имеет постоянного состояния, чтобы произойти.
Richard Deeming
Ваш код уязвим для SQL-инъекция[^]. НИКОГДА используйте конкатенацию строк для построения SQL-запроса. ВСЕГДА используйте параметризованный запрос.
Все, что вы хотели знать о SQL-инъекции (но боялись спросить) | Трой Хант[^]
Как я могу объяснить SQL-инъекцию без технического жаргона? | Обмен Стеками Информационной Безопасности[^]
Шпаргалка по параметризации запросов / OWASP[^]