Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 正在尝试重新连接到数据库_C#_Winforms_Sqlconnection - Fatal编程技术网

C# 正在尝试重新连接到数据库

C# 正在尝试重新连接到数据库,c#,winforms,sqlconnection,C#,Winforms,Sqlconnection,该应用程序需要进行大量数据库查询。请求是在用户发出事件后创建的,或通过使用多个计时器(10秒刻度)创建的 当数据库服务器突然变得不可用时,就会出现问题。这会导致屏幕上出现大量包含连接错误信息的消息 我希望实现这样一种情况:失败的open调用将冻结应用程序并打开一个窗口,该窗口指示每X秒重试一次连接尝试(加上一个进度条)的问题。如果连接恢复,窗口将关闭,应用程序将解锁 怎么做?请提供现成解决方案的假设/指南或示例。因此,如果我理解正确,这是一个可用性问题。您的目标是让您的用户在等待db连接时感到高

该应用程序需要进行大量数据库查询。请求是在用户发出事件后创建的,或通过使用多个计时器(10秒刻度)创建的

当数据库服务器突然变得不可用时,就会出现问题。这会导致屏幕上出现大量包含连接错误信息的消息

我希望实现这样一种情况:失败的open调用将冻结应用程序并打开一个窗口,该窗口指示每X秒重试一次连接尝试(加上一个进度条)的问题。如果连接恢复,窗口将关闭,应用程序将解锁


怎么做?请提供现成解决方案的假设/指南或示例。

因此,如果我理解正确,这是一个可用性问题。您的目标是让您的用户在等待db连接时感到高兴和自信,一切都很好。你不想要:惊慌失措的用户按随机按钮,打电话寻求帮助和抱怨。你不想看到一大堆毫无意义的技术错误信息;也不是没有消息的冻结应用程序。但你会接受一个暂时冻结的应用程序,上面有一条有用的信息

好的可用性并不便宜。如果您想允许用户取消,那么您必须学习一些多线程。为此,我从这里开始:。如果您对静态消息“请稍候,数据库连接可能需要xxx秒…”感到满意,则可以避免这种情况

我猜测你的WinForms应用程序从很多地方调用数据库,但是你希望不需要几天重新编写的东西

我能想到的最简单的单线程解决方案是定义一个PleaseWait表单和一个“wrapper”方法,我将调用DoWithPleaseWait(),它将遍历所有业务逻辑/数据访问调用,显示和隐藏please wait表单:

namespace WinFormsPleaseWaitExample
{
//You don't need these 2 lines if you have .Net 3 or later
public delegate void Action(); 
public delegate TResult Func<TResult>();
//

public partial class Form1 : Form
{
    private readonly Form pleaseWaitForm;
    public Form1()
    {
        InitializeComponent();
        pleaseWaitForm = new PleaseWaitForm {Owner = this};
    }

    private void button1_Click(object sender, EventArgs e)
    {
        var result= DoWithPleaseWait(delegate { return SomeBusinessLayerClass.ADataRetrieval("boo"); });
        MessageBox.Show(result.ToString());
    }

    private void button2_Click(object sender, EventArgs e)
    {
        DoWithPleaseWait(delegate { SomeBusinessLayerClass.ADataOperation("boo"); });
    }

    public void DoWithPleaseWait(Action action)
    {
        pleaseWaitForm.Show();
        action.DynamicInvoke();
        pleaseWaitForm.Hide();
    }

    public TResult DoWithPleaseWait<TResult>(Func<TResult> func)
    {
        pleaseWaitForm.Show();
        TResult result = (TResult)func.DynamicInvoke();
        pleaseWaitForm.Hide();
        return result;
    }
}

public class SomeBusinessLayerClass
{
    public static void ADataOperation(string someInput)
    {
        //Do something that might take several seconds...
        Thread.Sleep(3000);
    }
    public static object ADataRetrieval(string someInput)
    {
        //Do something that might take several seconds...
        Thread.Sleep(3000);
        return someInput + " returned";
    }
}
}
名称空间WinFormsPlaseWaitExample
{
//如果您有.NET3或更高版本,则不需要这两行代码
公共委托无效操作();
公共委托TResult Func();
//
公共部分类Form1:Form
{
私人只读表单请使用WitForm;
公共表格1()
{
初始化组件();
pleaseWaitForm=new pleaseWaitForm{Owner=this};
}
私有无效按钮1\u单击(对象发送者,事件参数e)
{
var result=DoWithPleaseWait(委托{返回SomeBusinessLayerClass.ADataRetrieval(“boo”);});
Show(result.ToString());
}
私有无效按钮2\u单击(对象发送者,事件参数e)
{
DoWithPleaseWait(委托{SomeBusinessLayerClass.ADataOperation(“boo”);});
}
公共无效DoWithPleaseWait(行动)
{
请使用waitform.Show();
action.DynamicInvoke();
请使用waitform.Hide();
}
公共TResult DoWithPleaseWait(Func Func)
{
请使用waitform.Show();
TResult result=(TResult)funct.DynamicInvoke();
请使用waitform.Hide();
返回结果;
}
}
公共类SomeBusinessLayerClass
{
公共静态void ADataOperation(字符串输入)
{
//做一些可能需要几秒钟的事情。。。
睡眠(3000);
}
公共静态对象ADataRetrieval(字符串输入)
{
//做一些可能需要几秒钟的事情。。。
睡眠(3000);
return someInput+“returned”;
}
}
}

当你说“大量屏幕消息”时,你是说你有大量用户,还是说你的WinForms应用程序中有代码向用户显示大量错误消息?我假设存在正常的sql连接超时(30秒?)在屏幕上显示错误消息之前,首先想到的是打开一个没有按钮的模式对话框来关闭并开始重试工作。不过,我会提供一种方法来关闭所有内容并关闭应用程序(重试计数器,当达到某个阈值时允许用户放弃)@Steve。当然,我会在这个模式窗体中添加“退出应用程序”按钮。@Chris F Carroll,没错,问题是缺少连接的窗口应该立即出现(即2秒后,它是LAN)。即使我将连接超时设置为2,它也会在30秒后抛出异常。“大量的屏幕信息”=“给用户的错误信息很多很多”。