我有一个通过实体框架连接到 MYSQL 数据库的应用程序。它可以 100% 完美运行,但我想添加一小段代码,用于在应用启动时测试与数据库的连接。
我的想法是简单地对数据库运行一个小命令并捕获任何异常,但是如果出现问题(例如 App.Config 丢失或数据库服务器关闭),应用程序需要花费大量时间来运行此代码然后抛出例外(约 1 分钟)。我想这是由于连接超时等造成的,但我摆弄了这些属性无济于事。
任何人都可以提供关于去哪里的任何想法吗?
我有一个通过实体框架连接到 MYSQL 数据库的应用程序。它可以 100% 完美运行,但我想添加一小段代码,用于在应用启动时测试与数据库的连接。
我的想法是简单地对数据库运行一个小命令并捕获任何异常,但是如果出现问题(例如 App.Config 丢失或数据库服务器关闭),应用程序需要花费大量时间来运行此代码然后抛出例外(约 1 分钟)。我想这是由于连接超时等造成的,但我摆弄了这些属性无济于事。
任何人都可以提供关于去哪里的任何想法吗?
你只是想看看数据库连接是否有效?如果是这样,请查看
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 )
@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;
}
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.
我将此代码用于我的项目:
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;
}
}
}
我知道这是一个老问题,但对于任何寻求更新实现的人来说,这是我的答案。
我可以CanConnect
用来检查数据库的状态:
_database.Database.CanConnect();
# Async too
await _database.Database.CanConnectAsync(_cancellationTokenSource.Token);
我希望这对其他人也有帮助。干杯!
我使用了@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;
}
我正在使用以下代码进行 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;
}
}