当前位置:  开发笔记 > 编程语言 > 正文

检查数据库在创建之前是否存在

如何解决《检查数据库在创建之前是否存在》经验,为你挑选了3个好方法。

这看起来很微不足道,但现在让我感到沮丧.

我正在使用C#和SQL Server 2005 Express.

我使用以下代码.我想在创建数据库之前检查数据库是否存在.但是,返回的整数是-1,这就是MSDN定义ExecuteNonQuery()将返回的内容的方式.现在,数据库确实存在,但仍然返回-1.话虽如此,我怎样才能使这项工作得到理想的结果呢?

private static void checkInventoryDatabaseExists(ref SqlConnection tmpConn, ref bool databaseExists)
{
    string sqlCreateDBQuery;
    try
    {
        tmpConn = new SqlConnection("server=(local)\\SQLEXPRESS;Trusted_Connection=yes");

        sqlCreateDBQuery = "SELECT * FROM master.dbo.sysdatabases where name = 
        \'INVENTORY\'";

        using (tmpConn)
        {
            tmpConn.Open();
            tmpConn.ChangeDatabase("master");

            using (SqlCommand sqlCmd = new SqlCommand(sqlCreateDBQuery, tmpConn))
            {
                int exists = sqlCmd.ExecuteNonQuery();

                if (exists <= 0)
                    databaseExists = false;
                else
                    databaseExists = true;
            }
        }
    }
    catch (Exception ex) { }

}

marc_s.. 54

由于SQL Server 2005中的,老式的sysobjectssysdatabases那些目录视图已过时.这样做 - 使用sys.模式 - 视图sys.databases

private static bool CheckDatabaseExists(SqlConnection tmpConn, string databaseName)
{
    string sqlCreateDBQuery;
    bool result = false;

    try
    {
        tmpConn = new SqlConnection("server=(local)\\SQLEXPRESS;Trusted_Connection=yes");

        sqlCreateDBQuery = string.Format("SELECT database_id FROM sys.databases WHERE Name 
        = '{0}'", databaseName);

        using (tmpConn)
        {
            using (SqlCommand sqlCmd = new SqlCommand(sqlCreateDBQuery, tmpConn))
            {
                tmpConn.Open();

                object resultObj = sqlCmd.ExecuteScalar();

                int databaseID = 0;    

                if (resultObj != null)
                {
                    int.TryParse(resultObj.ToString(), out databaseID);
                }

                tmpConn.Close();

                result = (databaseID > 0);
            }
        }
    } 
    catch (Exception ex)
    { 
        result = false;
    }

    return result;
}

这将与您作为参数传入的任何数据库名称一起使用,并且它将返回bool true = database exists,false = database不存在(或发生错误).



1> marc_s..:

由于SQL Server 2005中的,老式的sysobjectssysdatabases那些目录视图已过时.这样做 - 使用sys.模式 - 视图sys.databases

private static bool CheckDatabaseExists(SqlConnection tmpConn, string databaseName)
{
    string sqlCreateDBQuery;
    bool result = false;

    try
    {
        tmpConn = new SqlConnection("server=(local)\\SQLEXPRESS;Trusted_Connection=yes");

        sqlCreateDBQuery = string.Format("SELECT database_id FROM sys.databases WHERE Name 
        = '{0}'", databaseName);

        using (tmpConn)
        {
            using (SqlCommand sqlCmd = new SqlCommand(sqlCreateDBQuery, tmpConn))
            {
                tmpConn.Open();

                object resultObj = sqlCmd.ExecuteScalar();

                int databaseID = 0;    

                if (resultObj != null)
                {
                    int.TryParse(resultObj.ToString(), out databaseID);
                }

                tmpConn.Close();

                result = (databaseID > 0);
            }
        }
    } 
    catch (Exception ex)
    { 
        result = false;
    }

    return result;
}

这将与您作为参数传入的任何数据库名称一起使用,并且它将返回bool true = database exists,false = database不存在(或发生错误).


这很好..如果它不存在,它会抛出"对象引用未设置为对象的实例".否则它返回一个非零的数据库ID!

2> Stelloy..:

阅读这几年,有一个更清晰的表达方式:

public static bool CheckDatabaseExists(string connectionString, string databaseName)
{
      using (var connection = new SqlConnection(connectionString))
      {
           using (var command = new SqlCommand($"SELECT db_id('{databaseName}')", connection))
           {
                connection.Open();
                return (command.ExecuteScalar() != DBNull.Value);
           }
      }
}



3> SQLMenace..:

不应该这样

"SELECT * FROM master.dbo.sysdatabases where name = \'INVENTORY\'"

是吗?

"SELECT * FROM master.dbo.sysdatabases where name = 'INVENTORY'"

另据MSDN报道

对于UPDATE,INSERT和DELETE语句,返回值是受命令影响的行数.当插入或更新的表上存在触发器时,返回值包括插入或更新操作影响的行数以及受触发器或触发器影响的行数.对于所有其他类型的语句,返回值为-1.如果发生回滚,则返回值也为-1.

您正在执行SELECT而不是DML语句.为什么不使用ExecuteReader方法呢?

推荐阅读
手机用户2502851955
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有