2017-12-07 8 views
0

ASP.NET 온라인 등록 양식을 MS Access 백엔드 데이터베이스에 연결하려고합니다. 사용하고있는 연결 코드는C# ExecuteNonQuery 오류 (My Access Web Form을 Access DB에 연결)

String connString; 
connString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Users\Z\Desktop\Comp\MyWebsite\WorkDatabase.mdb"; 
OleDbConnection myConnection = new OleDbConnection(connString); 
myConnection.Open(); 
string myQuery = "INSERT INTO Parent([Username], [FirstName], [Surname], [Email], [Mobile], [Postcode], [Password]) values('" + Usernametb.Text + "','" + Firsttnametb.Text + "','" + Surnametb.Text + "','" + Emailtb.Text + "','" + Mobiletb.Text + "','" + Postcodetb.Text + "','" + Passwordtb.Text + "')"; 
OleDbCommand myCommand = new OleDbCommand(myQuery, myConnection); 
myCommand.ExecuteNonQuery(); 
myConnection.Close(); 

try 
{ 
    using (myConnection) 
    { 
     myConnection.Open(); 
     myCommand.ExecuteNonQuery(); 
     SuccReglbl.Text = "successful registration"; 
    } 
} 
catch (Exception ex) 
{ 
    SuccReglbl.Text = "Exception in DBHandler" + ex; 
} 
finally 
{ 

} 

myCommand.ExecuteNonQuery(); 
OleDbDataReader myReader = myCommand.ExecuteReader(); 
while (myReader.Read()) 
{ 

} 
myConnection.Close(); 

"등록"버튼을 클릭하면 계속 오류가 발생합니다. 오류는

"ExecuteNonQuery에는 열려 있고 사용 가능한 연결이 필요합니다. 연결의 현재 상태가 닫혔습니다."

이 문제를 해결하는 방법을 잘 모르겠습니다.

+0

사용중인 블록에 'myConnection'을 넣으므로'finally' 블록 아래에서 명령을 실행할 때 닫힙니다. – Crowcoder

+0

@MethodMan 이에 대한 제안 사항이 있으십니까? – Zalgawi

+0

@Crowcoder를 사용하면 코드를 적용 할 수있는 방법을 보여줄 수 있습니까? 나는 아주 미숙하다. 죄송합니다. – Zalgawi

답변

0

첫 번째 쿼리를 실행 한 후 데이터베이스 연결을 종료합니다. 그러나 다음 try-catch 블록 다음에 다른 쿼리를 실행합니다. 그리고이 시점에서 연결이 끊겼습니다.

모든 쿼리가 실행 된 후에 만 ​​데이터베이스 연결을 닫는 것이 좋습니다. 이렇게하면 모든 단일 쿼리에 대해 새 연결이 필요하지 않습니다.

업데이트 :
내가 마지막 하나는 불필요한 사용하여 문을 제외한 모든 닫히고 '를 제거했습니다. 이 코드는 잘 작동합니다.

String connString; 
connString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Users\Z\Desktop\Comp\MyWebsite\WorkDatabase.mdb"; 
OleDbConnection myConnection = new OleDbConnection(connString); 
myConnection.Open(); 
string myQuery = "INSERT INTO Parent([Username], [FirstName], [Surname], [Email], [Mobile], [Postcode], [Password]) values('" + Usernametb.Text + "','" + Firsttnametb.Text + "','" + Surnametb.Text + "','" + Emailtb.Text + "','" + Mobiletb.Text + "','" + Postcodetb.Text + "','" + Passwordtb.Text + "')"; 
OleDbCommand myCommand = new OleDbCommand(myQuery, myConnection); 
myCommand.ExecuteNonQuery(); 

try 
{ 
    myCommand.ExecuteNonQuery(); 
    SuccReglbl.Text = "successful registration"; 
} 
catch (Exception ex) 
{ 
    SuccReglbl.Text = "Exception in DBHandler" + ex; 
} 
finally 
{ 

} 

myCommand.ExecuteNonQuery(); 
OleDbDataReader myReader = myCommand.ExecuteReader(); 
while (myReader.Read()) 
{ 

} 
myConnection.Close(); 
+0

첫 번째 연결 닫기 섹션을 제거하면 여전히 동일한 오류가 발생합니다. 오류가 줄 myCommand.ExecuteNonQuery(); – Zalgawi

+0

정확히 어디입니까? 왜냐하면'myCommand.ExecuteNonQuery();는 내가 볼 수있는 한 적어도 네 번 코드에서입니다. – Jerodev

0

데이터베이스 연결을 두 번 닫았습니다. 첫 번째 myConnection.Close()를 삭제하려고 시도합니다.

+0

첫 번째 연결 닫기 섹션을 제거 할 때 여전히 동일한 오류가 발생합니다. 그 줄에 오류가 있다고합니다. myCommand.ExecuteNonQuery(); – Zalgawi

+0

@ Zalgawi 왜냐하면'using' 블록에있는 연결은 그 연결을 폐기하고 닫을 것이기 때문입니다. 이 대답은 잘 생각하지 못했습니다. – Crowcoder

+0

어떻게 구조화해야하는지 알고 있습니까? 나는 자습서를 찾으려고 노력하고 있지만 성공적으로 가르 칠 수있는 곳을 찾을 수 없다. – Zalgawi

0

@Jerodev 내 코드의 최신 버전은 입니다. String connString; connString = @ "공급자 = Microsoft.Jet.OLEDB.4.0; 데이터 원본 = C : \ Users \ Z \ Desktop \ MyWebsite \ WorkDatabase.mdb";

 OleDbConnection myConnection = new 
      OleDbConnection(connString); 
     myConnection.Open(); 
     string myQuery = "INSERT INTO Parent([Username], [FirstName], [Surname], [Email], [Mobile], [Postcode], [Password]) values('" + Usernametb.Text + "','" + Firsttnametb.Text + "','" + Surnametb.Text + "','" + Emailtb.Text + "','" + Mobiletb.Text + "','" + Postcodetb.Text + "','" + Passwordtb.Text + "')"; 
     OleDbCommand myCommand = new OleDbCommand(myQuery, myConnection); 

     myCommand.ExecuteNonQuery(); 


     try 
     { 
      using (myConnection) 

      { 
       myCommand.ExecuteNonQuery(); 
       SuccReglbl.Text = "successful registration"; 
      } 
     } 
     catch (Exception ex) 
     { 
      SuccReglbl.Text = "Exception in DBHandler" + ex; 
     } 

     finally 
     { 
      myConnection.Close(); 
     } 

     OleDbDataReader myReader = myCommand.ExecuteReader(); 
     while (myReader.Read()) 
     { 
     } 

그것은 같은 오류를주고 있지만 오류가 라인에 말하는 "방법 OleDbDataReader myReader = myCommand.ExecuteReader();"

+0

@Jerodev이 메시지를 직접 회신으로 회신하지 못했습니다. – Zalgawi

0

귀하가하신 말씀에 따라 필요한 코드가 모두 있습니다.

사용자 입력을 쿼리에 직접 입력하기 때문에 코드가 SQL Injection에 취약합니다. 사용자는 데이터베이스를 소유하거나 매우 쉽게 파기 할 수 있습니다. See this for more information 및 연구 OleDbParameter.

+0

나는 이것을 사용해 보았는데 실제로 성공했습니다. . 하지만 이제 다시 시도 할 때 "DBHandler 오버플로 예외"또는 연결 경로가 잘못되었음을 나타내는 레지스터를 누르면 레이블에 오류가 계속 발생합니다. 이 문제를 일으키는 것에 대해 확신이 없습니다. – Zalgawi

+0

무엇이 잘못되었는지 추측 할 수 있으려면 더 많은 컨텍스트가 필요합니다 (예외 세부 정보 전체). 그것이 다른 이슈로 보이기 때문에 또 다른 질문의 가치가 있을지도 모른다. – Crowcoder

+0

내가 겪고있는 오류를 구조화하는 방법을 알고 있다면 나는 별도의 질문을 할 것이다. 지금 당장은 그것을 알아 내려고 노력할 것이지만, 만약 내가 할 수 없다면, 나는 다른 것을 요구할 것입니다. 나는 그것이 연결과 관련이 있다는 것을 확신합니다. – Zalgawi