我正在尝试在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 :(得分:1)
你需要在一个单独的线程中运行数据库连接代码(BackgroundWorker是比Threading更好的方法,但这只是我的意见),并且在线程使用调度程序中更新UI元素(如状态栏等)。你可以在这篇文章中找到一些很好的例子:
答案 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;
}));
}
}));
}