web-dev-qa-db-fra.com

C # se connecter à la base de données et répertorier les bases de données

Duplicata possible:
requête SQL Server pour trouver tous les noms de base de données actuels

J'essaie de comprendre comment répertorier les bases de données après la connexion aux serveurs sans spécifier de base de données au préalable.

sqlConnection1 = new SqlConnection("Server=" + sqlServer + ";Database=" + database +    
";User ID=" + userName + ";Password=" + password + ";Trusted_Connection=False;");

Donc, fondamentalement, ce que je veux, c'est que l'utilisateur final se connecte au serveur SQL, puis une liste déroulante remplie avec la liste des bases de données qu'ils peuvent se connecter et interroger.

Des idées?

22
user1158745

Vous pouvez utiliser SqlConnection.GetSchema :

using(var con = new SqlConnection("Data Source=Yourserver; Integrated Security=True;"))
{
    con.Open();
    DataTable databases = con.GetSchema("Databases");
    foreach (DataRow database in databases.Rows)
    {
        String databaseName = database.Field<String>("database_name");
        short dbID = database.Field<short>("dbid");
        DateTime creationDate = database.Field<DateTime>("create_date");
    }
} 

Collections de schémas SQL Server (ADO.NET)

Pour déterminer la liste des collections de schémas prises en charge, appelez la méthode GetSchema sans arguments ou avec le nom de collection de schémas "MetaDataCollections". Cela renverra un DataTable avec une liste des collections de schémas prises en charge, le nombre de restrictions qu'ils prennent en charge chacun et le nombre de parties d'identifiant qu'ils utilisent.

42
Tim Schmelter

Vous pouvez écrire un proc stocké qui peut vous renvoyer une liste de bases de données sur ce serveur.

SELECT name
FROM master.sys.databases

ou

EXEC sp_databases
5
tranceporter

Cela devrait vous donner des noms de base de données:

var connectionString = string.Format("Data Source=localhost;User ID={0};Password={1};", userName, password);

DataTable databases = null;
using (var sqlConnection = new SqlConnection(connectionString))
{
    sqlConnection.Open();
    databases = sqlConnection.GetSchema("Databases");
    sqlConnection.Close();
}

if (databases != null)
{
    foreach (DataRow row in databases.Rows)
    {
        foreach (var item in row.ItemArray)
        {
            Console.Write("{0} ", item);
        }
        Console.WriteLine();
    }
}

N'hésitez pas à exclure toutes les impressions à la fin. Jetez tout cela dans une application console pour le voir en action. Les noms de table sont dans l'index 0 de row.ItemArray.

3
Gromer

Vous pouvez utiliser SMO - SQL Server Management Objects .

Il s'agit de deux exemples de code dans un projet de code:

Authentification SQL Server à l'aide de SMO

Bases de données utilisant SMO

2

La liste la plus récente des bases de données se trouvera dans la base de données elle-même. Pourquoi ne pas vous connecter à tempdb en tant que base de données par défaut (car vous devez vous connecter à quelque chose) pour commencer, puis interroger à partir de master.sys.databases.

select [name] from master.sys.databases

Ensuite, vous pouvez mettre à jour votre chaîne de connexion avec la base de données nécessaire ou simplement changer la base de données à l'aide de la méthode ChangeDatabase().

par exemple. connection.ChangeDatabase(selectedDB);

Vous pouvez également vous connecter à master, mais j'aime conserver les connexions par défaut dans tempdb car les gens oublient parfois de changer de base de données avant de créer des objets. Je préfère que les fichiers indésirables soient placés dans tempdb plutôt que master car tempdb est recréé au redémarrage de SQL.

1
Code Magician

Vous pouvez essayer avec

select * from master.sys.databases
0
Aghilas Yakoub