2016-08-25 3 views
0

Visual Studio 2015를 통해 Microsoft Access 데이터베이스의 테이블에 행을 삽입하려고합니다.Visual Studio에서 C#을 사용하여 Microsoft Access 데이터베이스, 삽입, 업데이트 및 삭제

시나리오는 다음과 같습니다. QuestionData 클래스와 Question 클래스입니다. 테이블 exams 및 테이블 questions.

public static bool addQuestion(QuestionData quesData) 
    { 
     if (quesData == null || quesData.question == null) { return false; } 
     List<QuestionData> questionsData = new List<QuestionData>(); 

     string connetionString = null; 
     OleDbConnection cnn; 
     connetionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=database.mdb;"; 
     cnn = new OleDbConnection(connetionString); 
     try 
     { 
      string insertCmd = "INSERT INTO questions (exam_id, [name], question_text, withImage, question_correctAnswer, answer_1, answer_2, answer_3, answer_4) VALUES (@exam_id, @name, @question_text, @withImage, @question_correctAnswer, @answer_1, @answer_2, @answer_3, @answer_4)"; 
      OleDbCommand cmd = new OleDbCommand(insertCmd); 

      cmd.Parameters.Add("@exam_id", OleDbType.Numeric).Value = quesData.examId; 
      cmd.Parameters.Add("@name", OleDbType.LongVarChar).Value = quesData.question.getName(); 
      cmd.Parameters.Add("@questionText", OleDbType.LongVarChar).Value = quesData.question.getQuestionText(); 
      cmd.Parameters.Add("@withImage", OleDbType.Boolean).Value = quesData.question.isImageEnabled(); 
      cmd.Parameters.Add("@question_CorrectAnswer", OleDbType.Numeric).Value = quesData.question.getCorrectAnswer(); 
      cmd.Parameters.Add("@answer_1", OleDbType.LongVarChar).Value = quesData.question.getAnswer(0); 
      cmd.Parameters.Add("@answer_2", OleDbType.LongVarChar).Value = quesData.question.getAnswer(1); 
      cmd.Parameters.Add("@answer_3", OleDbType.LongVarChar).Value = quesData.question.getAnswer(2); 
      cmd.Parameters.Add("@answer_4", OleDbType.LongVarChar).Value = quesData.question.getAnswer(3); 

      cmd.Connection = cnn; 
      cnn.Open(); 
      int result = cmd.ExecuteNonQuery(); 
      cnn.Close(); 

      return true; 
     } 

     catch (Exception ex) 
     { 
      MessageBox.Show("Exception: \n Source: " + ex.Source + "\n Message: " + ex.Message); 
      cnn.Close(); 
      return false; 
     } 
    } 

모든없이 컴파일와 함께 잘 작동 또는 런타임 오류 및 cmd.ExcuteNonQuery(); 라인은 양의 값 (1)을 반환하지만 아무것도 데이터베이스 파일에 발생하지 :

내 코드입니다. 그러나 Read Query은 잘 작동하고 그 일을합니다.

나는 Google을 검색하여 인터넷에서 모든 단일 솔루션을 시도했지만 아무 결과도 변경되지 않았습니다.

문제를 해결하는 데 도움이되는 정보와 가이드를 보내 주시면 감사하겠습니다.

+0

변화량 exam_id], [이름], [QUESTION_TEXT], [withImage], [question_correctAnswer], [ANSWER_1], [ANSWER_2], [ANSWER_3 ], [answer_4]) –

+0

올바른 'database.mdb' 파일을보고 계십니까? 응용 프로그램이 변경 사항을 확인하는 파일이 아닌 다른 파일에 쓰고 있다고 생각됩니다. 모호성을 없애려면 full 연결 문자열에있는 경로 – sstan

+0

@sstan 나는 모든 기능에 동일한 연결 문자열을 사용하고 있기 때문에 그렇게 생각하지 않습니다. 하나를 선택하고 Access 소프트웨어를 통해 디버그 폴더에서 데이터베이스를 편집하면 작동합니다. 다른 함수를 읽는 중입니다. 그래서 나는 단지 하나의 데이터베이스라고 생각합니다. 내가 놓친 것은 무엇입니까? –

답변

0

액세스 권한이있는 매개 변수는 "?"로 표시되어야합니다. 그들은

에 한번 교체 이름 그러나 그들은 (가짜 이름이 여전히 :-)를 필요) 매개 변수 컬렉션에 추가 된 순서를 사용하지 않는

string insertCmd = "INSERT INTO questions (exam_id, [name], question_text, withImage, question_correctAnswer, answer_1, answer_2, answer_3, answer_4) VALUES (@exam_id, @name, @question_text, @withImage, @question_correctAnswer, @answer_1, @answer_2, @answer_3, @answer_4)"; 

string insertCmd = "INSERT INTO questions (exam_id, [name], question_text, withImage, question_correctAnswer, answer_1, answer_2, answer_3, answer_4) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)"; 

고정 경로를 사용하여 올바른 파일에 연결하고 있는지 확인하십시오. 혼란 스러울 수 있습니다.

Connection 개체에 using 키워드를 사용하는 것이 더 좋기 때문에 using 문을 사용할 때 정상적으로 작동하고 예외가 발생하면 제대로 닫힙니다. 이 요점은 좋은 습관 일 뿐이며, 귀하의 경우에는 오류의 원인이 아닙니다. 이 문자열 등 첫 부분 insertCmd = "(질문 삽입 반

using cnn = new OleDbConnection(connetionString) 
{ 
    cnn.open 
    //Query the DB 
} 
+0

죄송합니다. 그러나 작동하지 않습니다. 액세스 소프트웨어와 함께 실행할 때마다 권한을 요청하기 때문에 권한과 관련이 있습니다. –

+0

자, 이제 표준 데이터베이스 디버그 프로세스를 시작해 보겠습니다. 먼저 Access (테스트 데이터 포함)에 삽입 쿼리를 작성하고 실행 한 다음이 쿼리를 응용 프로그램에 복사하고 동일한 테스트 데이터로 실행 해보십시오. 당신이 잘할 때 쿼리를 동적으로 적용 할 수 있습니다 (먼저 오래된 문자열을 연결 한 다음 매개 변수를 사용). –

+0

그것도 비주얼 스튜디오를 위해 일하지 않았다, 나는 INSERT INTO 질문 (exam_id, 이름, question_text, withImage, question_correctAnswer, answer_1, answer_2, answer_3, answer_4) VALUE ('1', '2' A, 1, 3, B, C, D, E); 그리고 매개 변수 블록을 추가하고 여전히 동일한 결과를 주석으로 달았습니다! –