我有一个连接到MYSQL数据库的应用程序,使用实体框架。它完美地工作着,但是我想在应用启动时添加一小段代码来测试与数据库的连接。
我有一个想法,即简单地运行一个小命令到数据库,并捕获任何异常,但是如果出现问题(例如App.Config丢失或数据库服务器停机),应用程序需要花费大量时间来运行此代码,然后抛出异常(约1分钟)。我想这是由于连接超时等原因造成的,但我已经尝试更改这些属性,但无济于事。
是否有人能够协助提供任何想法?
我有一个连接到MYSQL数据库的应用程序,使用实体框架。它完美地工作着,但是我想在应用启动时添加一小段代码来测试与数据库的连接。
我有一个想法,即简单地运行一个小命令到数据库,并捕获任何异常,但是如果出现问题(例如App.Config丢失或数据库服务器停机),应用程序需要花费大量时间来运行此代码,然后抛出异常(约1分钟)。我想这是由于连接超时等原因造成的,但我已经尝试更改这些属性,但无济于事。
是否有人能够协助提供任何想法?
正如@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;
}
if (CheckConnection()) {..}
(以避免在MySQL服务器关闭的情况下出现应用程序错误)。有没有什么办法可以在更全局的层面上实现此检查?这样就不需要调用和重新调用CheckConnection()
了吗? - W.M.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 )
在EntityFramework Core中,您可以简单地调用:Database.CanConnect();
。
(使用EF Core 2.2.1)
摘要: 确定数据库是否可用并且可以连接。
请注意,能够连接到数据库并不意味着它的架构创建等方面是最新的。
CanConnect
在数据库服务器离线时不会返回false,而会抛出异常。 - Mariano Soto我在我的项目中使用这段代码:
private bool TestConnectionEF()
{
using (var db = new SistemaContext())
{
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;
}
}
我知道这是一个老问题,但以下是我给任何寻找较新实现的人的答案。
我可以使用 CanConnect
检查数据库的状态:
_database.Database.CanConnect();
# Async too
await _database.Database.CanConnectAsync(_cancellationTokenSource.Token);
我希望这也能对其他人有所帮助。干杯!
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;
}
我在使用以下代码进行 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;
}
}