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がロードするために少し時間を取っているが、いずれかが存在する場合接続エラー 。エラー・メッセージが最初に表示され、次にウィンドウがロードされるメッセージ・ボックスに対して「OK」をクリックすると表示されます。

このエラーを取り除きたいです。ウィンドウが完全にロードされた直後にデータベースに接続し、ステータスバーの進行状況バーに接続プロセスを知らせたいとします。

スレッドまたはバックグラウンドのワーカーまたはカスタムイベントハンドラを使用する必要があるオプションは何ですか?

答えて

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; 
    } 

} 

のような方法で、すべてのものを行うと:あなたはこの記事からいくつかの良い例を見つけることができますバックグラウンドで読み込まれ、ページも読み込まれます。

1

データベース接続コードを別のスレッドで実行する必要があります(BackgroundWorkerはスレッド処理より優れたアプローチですが、私の意見です)、スレッド内ではステータスバーなどのUI要素を更新するディスパッチャを使用します。

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

0

Firsすべてのうち

1-なぜウィンドウロードで接続を確立しますか?私の推測でうまくいくようなこの制約を取り除くことができれば、ウィンドウロードの中にいくつかのデータが入るかもしれないので、ViewModelを使ってデータをバインドし、データをバインドするためにBindingフレームワークを使うよりも、

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

関連する問題