2010-12-28 2 views
0

WPF C#에서 SQL CE 3.5SP2를 사용하여 데이터베이스 연결을 설정하려고합니다.로드 된 창으로 데이터베이스에 연결

Windows가로드되는 즉시 연결하고 싶습니다. 그래서 Windows_loaded 이벤트 및 연결을 선택했습니다. 다음과 같은 코드.

private void Window_Loaded(object sender, RoutedEventArgs e) 
{ 
    SqlCeConnection con = new 

    SqlCeConnection("Data Source=|DataDirectory|\\Master.sdf"); 

    try 
    { 
     con.Open(); 

     MessageBox.Show("Database Connection Established"); 
    } 
    catch (Exception) 
    { 
     MessageBox.Show("Database Connection Failed"); 
     throw; 
    } 
} 

내 문제는 : Windows가로드 시간이 조금 걸리는

이 연결이 설정 문제가되지 않습니다 있지만이 경우 (처음 데이터베이스에 연결 한 다음 창을로드 할 수있다) 연결 오류 . 오류 메시지가 먼저 표시되고 Windows가로드되는 메시지 상자에서 확인을 클릭하면됩니다.

이 오류를 제거하고 싶습니다. 하지만 완전히로드 된 후 데이터베이스에 연결하는 창을 원하는 상태 표시 줄의 진행률 표시 줄에 연결 프로세스를 알리고 싶습니다.

스레딩 또는 배경 작업자 또는 사용자 지정 이벤트 처리기를 사용해야하는 옵션은 무엇입니까?

답변

0

페이지로드 이벤트

App.current.Dispatcher.beginInvoke(dispatcherPriority.Backround , new action(adddatasource)); 

이 의지 지금

public void Adddatasource() 
{ 
SqlCeConnection con = new 

    SqlCeConnection("Data Source=|DataDirectory|\\Master.sdf"); 

    try 
    { 
     con.Open(); 

     MessageBox.Show("Database Connection Established"); 
    } 
    catch (Exception) 
    { 
     MessageBox.Show("Database Connection Failed"); 
     throw; 
    } 

} 

같은 방법으로 모든 물건을하고 : 당신은이 문서에서 몇 가지 좋은 예를 찾을 수 있습니다 backgound에로드하면 페이지가로드됩니다.

1

데이터베이스 연결 코드를 별도의 스레드에서 실행해야합니다 (BackgroundWorker는 스레딩보다 나은 접근 방법이지만 내 생각에만 해당). 스레드 내에서 디스패처를 사용하여 UI 요소 (예 : 상태 표시 줄 등)를 업데이트합니다.

http://msdn.microsoft.com/en-us/magazine/cc163328.aspx

0

Firs t 중 모두

1- 왜 창로드에 연결을 설정 하시겠습니까? 내 추측에 위대 할 수있는이 제약 조건을 제거 할 수 있다면 윈도우로드에서 일부 데이터를 채울 수 있습니다. 따라서 ViewModel을 사용하여 데이터를 채우고 바인딩 프레임 워크를 사용하여 데이터를 바인딩하는 것보다 컨트롤러 나 ViewModel을 사용할 수 있다고 생각합니다.

2- 포인트 1을 사용할 수없는 경우 BackgroundWorker를 사용하여 작업을 위임 할 수있는 경우 보고서 진행 상태와 모두를 지원합니다. 작업을해야 다음과 같은

+0

는 내가 그것을 작동하고 백그라운드 작업자를 시도했다. – Panindra

0

뭔가 :

private void Window_Loaded(object sender, RoutedEventArgs e) 
{ 
    SqlCeConnection con = new SqlCeConnection("Data Source=|DataDirectory|\\Master.sdf"); 

    ThreadPool.QueueUserWorkItem(new WaitCallback((obj) => 
    { 
     Dispatcher.Invoke(new Action(() => 
     { 
      this.IsEnabled = false; 
     }));    

     try 
     { 
      con.Open(); 

      Dispatcher.Invoke(new Action(() => 
      { 
       MessageBox.Show("Database Connection Established"); 
      })); 
     } 
     catch (Exception) 
     { 
      Dispatcher.Invoke(new Action(() => 
      { 
       MessageBox.Show("Database Connection Failed"); 
      })); 
      throw; 
     } 
     finally 
     { 
      Dispatcher.Invoke(new Action(() => 
      { 
       this.IsEnabled = true; 
      })); 
     } 
    })); 
} 
+0

이 오류가 발생했지만 다음과 같이 오류가 발생합니다. InvalidOperationExexption. "this.IsEnabled = false;"를 가리키고 있습니다. - 다른 스레드가 스레드를 소유하고 있기 때문에 호출 스레드가이 객체에 액세스 할 수 없습니다. – Panindra

+0

코드가 업데이트되었습니다. – decyclone