Как сохранить значения в SQL в двух разных столбцах без сбоев
Как сохранить значения в sql в двух разных столбцах таблицы без сбоя значений в сети.
Пример: в моей сети 20 пользователей.Все хотят обновить одну конкретную строку за раз.
Здесь произошло крушение.Это означает, что предположим, что я взял одну таблицу в этом количестве столбцов.Пользователи хотят обновить два столбца a, b своими значениями одновременно. когда мы нажимаем на обновление, иногда он меняет местами данные.
а=10,
b=20 я хочу обновить
но он обновился так: a=20, b=10
иногда также принималось нулевое значение.
Почему это происходит?
Если вы объясните, как решить эту проблему.Это было бы очень ценно.
Что я уже пробовал:
Я написал этот код на c#, чтобы сохранить.Но при этом пользователи экономят за раз по одной строке.Произошла замена значений столбцов.
sqlstr = "Insert into invINVOICEDETAILS (comment_NAME30, PRODUCT_NO, PRODUCT_NAME, QTY, UOM, PRICE, ITEM1_NO, DISCOUNT_PC, AMOUNT, SC_NO, GL_CODE, PROJ_NO, Gp_NO, WH_NO, Sales_exempt,FACTOR," + "Category, IMPORTED_FROM_NO, IMPORTED_FROM, GST_Amt, DISCOUNT_PC_2,Ref_No, GL_DESC, PRODUCT_NAME_LONG, CREATED_BY," + "DATE_CREATED, Deleted, INV_NO,Transfer, TICK, ID, AC_NO, AC_NAME, ITEM10, invNo_user, AVERAGE_COST, LP_COST, STD_COST,QTY_UNFILLED,DATETIME,Batch_No," + "Expiry_Date,PRINT_ITEM,QTY_BILLED,ITEM6_NO,ITEM7_NO,ITEM8_NO,IMPORT_KEY) values (@comment_NAME30,@PRODUCT_NO,@PRODUCT_NAME,@QTY,@UOM,@PRICE," + "@ITEM1_NO,@DISCOUNT_PC,@AMOUNT,@SC_NO,@GL_CODE,@PROJ_NO,@Gp_NO," + "@WH_NO,@Sales_exempt,@FACTOR,@Category,@IMPORTED_FROM_NO," + "@IMPORTED_FROM,@GST_Amt,@DISCOUNT_PC_2,@Ref_No,@GL_DESC," + "@PRODUCT_NAME_LONG, @CREATED_BY, @DATE_CREATED, @Deleted, @INV_NO," + "@Transfer,@TICK,@ID,@AC_NO,@AC_NAME,@ITEM10,@invNo_user,@AVERAGE_COST," + "@LP_COST,@STD_COST,@QTY_UNFILLED,@DATETIME,@Batch_No,@Expiry_Date," + "@PRINT_ITEM, @QTY_BILLED,@ITEM6_NO,@ITEM7_NO,@ITEM8_NO,@IMPORT_KEY)"; // cfs.Audit_Log("Invoice", ddl_Inv.Text, txt_Custcode.Text, strpcode, strUom, Prodqty, true, false, false); //sqlstr = "insert into invINVOICEDETAILS (" + sfield + ") values (" + sdata + ")"; //sqlstr = "insert into invINVOICEDETAILS()"; } else { sdata += "PRODUCT_NAME_LONG=N'" + cfs.singlequotconver(strdesc) + "', UPDATED_BY ='" + uid.ToString() + "',DATE_UPDATED='" + cfs.sqldateconverion() + "',Deleted='False',invNo_user='" + ddl_Inv.Text + uid.ToString() + "',CREATED_BY='" + uid + "' ," + "Transfer='U',TICK='C',AC_NO='" + cfs.singlequotconver(txt_Custcode.Text) + "',AC_NAME=N'" + cfs.singlequotconver(txt_Cus_Name.Text) + "',QTY_BILLED=" + Prodqty + ",ITEM10='" + cfs.singlequotconver(LineNo) + "',AVERAGE_COST=(select distinct AVERAGE_COST from PRODUCT where PRODUCT_NO='" + strpcode + "'),LP_COST=(select distinct LP_COST from PRODUCT where PRODUCT_NO='" + strpcode + "'),STD_COST=(select distinct STD_COST from PRODUCT where PRODUCT_NO='" + strpcode + "'),QTY_UNFILLED='" + strqtyfilled + "',DATETIME='" + cfs.sqldateconverion(txt_trans_Date.Value) + "'"; try { if (row.Cells["no"].Value.ToString() == "1") { sdata += ",PRINT_ITEM='GD',Batch_No='" + row.Cells["BATCH_CODE"].Value.ToString() + "',Expiry_Date='" + row.Cells["EXPIRY_DATE"].Value.ToString() + "'"; } } catch (Exception Ex) { } if (ZeroQtySave) { try { sdata += ",ITEM6_NO=" + cfs.IsNumber(row.Cells["Qty"].Value.ToString()) + ",ITEM7_NO='" + pri + "',ITEM8_NO='" + cfs.IsNumber(row.Cells["NetAmount"].Value.ToString()) + "' "; } catch (Exception Ex) { } } //Modified By Tarun on 24-11-2016 3/3 for the purpose of Invoice clashing //" invd_Item1='" + cfs.singlequotconver(Txt_Item1.Text) + "',invd_Item2='" + cfs.singlequotconver(Txt_Item2.Text) + "',invd_Item3='" + cfs.singlequotconver(Txt_Item3.Text) + "', " + //" invd_Item4='" + cfs.singlequotconver(Txt_Item4.Text) + "',invd_Item5='" + cfs.singlequotconver(Txt_Item5.Text) + "',invd_Item6='" + cfs.singlequotconver(Txt_Item6.Text) + "', " + //" invd_Item7='" + cfs.singlequotconver(Txt_Item7.Text) + "',invd_Item8='" + cfs.singlequotconver(Txt_Item8.Text) + "',invd_Item9='" + cfs.singlequotconver(Txt_Item9.Text) + "'"; //sqlstr = "update invINVOICEDETAILS set " + sdata + " where LINE = " + strid; sqlstr = "update invINVOICEDETAILS set comment_NAME30=@comment_NAME30," + "PRODUCT_NO=@PRODUCT_NO,PRODUCT_NAME=@PRODUCT_NAME,QTY=@QTY,UOM=@UOM,PRICE=@PRICE," + "ITEM1_NO=@ITEM1_NO,DISCOUNT_PC=@DISCOUNT_PC,AMOUNT=@AMOUNT,SC_NO=@SC_NO," + "GL_CODE=@GL_CODE,PROJ_NO=@PROJ_NO,Gp_NO=@Gp_NO,WH_NO=@WH_NO,Sales_exempt=@Sales_exempt,FACTOR=@FACTOR,GST_Amt=@GST_Amt,DISCOUNT_PC_2=@DISCOUNT_PC_2," + "PRODUCT_NAME_LONG=@PRODUCT_NAME_LONG,Category=@Category,IMPORTED_FROM_NO=@IMPORTED_FROM_NO,UPDATED_BY =@UPDATED_BY,DATE_UPDATED=@DATE_UPDATED," + "Deleted=@Deleted,CREATED_BY=@CREATED_BY ,Transfer=@Transfer,TICK=@TICK,AC_NO=@AC_NO," + "AC_NAME=@AC_NAME,QTY_BILLED=@QTY_BILLED,ITEM10=@ITEM10,invNo_user=@invNo_user,IMPORTED_FROM=@IMPORTED_FROM,AVERAGE_COST=@AVERAGE_COST,LP_COST=@LP_COST,STD_COST=@STD_COST," + "QTY_UNFILLED=@QTY_UNFILLED,DATETIME=@DATETIME,Batch_No=@Batch_No,Expiry_Date=@Expiry_Date,PRINT_ITEM=@PRINT_ITEM," + "ITEM6_NO=@ITEM6_NO,ITEM7_NO=@ITEM7_NO,ITEM8_NO=@ITEM8_NO,IMPORT_KEY=@IMPORT_KEY where LINE = @LINE"; // cfs.Audit_Log("Invoice", ddl_Inv.Text, txt_Custcode.Text, strpcode, strUom, Prodqty, false, true, false); } cmdTemp.CommandText = sqlstr; try { cmdTemp.Parameters.AddWithValue("@comment_NAME30", ((object)row.Cells[0].Value) ?? DBNull.Value); cmdTemp.Parameters.AddWithValue("PRODUCT_NO", ((object)row.Cells[1].Value) ?? DBNull.Value); cmdTemp.Parameters.AddWithValue("@PRODUCT_NAME", ((object)row.Cells[2].Value) ?? DBNull.Value); cmdTemp.Parameters.AddWithValue("@QTY", ((object)row.Cells[3].Value) ?? DBNull.Value); cmdTemp.Parameters.AddWithValue("@UOM", ((object)row.Cells[4].Value) ?? DBNull.Value); cmdTemp.Parameters.AddWithValue("@PRICE", ((object)row.Cells[5].Value) ?? DBNull.Value); cmdTemp.Parameters.AddWithValue("@ITEM1_NO", ((object)row.Cells[6].Value) ?? DBNull.Value); cmdTemp.Parameters.AddWithValue("@DISCOUNT_PC", ((object)row.Cells[7].Value) ?? DBNull.Value); cmdTemp.Parameters.AddWithValue("@AMOUNT", ((object)row.Cells[8].Value) ?? DBNull.Value); cmdTemp.Parameters.AddWithValue("@SC_NO", ((object)row.Cells[10].Value) ?? DBNull.Value); cmdTemp.Parameters.AddWithValue("@GL_CODE", ((object)row.Cells[11].Value) ?? DBNull.Value); cmdTemp.Parameters.AddWithValue("@PROJ_NO", ((object)row.Cells[12].Value) ?? DBNull.Value); cmdTemp.Parameters.AddWithValue("@Gp_NO", ((object)row.Cells[13].Value) ?? DBNull.Value); cmdTemp.Parameters.AddWithValue("@WH_NO", ((object)row.Cells[14].Value) ?? DBNull.Value); cmdTemp.Parameters.AddWithValue("@Sales_exempt", ((object)row.Cells[15].Value) ?? DBNull.Value); cmdTemp.Parameters.AddWithValue("@FACTOR", ((object)row.Cells[16].Value) ?? DBNull.Value); cmdTemp.Parameters.AddWithValue("@Category", ((object)row.Cells[18].Value) ?? DBNull.Value); cmdTemp.Parameters.AddWithValue("@IMPORTED_FROM_NO", ((object)row.Cells[19].Value) ?? DBNull.Value); cmdTemp.Parameters.AddWithValue("@IMPORTED_FROM", ((object)row.Cells[20].Value) ?? DBNull.Value); cmdTemp.Parameters.AddWithValue("@GST_Amt", ((object)row.Cells[23].Value) ?? DBNull.Value); cmdTemp.Parameters.AddWithValue("@DISCOUNT_PC_2", ((object)row.Cells[24].Value) ?? DBNull.Value); cmdTemp.Parameters.AddWithValue("@Ref_No", ((object)row.Cells[25].Value) ?? DBNull.Value); cmdTemp.Parameters.AddWithValue("@GL_DESC", ((object)row.Cells[27].Value) ?? DBNull.Value); cmdTemp.Parameters.AddWithValue("@PRODUCT_NAME_LONG", cfs.singlequotconver(strdesc)); cmdTemp.Parameters.AddWithValue("@CREATED_BY", uid.ToString()); cmdTemp.Parameters.AddWithValue("@DATE_CREATED", cfs.sqldateconverion()); cmdTemp.Parameters.AddWithValue("@Deleted", "False"); cmdTemp.Parameters.AddWithValue("@INV_NO", ddl_Inv.Text); cmdTemp.Parameters.AddWithValue("@Transfer", "U"); cmdTemp.Parameters.AddWithValue("@TICK", "C"); cmdTemp.Parameters.AddWithValue("@ID", strInvId); cmdTemp.Parameters.AddWithValue("@AC_NO", cfs.singlequotconver(txt_Custcode.Text)); cmdTemp.Parameters.AddWithValue("@AC_NAME", cfs.singlequotconver(txt_Cus_Name.Text)); cmdTemp.Parameters.AddWithValue("@ITEM10", cfs.singlequotconver(LineNo)); cmdTemp.Parameters.AddWithValue("@invNo_user", ddl_Inv.Text + uid.ToString()); cmdTemp.Parameters.AddWithValue("@AVERAGE_COST", cfs.get_data("select distinct AVERAGE_COST from PRODUCT where PRODUCT_NO='" + strpcode + "'")); cmdTemp.Parameters.AddWithValue("@LP_COST", cfs.get_data("select distinct LP_COST from PRODUCT where PRODUCT_NO='" + strpcode + "'")); cmdTemp.Parameters.AddWithValue("@STD_COST", cfs.get_data("select distinct STD_COST from PRODUCT where PRODUCT_NO='" + strpcode + "'")); cmdTemp.Parameters.AddWithValue("@QTY_UNFILLED", strqtyfilled); cmdTemp.Parameters.AddWithValue("@DATETIME", cfs.sqldateconverion(txt_trans_Date.Value)); cmdTemp.Parameters.AddWithValue("@Batch_No", batchno); cmdTemp.Parameters.AddWithValue("@Expiry_Date", Expirydate); cmdTemp.Parameters.AddWithValue("@PRINT_ITEM", printitem); cmdTemp.Parameters.AddWithValue("@QTY_BILLED", Prodqty); cmdTemp.Parameters.AddWithValue("@ITEM6_NO", Prodqty); cmdTemp.Parameters.AddWithValue("@ITEM7_NO", pri); cmdTemp.Parameters.AddWithValue("@ITEM8_NO", net); cmdTemp.Parameters.AddWithValue("@IMPORT_KEY", ((object)row.Cells[21].Value) ?? DBNull.Value); //MODIFICATION END 28DEC2016 1/1 if (isexisted == true) { cmdTemp.Parameters.AddWithValue("@LINE", strid); cmdTemp.Parameters.AddWithValue("@UPDATED_BY", uid.ToString()); cmdTemp.Parameters.AddWithValue("@DATE_UPDATED", cfs.sqldateconverion()); } } catch (Exception EX) { }
Michael_Davies
Во-первых, ваш sqlstr длинный и сложный, поэтому подвержен ошибкам и трудно увидеть, что происходит, если вы должны придерживаться этого метода, используйте отладчик и проверьте значение строки перед выполнением.
Во-вторых, никогда не объединяйте строку для создания SQL-оператора, подверженного атакам инъекций. Всегда используйте параметризованную строку.
sqlstr = " вставить в invINVOICE ([INV_NO],[AC_NO],[AC_NAME], ...) значения (@inv_no,@ac_no,@ac_name ...)";
cmd= new SqlCommand(sqlstr, cn);
УМК.параметры.добавить("@inv_no",ddl_Inv.Текст.Отделка());
и т.д.
В-третьих, мы не можем видеть схему таблицы, которая стоит на первом месте в таблицах переменных GST или EX GST, SQL не переупорядочивает и не меняет местами данные, он делает то, что вы его просите.
TarunKumarSusarapu
У меня так много кода, чтобы изменить его в параметризованном запросе.Есть ли какой-то способ легко измениться или другой способ?
barneyman
какое исключение вы получаете?
TarunKumarSusarapu
Не исключение и попадание сюда.Но сбой данных произошел