2014-03-03 3 views
1

WPF에서 Access 데이터베이스의 값을 textBox로 가져 오려고합니다. 테이블 이름은 Member이고 열 이름은 MemberID입니다. 다음 코드를 시도했지만 "OleDbDataReader reader = command.ExecuteReader();"예외가 발생했습니다.AccesDB 값을 텍스트 상자

예외는 : 입력 'System.Data.OleDb.OleDbException'처리되지 않은 예외가 system.data.dll 발생. 추가 정보 : 조건 식의 데이터 형식이 일치하지 않습니다.

코드 :

private void showInfoBtn_Click(object sender, RoutedEventArgs e) 
    { 
     int index = 1; 

     string connection = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:/Users/Cvenko/Desktop/Library.accdb"; 

     using (OleDbConnection conn = new OleDbConnection(connection)) 
     { 
      conn.Open(); 

      OleDbCommand command = new OleDbCommand("SELECT FirstName FROM Member WHERE MemberID = '" + index + "'", conn); 
      OleDbDataAdapter adapter = new OleDbDataAdapter(command); 

      AddMember m = new AddMember(); 
      m.Show(); 

      OleDbDataReader reader = command.ExecuteReader(); 
      if (reader.HasRows) 
      { 
       reader.Read(); 
       m.nameTxt.Text = reader.GetString(1); 
      } 

      conn.Close(); 
      command.Dispose(); 
      adapter.Dispose(); 
     } 
    } 
+0

'회원 ID'열의 유형은 무엇입니까? 나는 그것이 성격이 아닌 것 같아요. –

답변

3

나는 당신이 따옴표를 사용해서는 안 MEMBERID 텍스트는 것을 매우 의심 :

@Remou 이미 언급 한 바와 같이
"SELECT FirstName FROM Member WHERE MemberID = " + index 
+0

그것은 내가 필요로했던 excatly이었다. 고마워요, 지금 일하고 있습니다. – cvenko

2

, MemberID는 숫자와 끈이 아니야. SQL 명령을 빌드하기 위해 문자열 연결을 사용하고 있습니다. 대신 명령 매개 변수를 사용하십시오. 또한 첫 번째 행의 첫 번째 열만 반환하므로 ExecuteScalar을 사용할 수 있습니다. 그것은 정확히 이것을합니다. 명령 매개 변수의

var command = new OleDbCommand("SELECT FirstName FROM Member WHERE MemberID = @1", 
           conn); 
command.Parameters.AddWithValue("@1", index); 
string firstName = (string)command.ExecuteScalar(); 
if (fistName != null) { 
    m.nameTxt.Text = firstName; 
} 

장점은 다음과 같습니다

  • 당신은 SQL에서 리터럴로 값의 오른쪽 표현에 대해 걱정 할 필요가 없습니다. (날짜 값에 특히 유용합니다.) SQL injection 공격을 방지합니다.

  • 당신은 SQL 문자열 구분 기호, 줄 바꿈 및 기타 기묘를 포함하는 텍스트 걱정하지 않아도 긴 문자열 회씩 연결

  • 보다 읽기 일반적으로 쉽게.

-

또한 사용되지 않은 OleDbDataAdapter을 만들 수 있습니다. 그거 떨어 뜨려.

관련 문제