2014-07-23 2 views
1

Visual Studio 2010을 사용하여 C#에서 Win Form을 만듭니다. 소수의 Comboboxes와 사용자가 입력하고 Access DB에 제출할 수있는 텍스트 상자가 있습니다. 내 문제는 기존 항목을 업데이트하려고 할 때 발생합니다. 기존 항목을로드하고 변경 한 후 업데이트를 클릭합니다. 시스템 오류가 발생하지 않아 DB에 대한 연결이 성공적이지만 데이터에 실제로 변경이 없습니다. 완전히 빠진 것이 있습니까? 도움이나 통찰력에 미리 감사드립니다. 여기 기존 데이터베이스 항목 업데이트 C# VS2010

업데이트 버튼에 대한 코드입니다 :

private void updateButton_Click_1(object sender, EventArgs e) 
    { 
     { 

     OleDbConnection conn = new OleDbConnection(); 
     conn.ConnectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\servicereq1.mdb"; 

     OleDbCommand cmd = new OleDbCommand("UPDATE servicereq SET DateLogged = @datelogged, LoggedBy = @loggedby, Function = @function, [Other Impacts] = @summary, Account = @earningsaccount, [From] = @from, [To] = @to, Description = @description, Fixer = @fixer, [Time Estimate] = @timeestimate, [Actual Start] = @actualstart, [Actual Finish] = @actualfinish, [Actual Time] = @actualtime, [Programs/Forms] = @programsforms, Comments = @comments, [Retest Date] = @requestdate, Tester = @tester, Status = @status, [Problem In Environment] = @problemfoundin, [Code In Environment] = @codein WHERE (ServiceRequestNumber = @servreq)"); 
     cmd.Connection = conn; 

     conn.Open(); 

     if (conn.State == ConnectionState.Open) 
     { 
      cmd.Parameters.AddWithValue("@servreq", serviceRequestNumberTextBox.Text);     
      cmd.Parameters.AddWithValue("@datelogged", dateLoggedTextBox.Text);     
      cmd.Parameters.AddWithValue("@loggedby", loggedByComboBox.Text);     
      cmd.Parameters.AddWithValue("@problemfoundin", problem_In_EnvironmentComboBox.Text);     
      cmd.Parameters.AddWithValue("@function", functionTextBox.Text);    
      cmd.Parameters.AddWithValue("@summary", other_ImpactsTextBox.Text);     
      cmd.Parameters.AddWithValue("@earningsaccount", accountTextBox.Text);     
      cmd.Parameters.AddWithValue("@from", fromTextBox.Text);    
      cmd.Parameters.AddWithValue("@to", toTextBox.Text);     
      cmd.Parameters.AddWithValue("@status", statusComboBox.Text);    
      cmd.Parameters.AddWithValue("@description", descriptionTextBox.Text);     
      cmd.Parameters.AddWithValue("@fixer", fixerComboBox.Text);    
      cmd.Parameters.AddWithValue("@codein", code_In_EnvironmentComboBox.Text);    
      cmd.Parameters.AddWithValue("@programsforms", programs_FormsTextBox.Text); 
      cmd.Parameters.AddWithValue("@timeestimate", time_EstimateTextBox.Text);    
      cmd.Parameters.AddWithValue("@actualstart", actual_StartTextBox.Text);    
      cmd.Parameters.AddWithValue("@actualfinish", actual_FinishTextBox.Text);     
      cmd.Parameters.AddWithValue("@actualtime", actual_TimeTextBox.Text);     
      cmd.Parameters.AddWithValue("@requestdate", retest_DateTextBox.Text);     
      cmd.Parameters.AddWithValue("@tester", testerComboBox.Text);     
      cmd.Parameters.AddWithValue("@comments", commentsTextBox.Text);    
      try 
      { 
       cmd.ExecuteNonQuery(); 
       MessageBox.Show("Form Updated Successfully"); 
       conn.Close(); 
      } 
      catch (OleDbException ex) 
      { 
       MessageBox.Show(ex.Message); 
       conn.Close(); 
      } 
     } 
     else 
     { 
      MessageBox.Show("Connection Failed"); 
     } 
     } 
    } 
+0

그리고 공백이있는 열 머리글을 사용하는 것이 잘못 설정된 것을 알고 있습니다. 나는이 테이블을 다른 누군가에게 물려 받았고, 나는 그들을 변경하지 말 것을 요청 받았다 :-( – AndrewD

+1

SQL 문에서 변수를 사용하는 이유가 있습니까? 일반적으로 SQL을 제거하기 위해 저장 프로 시저를 호출하기 때문에 parameters.AddWithValue()를 사용합니다. – DotN3TDev

+0

나는 그것을 바꿔서 더 나은 운임을 볼 것입니다. – AndrewD

답변

0

을 조금 더 시간이 편집을 지출하고 주위에 코드를 이동 한 후, 당신의 매개 변수들이 같이 쿼리에 같은 순서로해야한다는 사실에 발견 값을 바인딩 할 때입니다. JoFlash Studios에 의해 제안 된 구문 변경을 수행하고 내 매개 변수를 올바른 순서로 배치 한 후에는 양식의 기존 데이터를 편집 할 수있었습니다.

+0

Ah - 분명히 SQL Server에서 너무 많은 작업을했습니다. 표준 [OleDb 동작]처럼 보입니다 (http://stackoverflow.com/questions/1476770/oledbcommand-parameters-order-and-priority). –

2

당신은 따옴표로 데이터베이스 매개 변수를 넣으면 안됩니다 - 그들은 일반 텍스트 대신 매개 변수 당신이 할 경우로 평가된다. ServiceRequestNumber가 리터럴 문자열 '@servreq'와 같은 행이 없으므로 아무 것도 업데이트되지 않습니다.

또한 DataCommands는 로컬 변수를 매개 변수로 사용하지 않으므로 DataCommand 개체 (이 경우 cmd)에 명시 적으로 추가해야합니다. 매개 변수 추가 코드를 제거 할 때 오류가 발생하지 않는 이유는 위에서 설명한 것처럼 쿼리가 매개 변수를 필요로하지 않기 때문입니다.

또한 제거한 코드에서 매개 변수를 추가하는 방법은 가장 이상하다고 말하면 이상합니다. 이 읽고 훨씬 더 정상, 상당히 쉽게 :

cmd.Paramaters.AddWithValue("@paramName", paramData); 
//or 
cmd.Parameters.Add(new OleDbParameter("@paramName", paramData)); 
+1

cmd.Parameters.Add가 무시되므로 cmd.Parameters.AddWithValue를 사용하는 것이 더 좋습니다. – DotN3TDev

+0

Add (String, Object)는 더 이상 사용되지 않습니다 (프레임 워크의 현재 버전에도 존재하지 않습니다.),하지만 Add (SqlParameter)를 사용해도 좋습니다. [documentation] (http://msdn.microsoft.com/en-us/library/system.data.oledb.oledbparametercollection.add (v = vs.110) .aspx). –

+0

add (String, object)는 여전히 4.5입니다. 2.0에서 4.5까지 많은 소프트웨어를 업데이트하고 있으며 더 이상 사용되지 않을 것이라는 경고를줍니다. 당신이 보라고 말한 동일한 문서는 당신에게 그것을 보여줍니다. – DotN3TDev

관련 문제