2010-01-05 8 views
0

안녕하세요. "동시성 위반 updatecommand가 예상 한 1 개의 레코드 중 0 개에 영향을줍니다." 오류 행을 업데이 트하는 동안 이상한 일은 행을 한 번에 업데이트 할 수 있다는 것과 다음 번에 동일한 행에 대한 프로세스를 반복합니다. 오류을 얻었습니다. 이미 endinit 및 tryit thingys를 테스트했습니다. 감사하겠습니다!동시성 행을 두 번째로 업데이트하는 중 오류가 발생했습니다. C#

나는 C# 및 MySQL의 이노을 사용하고

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가 WHERE COL = 1 AND COL = 2를 사용하여 UPDATE 명령을 구성 FLOAT 열에서 ... 당신거야 결코 이 방법으로 정확한 값을 찾으십시오. 업데이트가

가 업데이트 명령을 실행하려고 할 수 업데이트 할 값을 찾기 위해 시도 할 때 완벽하게 두 배 값으로 확장 할 수

는 ... 문제는 잘못된 오류 메시지의 조합이 될 것 같다 실제로 아무것도 업데이트하지 않고? 즉, 실제 업데이트를 수행하는 대신 Update 명령을 제외한 모든 코드를 제거하여 factura 객체가 정확히 동일하게 작동하는지 확인합니다.

+0

안녕하세요, 감사합니다. 판매 중 판매 중 오류가 발생했습니다. 판매 중 오류가 발생했습니다. 판매 중 오류가 발생했습니다. – Luiscencio

+0

행이 처음으로 변경되지 않을 가능성이 있습니까? –

+0

아니, 내가 확인하고 행을 업데이 트 사실, 거기에 아무 이유도 (또는 posibility) 두 번 같은 행을 통과하지만 오류가 여전히 날 우려 – Luiscencio

0

당신이 당신의 데이터베이스에 float 데이터 형식을 사용하고 있는지 확실하지 않습니다,하지만이 문서에서는 무슨 일이 일어나고 될 일 : MySql - Float Issue

+0

float 열을 사용하지 않았습니다. 모두 double입니다. 덕분에 – Luiscencio

+2

FLOAT/DOUBLE을 금전적 값으로 사용하면 잘못되었습니다. 반올림 오류로 인해 여기저기서 돈을 잃거나 얻을 수 있습니다. DECIMAL을 사용해야합니다. 참조 @stackoverflow.com/questions/1930247/does-money-map-to-float-well –

+0

@Alex Brasetvik - 조언 주셔서 감사합니다. – Luiscencio

0

무엇 idjAdapter.Update() 뒤에있는 SQL이며 어떻게 생성 되었습니까? Visual Studio에서 드래그 앤 드롭 디자이너를 사용 했습니까? 그렇게했다면 자동 생성 된 업데이트 스크립트를 확인하고 싶습니까? MS SQL 세계에서 디자이너 코드를 사용한 경험으로는 행의 모든 ​​단일 필드가 여전히 존재하는 경우에만 업데이트하는 매우 복잡한 WHERE 문이 포함되는 경우가 많습니다.

테이블에 자동 생성 된 타임 스탬프 필드 또는 이와 유사한 것이 포함 된 경우이 필드가 등 뒤에서 업데이트 될 수있는 두 사용자의 문제가 발생할 수 있으므로 업데이트의 WHERE가 실패합니다 이 동시성 예외가 어댑터에 의해 발생됩니다.

그런 다음 문제를 처리하는 방법을 결정해야합니다. 마지막으로 승리 논리를 원할 경우 디자이너 (테이블 어댑터의 디자이너 속성 창에서)에서 SQL 업데이트를 수동으로 변경하여 테이블의 기본 키를 WHERE 절에 포함시켜야합니다. Update 문.

관련 문제