This should work, and also fixes the nasty sql injection issue:
public bool TableExists(string tableName)
{
var selectQuery = "SELECT count(*) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = @TableName";
using (var conn = new SqlConnection(SqlServerConnectionString))
using (var cmd = new SqlCommand(selectQuery, conn))
{
cmd.Parameters.Add("@TableName", SqlDbType.NVarChar, 128).Value = tableName;
conn.Open();
int result = (int?)cmd.ExecuteScalar() ?? 0;
return result > 0;
}
}
But you still have this line that is somewhat cryptic:
int result = (int?)cmd.ExecuteScalar() ?? 0;
You could expand it into easier code like this:
public bool TableExists(string tableName)
{
var selectQuery = "SELECT count(*) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = @TableName";
using (var conn = new SqlConnection(SqlServerConnectionString))
using (var cmd = new SqlCommand(selectQuery, conn))
{
cmd.Parameters.Add("@TableName", SqlDbType.NVarChar, 128).Value = tableName;
conn.Open();
object result = cmd.ExecuteScalar();
if (result == null) return false;
return ((int)result) > 0;
}
}
Newer versions of C# can shorten this again with Pattern Matching:
public bool TableExists(string tableName)
{
var selectQuery = "SELECT count(*) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = @TableName";
using (var conn = new SqlConnection(SqlServerConnectionString))
using (var cmd = new SqlCommand(selectQuery, conn))
{
cmd.Parameters.Add("@TableName", SqlDbType.NVarChar, 128).Value = tableName;
conn.Open();
return (cmd.ExecuteScalar() is int result && result > 0);
}
}
Or more code, but maybe a little simpler to understand:
public bool TableExists(string tableName)
{
var selectQuery = "SELECT count(*) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = @TableName";
using (var conn = new SqlConnection(SqlServerConnectionString))
using (var cmd = new SqlCommand(selectQuery, conn))
{
cmd.Parameters.Add("@TableName", SqlDbType.NVarChar, 128).Value = tableName;
conn.Open();
if (cmd.ExecuteScalar() is int result)
{
return result > 0;
}
}
return false;
}
But I'm guessing if you don't like the other code you won't like pattern matching, either.