2010-12-28 2 views
0

Ich versuche, Datenbankverbindung mit SQL CE 3.5SP2 in WPF C# herzustellen.Verbindung mit der Datenbank als das geladene Fenster

Ich möchte eine Verbindung herstellen, sobald Windows geladen wird. Also habe ich Windows_loaded und die Verbindung ausgewählt. der Code wie folgt.

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

Mein Problem ist: Windows bisschen Zeit nimmt zu laden (kann es zuerst Datenbank verbindet und laden Sie dann das Fenster)

es ist nicht Problem, wenn die Verbindung hergestellt ist, aber wenn es irgendeine Verbindungsfehler . Die Fehlermeldung wird zuerst angezeigt, wenn Sie auf OK klicken, um das Fenster zu laden.

Ich möchte diesen Fehler beseitigen. aber wollen, dass windows mit der datenbank verbinden, sobald es voll geladen ist, und ich möchte die verbindungsprozess in progress bar in der statusleiste informieren.

Welche Option ist verfügbar, sollte ich Threading oder Background Worker oder einen benutzerdefinierten Event-Handler verwenden?

Antwort

0

alle deine Sachen in einem Verfahren wie

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

} 

und jetzt in der Seitenladeereignis

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

dieser Wille laden in backgound und Ihre Seite wird auch geladen ..

1

Sie müssen Datenbankverbindungscode in einem separaten Thread ausführen (BackgroundWorker ist besser Ansatz über Threading, aber es ist nur meine Meinung) und innerhalb Thread verwenden Dispatcher UI-Elemente (wie Statusleiste usw.) zu aktualisieren. Sie können einige gute Beispiele aus diesem Artikel finden:

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

0

Firs t aller

1- Warum möchten Sie eine Verbindung in Fensterladen herstellen? Wenn Sie diese Einschränkung entfernen können, die in meiner Annahme groß wäre, werden Sie einige Daten im Fenster laden, so dass ich denke, Sie hätten einen Controller oder ViewModel als ViewModel verwenden, um die Daten zu füllen und Binding-Framework zu verwenden, um die Daten zu binden.

2- Wenn Punkt 1 nicht möglich ist, als Sie BackgroundWorker verwenden können, um die Aufgabe zu delegieren, unterstützt es den Fortschritt des Berichts und alle.

+0

Ich habe versucht Hintergrund Arbeiter es funktioniert. – Panindra

0

So etwas wie folgt funktionieren sollte:

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

Ich habe dies versucht, bekomme aber einen Fehler wie folgt: InvalidOperationExexption. Zeigen auf "this.IsEnabled = false;" - Der aufrufende Thread kann nicht auf dieses Objekt zugreifen, da ein anderer Thread es besitzt. – Panindra

+0

Der Code wurde aktualisiert. – decyclone

Verwandte Themen