I'm writing an application where a user provides a connection string manually and I'm wondering if there is any way that I could validate the connection string - I mean check if it's correct and if the database exists.
4 Answers
You could try to connect? For quick (offline) validation, perhaps use DbConnectionStringBuilder
to parse it...
DbConnectionStringBuilder csb = new DbConnectionStringBuilder();
csb.ConnectionString = "rubb ish"; // throws
if (string.IsNullOrEmpty(csb.ConnectionString))
{
throw new ArgumentException("Connection string is invalid");
}
But to check whether the db exists, you'll need to try to connect. Simplest if you know the provider, of course:
using(SqlConnection conn = new SqlConnection(cs)) {
conn.Open(); // throws if invalid
}
If you only know the provider as a string (at runtime), then use DbProviderFactories
:
string provider = "System.Data.SqlClient"; // for example
DbProviderFactory factory = DbProviderFactories.GetFactory(provider);
using(DbConnection conn = factory.CreateConnection()) {
conn.ConnectionString = cs;
conn.Open();
}
-
1When it usign System.data.sqlite, this snippet doesnt work. Until dbcon doesnt execute a query, the user doesnt known if connection string are correct. Commented Apr 15, 2012 at 10:49
-
@videador do you mean "invalid syntax"? Or "valid syntax but wrong info?" - obviously if it looks sane but the server name or password is wrong, you have to try to connect to check that. If sqlite will "Open()" with an invalid string, then that sounds like a bug in SQLite Commented Apr 15, 2012 at 11:00
-
@MarcGravell I have heard that you should not use exceptions for flow control. Is there any way to do this without throwing and catching an exception? Or is this the best method available? Maybe an "exception" to the rule above :) Commented Jul 2, 2012 at 22:15
-
1
-
3@MarcGravell - I should search harder before commenting :) I see that
Dispose()
callsClose()
– GeoffCommented May 2, 2013 at 19:57
Try this.
try
{
using(var connection = new OleDbConnection(connectionString)) {
connection.Open();
return true;
}
}
catch {
return false;
}
-
I tried your code, it is working as expected but, it throws after connection timeout expires. I tried to set connection timeout to 1 sec in connection string, nothing changed. Is there a solution to this? Commented Jan 10, 2017 at 12:55
If the goal is validity and not existence, the following will do the trick:
try
{
var conn = new SqlConnection(TxtConnection.Text);
}
catch (Exception)
{
return false;
}
return true;
For sqlite use this: Suppose you have connection string in textbox 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
I think you can easilly convert it to c# code