Тестовое подключение к базе данных c#


Я создал небольшой метод, чтобы проверить подключение к базе данных:

public bool TestConnection(string provider, string serverName, string initialCatalog, string userId, string password, bool integratedSecurity)
{
    var canConnect = false;

    var connectionString = integratedSecurity ? string.Format("Provider={0};Data Source={1};Initial Catalog={2};Integrated Security=SSPI;", provider, serverName, initialCatalog) 
                                              : string.Format("Provider={0};Data Source={1};Initial Catalog={2};User ID={3};Password={4};", provider, serverName, initialCatalog, userId, password);

    var connection = new OleDbConnection(connectionString);

    try
    {
        using (connection)
        {
            connection.Open();

            canConnect = true;
        }
    }
    catch (Exception exception)
    {

    }
    finally
    {
        connection.Close();                
    }                                         

    return canConnect;
}

Несмотря на метод работает, это не кажется правильным для меня. Есть ли способ, чтобы проверить соединение, без того, чтобы поймать исключение? Можно ли достичь того же результата другим способом?



41423
12
задан 9 ноября 2011 в 10:11 Источник Поделиться
Комментарии
4 ответа

Это немного многословный.

Я бы написал

try {
using(var connection = new OleDbConnection(...)) {
connection.Open();
return true;
}
} catch {
return false;
}

Вы должны также использовать OleDbConnectionStringBuilder правильно избежать переменных в строке подключения.

13
ответ дан 9 ноября 2011 в 11:11 Источник Поделиться

Я уже писал немного раньше, что работал с SQL Server и ваш текущий идентификатор пользователя:

namespace DatabaseConnectionTester
{
using System;
using System.Data.Common;
using System.Data.SqlClient;

internal static class Program
{
private static int Main(string[] args)
{
bool result;

if (args.Length == 0)
{
result = true;
}
else
{
try
{
var connectionString =
"Connect Timeout=10;Pooling=false;Integrated Security=sspi;server=" + args[0];

using (var connection = new SqlConnection(connectionString))
{
connection.Open();
result = true;
}
}
catch (DbException)
{
result = false;
}

if (args.Length > 1)
{
Console.WriteLine(result);
}
}

return Convert.ToInt32(result);
}
}
}

2
ответ дан 9 ноября 2011 в 11:11 Источник Поделиться

Вы могли бы преобразовать его в метод TryOpenConnection, которые будут еще более общепринятого смысла смешивать логику и обработку ошибок (в противном случае это плохая идея). Я думаю, что вы на самом деле хотите использовать это подключение? Вам не нужно открывать/закрывать только для подтверждения. Я также думаю, что его немного verbose, чтобы пройти в каждую часть строки подключения отдельно, но вы получите точку:

    public bool TryOpenConnection(string connectionString, out OleDbConnection connection)
{
try {
var conn = new OleDbConnection(connectionString);
conn.Open();
connection = conn;
return true;
}
catch (OleDbException exception) {
connection = null;
return false;
}
}

1
ответ дан 9 ноября 2011 в 11:11 Источник Поделиться

void Main()
{
TestConnection(
"myprovider",
"myserver",
"myinitcat",
"theuser",
"thepass",
true);

TestConnection(
"myprovider",
"myserver",
"myinitcat",
"theuser",
"thepass",
false);
}
public bool TestConnection(string provider, string serverName, string initialCatalog, string userId, string password, bool integratedSecurity)
{
var canConnect = false;
var csb = new OleDbConnectionStringBuilder();
csb.Provider = provider;
csb.DataSource = serverName;
csb.Add("Initial Calalog", initialCatalog);
if(integratedSecurity)
{
csb.Add("Integrated Security", "SSPI");
}
else
{
csb.Add("User", userId);
csb.Add("Password", password);
}
var connection = new OleDbConnection(csb.ToString());
try
{
using (connection)
{
connection.Open();
canConnect = true;
}
}
catch
{
}
finally
{
connection.Close();
}
Console.WriteLine (csb.ToString());
return canConnect;
}

Результат:

Provider=myprovider;Data Source=myserver;Initial Calalog=myinitcat;Integrated Security=SSPI
Provider=myprovider;Data Source=myserver;Initial Calalog=myinitcat;User=theuser;Password=thepass

1
ответ дан 9 ноября 2011 в 11:11 Источник Поделиться