2016-10-14 2 views
0

WPF 프로젝트로 C# 코드를 작성하고 있습니다. 컴퓨터에서 Microsoft Access 데이터베이스에서 하나의 항목을 선택하는 곳에 ComboBox1 드롭 다운이 있습니다. 사용자가 무언가를 선택한 직후 사용자가 방금 선택한 텍스트 블록으로 이동 한 것과 같은 행에서 특정 값을 검색하려고합니다.WPF를 사용하여 성공적으로 연결 한 후 Access 데이터베이스에서 데이터를 가져올 수 없습니다.

모두 같고 ""이라는 오류가 발생했습니다. '연결'이름이 현재 컨텍스트에 존재하지 않습니다.. " 이 문제를 해결하는 방법을 모르겠습니다.

OleDbConnection connect = new OleDbConnection(); 

그러나 ComboBox1_SelectedIndexChanged에 그렇게하지 : MainWindow_Load에서

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Data; 
using System.Windows.Documents; 
using System.Windows.Input; 
using System.Windows.Media; 
using System.Windows.Media.Imaging; 
using System.Windows.Navigation; 
using System.Windows.Shapes; 
using System.Data.OleDb; 
using System.Data.SqlClient; 
using System.Data; 
using System.ComponentModel; 

namespace bundlecalc 
{ 

    public partial class MainWindow : Window 
    { 
     public MainWindow() 
     { 
      InitializeComponent(); 
      MainWindow_Load(); 
     } 

     private void MainWindow_Load() 
     { 
      OleDbConnection connect = new OleDbConnection(); 
      connect.ConnectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Projects\Database.accdb; 
      Persist Security Info = False; "; 
      connect.Open(); 

      OleDbCommand command = new OleDbCommand(); 
      command.Connection = connect; 
      command.CommandText = "SELECT Column1 FROM Table1"; 

      OleDbDataReader reader = command.ExecuteReader(); 

      while(reader.Read()) 
      { 
       ComboBox1.Items.Add(reader["Column1"].ToString()); 
      } 
      connect.Close(); 

     } 

     private void ComboBox1_SelectedIndexChanged(object sender, RoutedEventArgs e) 
     { 
      connect.Open(); 

      OleDbCommand command = new OleDbCommand(); 
      command.Connection = connect; 
      string query = "select * from Table1 where Column1 ='" + ComboBox1.Text + "'"; 
      command.CommandText = query; 

      OleDbDataReader reader = command.ExecuteReader(); 

      while (reader.Read()) 
      { 
       BetaAnswer.Text = reader["ValueFromRow"].ToString(); 
      } 

      connect.Close(); 
     } 
    } 
} 
+0

declare connect as class member –

+0

@viveknuna : 나쁜 생각. 오래 지속되는 클래스에서 열린 연결 오브젝트를 유지하는 것은 단지 오류를 묻는 것입니다. – David

답변

5

당신은 connect 변수를 선언합니다. 그 방법으로 간단하게 선언하십시오.

데이터베이스 연결과 같은 일회용 리소스에 대해서는 using 블록을 살펴볼 수도 있습니다. 같은 뭔가 :

using (OleDbConnection connect = new OleDbConnection()) 
{ 
    // use the connection 
} 

(당신 하지 이것은 유명 나쁜 생각 클래스의 모든 의해 다시 사용할 수있는 connect 변수 클래스 수준의 구성원으로 수행 유혹 될 수 있습니다... 데이터베이스 연결은 아주 작은 범위에서 생성, 사용 및 소멸되어야하며, 연결 풀은 재사용을 처리합니다. 재사용을 처리하려고하면 문제가 발생할 수 있습니다.)

+1

OP는 ad hoc SQL 문을 연결해서 사용하지 말고 사용자 인터페이스 컨트롤을 사용해서는 안됩니다. 매개 변수가있는 쿼리 또는 저장 프로 시저를 사용하십시오. – rick

관련 문제