可能性のある複製:
現在のすべてのデータベース名を検索するSQL Serverクエリ
最初にデータベースを指定せずにサーバーに接続した後、データベースをリストする方法を見つけようとしています。
sqlConnection1 = new SqlConnection("Server=" + sqlServer + ";Database=" + database +
";User ID=" + userName + ";Password=" + password + ";Trusted_Connection=False;");
だから基本的に私が望むのは、エンドユーザーがSQLサーバーに接続し、ドロップダウンリストに接続してクエリできるデータベースのリストを入力することです。
アイデア?
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");
}
}
サポートされているスキーマコレクションのリストを確認するには、引数なしで、またはスキーマコレクション名「MetaDataCollections」でGetSchemaメソッドを呼び出します。これにより、サポートされるスキーマコレクションのリスト、それぞれがサポートする制限の数、および使用する識別子部分の数を含むDataTableが返されます。
そのサーバー上のデータベースのリストを返すことができるストアドプロシージャを作成できます。
SELECT name
FROM master.sys.databases
または
EXEC sp_databases
これにより、データベース名が取得されます。
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();
}
}
最後にすべての印刷を除外してください。コンソールアプリですべてを投げて、動作を確認します。テーブル名は、row.ItemArray
のインデックス0にあります。
データベースの最新のリストは、データベース自体にあります。最初にmaster.sys.databasesからクエリを実行するには、デフォルトのデータベースとしてtempdb
に接続してください(何かに接続する必要があるため)。
_select [name] from master.sys.databases
_
次に、必要なデータベースで接続文字列を更新するか、ChangeDatabase()
メソッドを使用してdbを変更します。
例えばconnection.ChangeDatabase(selectedDB);
マスターに接続することもできますが、オブジェクトを作成する前にデータベースの変更を忘れる場合があるため、tempdbでデフォルトの接続を維持したいです。 SQLの再起動時にtempdbが再作成されるため、迷惑メールはmasterよりもtempdbに入れたいと思います。
試すことができます
select * from master.sys.databases