这看起来很微不足道,但现在让我感到沮丧.
我正在使用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中的,老式的sysobjects
和sysdatabases
那些目录视图已过时.这样做 - 使用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不存在(或发生错误).
由于SQL Server 2005中的,老式的sysobjects
和sysdatabases
那些目录视图已过时.这样做 - 使用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不存在(或发生错误).
阅读这几年,有一个更清晰的表达方式:
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); } } }
不应该这样
"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方法呢?