2010-01-05 2 views
0

HI Я получаю сообщение об ошибке «Параллельное нарушение, на которое команда update повлияла на 0 ожидаемых 1 записей». ошибка при попытке обновить строку, странно, что я МОЖЕТ обновлять строку один раз, и в следующий раз я повторяю процесс в той же строке, я получаю ошибку, я уже пробовал endinit и endit thingys, любую помощь будет оценена!Параллелизм Ошибка обновления строки во второй раз C#

Я использую 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...... 
+0

отправьте код – CSharpAtl

+0

Вы используете MyISAM или InnoDB? – CSharpAtl

+0

Есть ли что-то, что обновляет строку после обновления адаптера таблицы?Как триггер? – mlsteeves

ответ

1

Я не знаю, если это будет иметь ничего общего, кроме:

Я, наконец нашел мою проблему, это не связано с concurency вообще, я уже нашел проблему тестируя тот же код в базе данных SQL Server, это было , давая мне еще одно сообщение об ошибке, поэтому , тогда я выясню, что, возможно, MS Access был не прав, его проблема была и проблема была чем-то еще!

Кроме того у вас есть FLOAT issue упоминалось ранее:?

MySqlCommandBuilder сочиняет команду UPDATE с помощью WHERE COL = 1 и седловины = 2 ... В FLOAT колонках вы будете никогда найти точное значение таким образом.

, который прекрасно может быть расширена до двузначных значений ... проблема, как представляется, сочетание неправильного сообщения об ошибке, когда обновление пытается найти значение для обновления

Могли бы вы попробуйте запустить команду обновления ничего не обновляя? То есть вместо фактического обновления удалите весь код, кроме команды Update, чтобы объект factura был точно таким же и посмотрел, работает ли это.

+0

lo obscuro del asunto es que agarro por decir el row 1 y lo paso por el codigo y la primera vez продажа todo bien, despues al correrlo de nuevo con el renglon 1 продажа el ошибка !!! – Luiscencio

+0

Есть ли возможность, что строка не меняется в первый раз? –

+0

nope, я проверил, и строка действительно обновляется, на самом деле нет причины (и возможности) пройти одну и ту же строку дважды, но ошибка по-прежнему касается меня – Luiscencio

0

Я не уверен, что если вы используете float типы данных в базе данных, но эта статья может быть то, что происходит с вами: MySql - Float Issue

+0

Я не использую поплавковые столбцы, они все DOUBLE, спасибо – Luiscencio

+2

Использование FLOAT/DOUBLE для денежных значений является массово неправильным --- вы потеряете/получите деньги здесь и там из-за ошибок округления. Вы должны использовать DECIMAL. См. Http://stackoverflow.com/questions/1930247/does-money-map-to-float-well –

+0

@Alex Brasetvik - спасибо за совет – Luiscencio

0

Что является SQL за idjAdapter.Update() и как он был сгенерирован? Вы использовали конструктор drag/drop в Visual Studio? Если вы это сделали, вам нужно будет проверить автоматически сгенерированный скрипт обновления? По моему опыту с кодом дизайнера в мире MS SQL он часто будет включать очень сложный оператор WHERE, где он обновляется только в том случае, если все старые старые строки строки все еще существуют.

Если в вашей таблице содержится автоматически созданное поле метки времени или что-то подобное, тогда вы можете столкнуться с проблемами с двумя пользователями, где это поле может обновляться за вашей спиной, и поэтому ГДЕ в обновлении не удастся , в результате чего это исключение параллелизма будет выбрано адаптером.

Затем вам необходимо решить, как справиться с проблемой. Если вы просто хотите иметь последнюю в выигрыше логику, вам нужно вручную изменить Update SQL в дизайнере (из окна свойств конструктора для этого адаптера таблицы), чтобы включить только ваш первичный ключ для таблицы в предложении WHERE инструкции Update.

Смежные вопросы