60

我有一个通过实体框架连接到 MYSQL 数据库的应用程序。它可以 100% 完美运行,但我想添加一小段代码,用于在应用启动时测试与数据库的连接。

我的想法是简单地对数据库运行一个小命令并捕获任何异常,但是如果出现问题(例如 App.Config 丢失或数据库服务器关闭),应用程序需要花费大量时间来运行此代码然后抛出例外(约 1 分钟)。我想这是由于连接超时等造成的,但我摆弄了这些属性无济于事。

任何人都可以提供关于去哪里的任何想法吗?

4

7 回答 7

58

你只是想看看数据库连接是否有效?如果是这样,请查看

using (DatabaseContext dbContext = new DatabaseContext())
{
     dbContext.Database.Exists();
}

http://msdn.microsoft.com/en-us/library/gg696617(v=vs.103).aspx

并检查服务器机器是否已启动、数据库服务器或 Web 服务服务器,请尝试以下操作:

public PingReply Send( string hostNameOrAddress )

http://msdn.microsoft.com/en-us/library/7hzczzed.aspx

于 2013-10-06T16:40:25.343 回答
47

@Danilo Breda 指出的解决方案是调用 DbContext.Database.Connection.Open()

它使用 EF6 进行了测试。

我的实现:

    public static bool CheckConnection()
    {
        try
        {
            MyContext.Database.Connection.Open();
            MyContext.Database.Connection.Close();
        }
        catch(SqlException)
        {
            return false;
        }
        return true;
    }
于 2015-03-07T15:39:44.350 回答
27

In EntityFramework Core you can simply call: Database.CanConnect();.

(using EF Core 2.2.1)

Summary: Determines whether or not the database is available and can be connected to.

Note that being able to connect to the database does not mean that it is up-to-date with regard to schema creation, etc.

于 2019-03-18T15:43:26.787 回答
12

我将此代码用于我的项目:

private bool TestConnectionEF()
        {
            using (var db = new SistemaContext())
            {
                try
                {
                    db.Database.Connection.Open();
                    if (db.Database.Connection.State == ConnectionState.Open)
                    {
                        Console.WriteLine(@"INFO: ConnectionString: " + db.Database.Connection.ConnectionString 
                            + "\n DataBase: " + db.Database.Connection.Database 
                            + "\n DataSource: " + db.Database.Connection.DataSource 
                            + "\n ServerVersion: " + db.Database.Connection.ServerVersion 
                            + "\n TimeOut: " + db.Database.Connection.ConnectionTimeout);
                        db.Database.Connection.Close();
                        return true;
                    }
                    return false;
                }
                catch(Exception ex)
                {
                    throw ex;
                }
            }
        }
于 2014-10-07T19:21:41.440 回答
2

我知道这是一个老问题,但对于任何寻求更新实现的人来说,这是我的答案。

我可以CanConnect用来检查数据库的状态:

_database.Database.CanConnect();

# Async too
await _database.Database.CanConnectAsync(_cancellationTokenSource.Token);

我希望这对其他人也有帮助。干杯!

于 2021-06-10T20:12:35.700 回答
1

我使用了@Sandor 的答案,并做了一个扩展方法来与 EntityFramework Core 一起使用。

这是代码:

using Microsoft.EntityFrameworkCore;
using System.Data.Common;

namespace TerminalInventory
{
    public static class ExtensionMethods
    {
        public static bool TestConnection(this DbContext context)
        {
            DbConnection conn = context.Database.GetDbConnection();

            try
            {
                conn.Open();   // Check the database connection

                return true;
            }
            catch
            {
                return false;
            }
        }
    }
}

现在你只需要打电话:

if (!context.TestConnection())
{
    logger.LogInformation("No database connection. Check the connection string in settings.json. {0}", configuration["connectionString"]);

    return;
}
于 2018-03-14T19:33:09.480 回答
-1

我正在使用以下代码进行 MS SQL 连接。也许,它对 MySQL 也很有用。您甚至不需要使用 EF 或 EF Core。

    public bool IsDbConnectionOK()
    {
        SqlConnectionStringBuilder conStr = new SqlConnectionStringBuilder
        {
            DataSource = ButtonServerName.Text,  // <-- My Form Elements
            InitialCatalog = ButtonDBName.Text, // <-- My Form Elements
            UserID = EditUserName.Text, // <-- My Form Elements
            Password = EditPassword.Text, // <-- My Form Elements
            IntegratedSecurity = false,
            ConnectTimeout = 30
        };

        string connectionstring = conStr.ToString();

        try
        {
            using (System.Data.SqlClient.SqlConnection connection = new System.Data.SqlClient.SqlConnection(connectionstring))
            {
                connection.Open();
                return true;
            }
        }
        catch (System.Data.SqlClient.SqlException ex)
        {
            MessageBox.Show(ex.Message + Environment.NewLine +
                "Error line: " + ex.LineNumber + Environment.NewLine +
                "Procedure name: " + ex.Procedure);
            return false;
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
            return false;
        }
    }
于 2020-05-06T06:45:04.277 回答