c# - validar - Verifique si existe una base de datos antes de crear
validar si un registro existe en la base de datos java (6)
Esto parece bastante trivial, pero ahora me está frustrando.
Estoy usando C # con SQL Server 2005 Express.
Estoy usando el siguiente código. Quiero verificar si existe una base de datos antes de crearla. Sin embargo, el número entero devuelto es -1 y así es como MSDN define qué devolverá ExecuteNonQuery (). En este momento, la base de datos existe, pero todavía devuelve -1. Habiendo dicho eso, ¿cómo puedo hacer que esto funcione para obtener el resultado deseado?
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) { }
}
A partir de SQL Server 2005, los sysobjects
y sysdatabases
estilo sysdatabases
y las vistas de catálogo han quedado en desuso. Haga esto en su lugar - use el sys.
esquema - vistas como 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;
}
Esto funcionará con cualquier nombre de base de datos que pase como parámetro, y devolverá un bool true = database exists, false = la base de datos no existe (o se produjo un error).
Leyendo esto unos años después y hay una manera más limpia de expresar esto:
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);
}
}
}
No puede usar ExecuteNonQuery porque siempre devolverá -1 para SELECT, como muestra el enlace de MSDN.
Tendrá que usar el proceso de un conjunto de resultados, por ejemplo, SELECT DB_ID(''INVENTORY'') AS DatabaseID
o usar una variable / parámetro: SELECT @DatabaseID = DB_ID(''INVENTORY'')
Para beneficio de los buscadores, si está utilizando Entity Framework, this funcionará:
using (var ctx = new MyDataModel())
{
dbExists = System.Data.Entity.Database.Exists(ctx.Database.Connection);
}
Una alternativa para consultar las vistas del sistema es usar la función db_id que devuelve el Id de la base de datos si existe, de lo contrario nulo. Ejemplo T-SQL a continuación:
if (db_id(''INVENTORY'') is null)
begin
return 0
end
else
begin
return 1
end
no debería esto
"SELECT * FROM master.dbo.sysdatabases where name = /'INVENTORY/'"
¿ser esto?
"SELECT * FROM master.dbo.sysdatabases where name = ''INVENTORY''"
También de acuerdo con MSDN
Para las sentencias UPDATE, INSERT y DELETE, el valor de retorno es el número de filas afectadas por el comando. Cuando existe un desencadenante en una tabla que se inserta o actualiza, el valor de retorno incluye el número de filas afectadas por la operación de inserción o actualización y el número de filas afectadas por el desencadenante o desencadenantes. Para todos los demás tipos de declaraciones, el valor de retorno es -1. Si ocurre una reversión, el valor de retorno también es -1.
Usted está haciendo una SELECCIÓN no una declaración de DML. ¿Por qué no utilizas un método ExecuteReader en su lugar?