Проверьте, существует ли база данных MSSQL C # - PullRequest
0 голосов
/ 16 мая 2018

У меня есть такой код:

private bool CheckDatabase(string databaseName, bool bRet)
    {
        string connString = "Server=localhost\\SQLEXPRESS;Integrated Security=SSPI;database=master";
        string cmdText = "select * from master.dbo.sysdatabases where name=\'" + databaseName + "\'";



        using (SqlConnection sqlConnection = new SqlConnection(connString))
        {
            sqlConnection.Open();
            using (SqlCommand sqlCmd = new SqlCommand(cmdText, sqlConnection))
            {
                int nRet = sqlCmd.ExecuteNonQuery();
                // regMessage.Text = nRet.ToString();
                if (nRet <= 0)
                {
                    bRet = false;
                }
                else
                {
                    bRet = true;
                }
            }
        }
        return bRet;
    }

Однако

nRet

результат всегда -1, как будто база данных не существует (она существует). Это проблема, потому что база данных еще пуста? Или он должен возвращать> 0, если база данных была создана, даже если она пуста? Кстати, строка databaseName верна.

EDIT> РЕДАКТИРОВАТЬ: Я также получаю странную ошибку по команде "CREATE DATABASE @database" ssql:

'Неверный синтаксис рядом с' @ userDatabase '

код такой:

    var connString = "Server=localhost\\SQLEXPRESS;Integrated Security = SSPI; database = master";
                string cmdText = "CREATE DATABASE @userDatabase";
                using (var sqlConnection = new SqlConnection(connString))
                {
                    using (var sqlCmd = new SqlCommand(cmdText, sqlConnection))
                    {
                        sqlCmd.Parameters.Add("@userDatabase", System.Data.SqlDbType.NVarChar).Value = databaseName;=
                        sqlConnection.Open();
                        sqlCmd.ExecuteNonQuery();
                    }
                }

Ответы [ 3 ]

0 голосов
/ 16 мая 2018

Нет, вы не можете использовать ExecuteNonQuery для возврата чего-либо из оператора SELECT, ваша ссылка на этот форум MSDN содержит неверный ответ (как вы уже экспериментировали)

Документы MSDN объясняют, что ExecuteNonQuery возвращает количество строк, затронутых оператором sql, ТОЛЬКО для запросов UPDATE / INSERT / DELETE. Чтобы подсчитать количество строк, затронутых SELECT, он должен получить результаты с гораздо большим количеством работы. Это, вероятно, было бы не мудрым по производительности.

Так что вы можете изменить свою функцию на

private bool CheckDatabase(string databaseName)
{
    string connString = "Server=localhost\\SQLEXPRESS;Integrated Security=SSPI;database=master";
    string cmdText = @"if Exists(select 1 from master.dbo.sysdatabases where name=@db) 
                       select 1 else select 0";
    using (SqlConnection sqlConnection = new SqlConnection(connString))
    {
        sqlConnection.Open();
        using (SqlCommand sqlCmd = new SqlCommand(cmdText, sqlConnection))
        {
            sqlCmd.Parameters.Add("@db", SqlDbType.NVarChar).Value = databaseName;
            int nRet = Convert.ToInt32(sqlCmd.ExecuteScalar());
            return (nRet > 0);
        }
    }
}

Что я изменил:

  • Переменная bool, переданная в качестве параметра, не требуется
  • Самый эффективный способ проверить наличие дб - через IF Оператор EXIST
  • Имя базы данных должно передаваться как параметр, а не как строка конкатенация
  • Не вызывайте ExecuteNonQuery, а просто ExecuteScalar, чтобы получить простой скалярное значение, возвращаемое оператором IF EXIST (... условие ...) SELECT 0/1
  • Возвращаемое значение может быть упрощено
0 голосов
/ 02 мая 2019

Если вы знаете, где находится файл базы данных, вы можете использовать File.Exists():

if (File.Exists(DatabaseFile))

{
 //DoSomething
}
0 голосов
/ 16 мая 2018
  1. Используйте параметризованные запросы.
  2. Используйте Select count(*) вместо Select *.
  3. Используйте ExecuteScalar вместо ExecuteNonQuery
  4. Обратите внимание на замечанияв коде они объясняют сделанные мной изменения.
// No point of passing a bool if all you do is return it...
private bool CheckDatabase(string databaseName)
{
    // You know it's a string, use var
    var connString = "Server=localhost\\SQLEXPRESS;Integrated Security=SSPI;database=master";
    // Note: It's better to take the connection string from the config file.

    var cmdText = "select count(*) from master.dbo.sysdatabases where name=@database";

    using (var sqlConnection = new SqlConnection(connString))
    {
        using (var sqlCmd = new SqlCommand(cmdText, sqlConnection))
        {
            // Use parameters to protect against Sql Injection
            sqlCmd.Parameters.Add("@database", System.Data.SqlDbType.NVarChar).Value = databaseName;

            // Open the connection as late as possible
            sqlConnection.Open();
            // count(*) will always return an int, so it's safe to use Convert.ToInt32
            return Convert.ToInt32( sqlCmd.ExecuteScalar()) == 1;
        }
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...