연결 문자열이 유효한지 확인하는 방법은 무엇입니까?


79

사용자가 연결 문자열을 수동으로 제공하는 응용 프로그램을 작성 중이며 연결 문자열을 확인할 수있는 방법이 있는지 궁금합니다. 올바른지, 데이터베이스가 있는지 확인해야합니다.

답변:


151

연결을 시도 할 수 있습니까? 빠른 (오프라인) 유효성 검사를 위해 아마도 DbConnectionStringBuilder그것을 구문 분석하는 데 사용 하십시오 ...

    DbConnectionStringBuilder csb = new DbConnectionStringBuilder();
    csb.ConnectionString = "rubb ish"; // throws

하지만 db가 있는지 확인하려면 연결을 시도해야합니다. 물론 공급자를 아는 경우 가장 간단합니다.

    using(SqlConnection conn = new SqlConnection(cs)) {
        conn.Open(); // throws if invalid
    }

공급자를 문자열로만 알고있는 경우 (런타임에) 다음을 사용하십시오 DbProviderFactories.

    string provider = "System.Data.SqlClient"; // for example
    DbProviderFactory factory = DbProviderFactories.GetFactory(provider);
    using(DbConnection conn = factory.CreateConnection()) {
        conn.ConnectionString = cs;
        conn.Open();
    }

1
System.data.sqlite를 사용하면이 스 니펫이 작동하지 않습니다. dbcon이 쿼리를 실행하지 않을 때까지 사용자는 연결 문자열이 올바른지 알 수 없습니다.
dlopezgonzalez

@videador "유효하지 않은 구문"을 의미합니까? 또는 "유효한 구문이지만 잘못된 정보?" -당연히 정상으로 보이지만 서버 이름이나 비밀번호가 틀렸다면 연결을 시도하여 확인해야합니다. sqlite가 유효하지 않은 문자열로 "Open ()"하면 SQLite의 버그처럼 들립니다
Marc Gravell

@MarcGravell 흐름 제어에 예외를 사용해서는 안된다고 들었습니다. 예외를 throw하고 catch하지 않고이를 수행 할 수있는 방법이 있습니까? 아니면 이것이 가능한 가장 좋은 방법입니까? 어쩌면 :) 위의 규칙에 "예외"
bernie2436

1
@MarcGravell-내 의견은 문서를 기반으로 했다If the SqlConnection goes out of scope, it is not closed. Therefore, you must explicitly close the connection by calling Close.
Geoff

3
@MarcGravell-댓글을 달기 전에 더 열심히 검색해야합니다. :) 그 Dispose()전화를 봅니다Close()
Geoff

16

이 시도.

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

코드를 시도했지만 예상대로 작동하지만 연결 제한 시간이 만료되면 발생합니다. 연결 문자열에서 연결 시간 제한을 1 초로 설정하려고했지만 아무것도 변경되지 않았습니다. 이것에 대한 해결책이 있습니까?
Alican Uzun 2017 년

6

목표가 유효성이고 존재하지 않는 경우 다음이 트릭을 수행합니다.

try
{
    var conn = new SqlConnection(TxtConnection.Text);
}
catch (Exception)
{
    return false;
}
return true;

0

sqlite의 경우 다음을 사용하십시오. 텍스트 상자 txtConnSqlite에 연결 문자열이 있다고 가정합니다.

     Using conn As New System.Data.SQLite.SQLiteConnection(txtConnSqlite.Text)
            Dim FirstIndex As Int32 = txtConnSqlite.Text.IndexOf("Data Source=")
            If FirstIndex = -1 Then MsgBox("ConnectionString is incorrect", MsgBoxStyle.Exclamation, "Sqlite") : Exit Sub
            Dim SecondIndex As Int32 = txtConnSqlite.Text.IndexOf("Version=")
            If SecondIndex = -1 Then MsgBox("ConnectionString is incorrect", MsgBoxStyle.Exclamation, "Sqlite") : Exit Sub
            Dim FilePath As String = txtConnSqlite.Text.Substring(FirstIndex + 12, SecondIndex - FirstIndex - 13)
            If Not IO.File.Exists(FilePath) Then MsgBox("Database file not found", MsgBoxStyle.Exclamation, "Sqlite") : Exit Sub
            Try
                conn.Open()
                Dim cmd As New System.Data.SQLite.SQLiteCommand("SELECT * FROM sqlite_master WHERE type='table';", conn)
                Dim reader As System.Data.SQLite.SQLiteDataReader
                cmd.ExecuteReader()
                MsgBox("Success", MsgBoxStyle.Information, "Sqlite")
            Catch ex As Exception
                MsgBox("Connection fail", MsgBoxStyle.Exclamation, "Sqlite")
            End Try
          End Using

나는 당신이 그것을 C # 코드로 쉽게 변환 할 수 있다고 생각합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.