在加载窗口时连接到数据库

时间:2010-12-28 11:14:07

标签: c# wpf

我正在尝试在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在完全加载后连接到数据库,并且我想通知状态栏中进度条中的连接进程。

如果我使用线程或后台工作程序或自定义事件处理程序,可用的选项是什么?

4 个答案:

答案 0 :(得分:1)

你需要在一个单独的线程中运行数据库连接代码(BackgroundWorker是比Threading更好的方法,但这只是我的意见),并且在线程使用调度程序中更新UI元素(如状态栏等)。你可以在这篇文章中找到一些很好的例子:

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

答案 1 :(得分:0)

之类的方法完成所有事情
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;
    }

}

现在在页面加载事件

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

这将加载到背景中,您的页面也会加载..

答案 2 :(得分:0)

首先

1-为什么要在窗口加载中建立连接?如果你可以删除这个我认为很好的约束,你会在窗口加载中填充一些数据,所以我认为你会有一些控制器或ViewModel而不是使用ViewModel来填充数据并使用Binding框架来绑定数据。 / p>

2-如果点1不可行您可以使用BackgroundWorker委派任务,它支持报告进度和所有。

答案 3 :(得分: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;
            }));
        }
    }));
}