C# 第二次更新行时并发错误C

C# 第二次更新行时并发错误C,c#,mysql,C#,Mysql,您好,我遇到并发冲突updatecommand影响了预期的1条记录中的0条。尝试更新行时出错,奇怪的是,我可以只更新一次行,下次我在同一行上重复该过程时,我会收到错误,我已经尝试了endinit和endedit,如果您有任何帮助,我们将不胜感激 我正在使用c和MySQL innodb string cs = "server=" + fidaConfig.dtBDConfig.Rows[0][2] + ";user id=root;Password=" + fidaConfig.dtBDConfi

您好,我遇到并发冲突updatecommand影响了预期的1条记录中的0条。尝试更新行时出错,奇怪的是,我可以只更新一次行,下次我在同一行上重复该过程时,我会收到错误,我已经尝试了endinit和endedit,如果您有任何帮助,我们将不胜感激

我正在使用c和MySQL innodb

string cs = "server=" + fidaConfig.dtBDConfig.Rows[0][2] + ";user id=root;Password=" + fidaConfig.dtBDConfig.Rows[0][4] + ";persist security info=True;database=facturas"; 
MySql.Data.MySqlClient.MySqlConnection conn = new MySql.Data.MySqlClient.MySqlConnection() { ConnectionString = cs }; 
switch (tableInvoice) 
{ 
case "factura_idj": 
    dsLuiscencioTableAdapters.factura_idjTableAdapter idjAdapter = new Control_Administrativo.dsLuiscencioTableAdapters.factura_idjTableAdapter() { Connection = conn }; 
    dsLuiscencio.factura_idjDataTable idj = idjAdapter.GetData(); 
    var facturaidj = (from f in idj where f.no_factura_idj == InvoiceNumber select f).Single(); 
    if (DateTime.Today.Date >= Convert.ToDateTime("01-01-2010") && facturaidj.fecha.Date <= Convert.ToDateTime("01-01-2010")) 
    { 
        var quieresactualizar = MessageBox.Show("Desea Actualizar el total de acuerdo a los nuevos impuestos?", "Reforma Fiscal", MessageBoxButtons.YesNo); 
        if (quieresactualizar == DialogResult.Yes) 
        { 
            switch (facturaidj.opt_iva) 
            { 
        case 1: 
            facturaidj.iva = 0; 
            facturaidj.total = facturaidj.subtotal; 
            break; 
        case 2: 
            facturaidj.iva = facturaidj.subtotal * 0.11; 
            facturaidj.total = facturaidj.subtotal * 1.11; 
            break; 
        case 3: 
            facturaidj.iva = facturaidj.subtotal * 0.16; 
            facturaidj.total = facturaidj.subtotal * 1.16; 
            break; 
        default: 
            break; 

            } 
            Number2Letter.Number2Letter n2l = new Number2Letter.Number2Letter(); 
            string totalwithnocents = n2l.Numero2Letra(facturaidj.total.ToString(), 0, 0, "peso", "", 
        Number2Letter.Number2Letter.eSexo.Masculino, 
        Number2Letter.Number2Letter.eSexo.Masculino).ToUpper(); 

            string strtotalconivaretenido = Math.Round(facturaidj.total, 2, MidpointRounding.ToEven).ToString("###########.00"); 
            string cents = strtotalconivaretenido.Substring(strtotalconivaretenido.IndexOf(".") + 1); 

            facturaidj.total_letra = string.Format(@"{0} {1}/100 {2}", totalwithnocents, cents, facturaidj.tipo_moneda).ToUpper(); 
            idj.EndInit(); 
            idjAdapter.Update(facturaidj);//this runs only the first time on a row, then throws the error 
        } 
    } 
    break; 
    continues......

我不确定您是否在数据库中使用了浮点数据类型,但本文可能是您遇到的情况:

idjAdapter.Update背后的SQL是什么,它是如何生成的?您是否在Visual Studio中使用了拖放设计器?如果您这样做了,那么您是否希望检查自动生成的更新脚本?根据我在MS SQL世界中使用设计器代码的经验,它通常会包含一个非常复杂的WHERE语句,只有当行的每个旧字段仍然存在时,它才会更新

如果您的表碰巧包含自动生成的时间戳字段或类似的内容,那么您可能会遇到两个用户的问题,其中该字段可能会在您背后更新,因此更新中的where将失败,从而导致适配器引发此并发异常


然后,您需要决定如何处理该问题。如果您只是想拥有wins逻辑中的last,那么您需要从设计器的属性窗口手动更改设计器中该表适配器的更新SQL,以便在Update语句的WHERE子句中仅包含该表的主键。

我不知道这是否有任何作用,但:

我终于发现了我的问题,这是 与一致性毫无关系,我 通过测试发现问题 SQL Server数据库上的代码,它是 给我另一个错误信息,所以 然后我发现也许MS Access 他的错误是错误的,而 问题是别的

此外,您还有前面提到的:

MySqlCommandBuilder组成 使用其中的col=?1和 col=?2。。。在FLOAT列中,您将 用这种方法永远找不到确切的值

它可以完美地扩展到双值。。。问题似乎是更新尝试查找要更新的值时出现错误消息的组合


您是否可以尝试在不实际更新任何内容的情况下运行update命令?也就是说,不要进行实际的更新,而是删除除update命令之外的所有代码,使factura对象完全相同,然后查看是否有效。

您使用的是MyISAM还是InnoDB?在您的表适配器更新行之后,是否有更新行的内容?像触发器一样?使用FLOAT/DOUBLE作为货币值是大错特错的,因为舍入错误,你会在这里或那里损失/获得金钱。你应该使用十进制。请参见第1排和第1排中的暗箱操作,以及第2排和第2排中的主要部件的销售,请参见第1排中的销售错误!!!有没有可能第一次没有更改该行?没有,我检查了,该行确实得到了更新,实际上没有理由也不可能将同一行传递两次,但错误仍然与我有关