获取与数据库的连接丢失错误

时间:2011-09-15 18:45:10

标签: c# sql database firebird

我的应用程序每隔一段时间就会抛出一个与数据库丢失错误的连接。

我从一个教程网站得到的数据库类在下面,除了上面的错误之外它很有效,我猜测它的超时,就好像使用它的人去吸烟休息并回来并试图继续他们离开的地方。

粗俗是正常的最终用户他们关闭然后错误消息然后来告诉我他们有错误。

但是直到错误再次出现,我想我会问这个代码的哪一部分可以改变以防止该错误

这是一个firebird数据库服务器和一个c#应用程序

    using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Windows.Forms;
using FirebirdSql.Data.FirebirdClient;

namespace _0912111
{
    class DatabaseConnection
    {
        private FbConnection conn;
        private FbCommand sqlCommand;
        private FbDataAdapter DB;
        private DataSet DS = new DataSet();

        public DatabaseConnection()
        {
            conn = new FbConnection("User=myuser;" + "Password=mypw;" + "Database=dbpath;" + "DataSource=serverip;" + "Port=dbport;" + "Dialect=3;" + "Charset=UTF8;");
        }
        public void showDbError(string theError)
        {
            MessageBox.Show("Could not connect to database\n\nError Details:\n" + theError);
        }
        public FbConnection Openconn()
        {
            if (conn.State == ConnectionState.Closed || conn.State == ConnectionState.Broken)
            {
                try
                {
                    conn.Open();
                }
                catch (Exception e)
                {
                    showDbError(e.Message.ToString());
                }
            }
            return conn;
        }
        public FbConnection Closeconn()
        {
            if (conn.State == ConnectionState.Open)
            {
                conn.Close();
            }
            return conn;
        }
        public void nonQuery(string txtQuery)
        {
            FbCommand cmd = new FbCommand(txtQuery);
            try
            {
                cmd.Connection = Openconn();
                cmd.ExecuteNonQuery();
            }
            catch (Exception Ex)
            {
                showDbError(Ex.Message.ToString());
                throw Ex;
            }
            finally
            {
                cmd = null;
            }
        }
        public FbDataReader returnDataReader(string txtQuery)
        {
            FbCommand cmd = new FbCommand();
            try
            {
                cmd.Connection = Openconn();
                cmd.CommandText = txtQuery;
                FbDataReader rd;
                rd = cmd.ExecuteReader();
                return rd;
            }
            catch (Exception Ex)
            {
                showDbError(Ex.Message.ToString());
                throw Ex;
            }
            finally
            {
                cmd = null;
            }
        }
    }
}

我认为她的代码中写着

if (conn.State == ConnectionState.Closed || conn.State == ConnectionState.Broken) {

会阻止它??

3 个答案:

答案 0 :(得分:3)

看,我建议你使用using并以更清洁的方式重写你的方法,没有理由让另一种方法打开而另一种方法关闭连接,我不再这样做了,因为超过5年:d

另外,没有理由在ToString()上执行Ex.Message并注意,在C#中,您应该抛出只有throw而不是throw exc的例外。

您的一种方法将成为例如:

public void nonQuery(string txtQuery)
{
    using(var conn = new FbConnection(GetMyConnectionString(...parameters...)))
    {
        using(var cmd = new FbCommand(txtQuery))
        {
            try
            {           
                cmd.Connection = conn;
                conn.Open();

                cmd.ExecuteNonQuery();
            }
            catch (Exception ex)
            {
                showDbError(ex.Message);
                throw;
            }
        }
    }
}

答案 1 :(得分:2)

我和Davide Piras 100%合作。 (赞成他)

从DatabaseConnection类中删除“Openconn”和“Closeconn”方法。然后更改您的查询以获得用于连接打开和命令执行的using语句。

数据库驱动程序已经知道如何执行连接池。在代码中维护开放连接不仅浪费时间,而且是您遇到的问题的潜在原因。它可能导致的其他问题是泄漏的内存和打开与数据库服务器的进一步连接的能力。

因此,重写代码以使用数据库访问的最佳实践,问题就会消失。

答案 2 :(得分:0)

我将离开这个说明连接的例子和一些我希望会有所帮助的例子。

http://code.msdn.microsoft.com/Esempio-applicazione-dati-494c129a

问候。