DbConnection.GetSchema(“Tables”)仅返回一个数据库的表

时间:2011-08-31 06:45:43

标签: c# ado.net

我尝试获取所有数据库的所有表名。 但GetSchema(“Tables”)仅返回一个db的名称。 这很奇怪,因为我没有使用任何限制,并且在具有读/写权限的许多dbs上使用dbowner。

获取所有表信息需要什么?

2 个答案:

答案 0 :(得分:1)

它只返回当前上下文数据库中的表列表。 要获取所有表的列表,您需要遍历每个数据库。

我在我的一个开源项目中使用过它 - http://dbdoc.codeplex.com

你必须做这样的事情:

foreach (Microsoft.SqlServer.Management.Smo.Database db in server.Databases)
 foreach (Microsoft.SqlServer.Management.Smo.Table tbl in db.Tables)
                        tables.Add(tbl.Name);  // Temp variable

答案 1 :(得分:1)

我是这样做的:

Cursor.Current = Cursors.WaitCursor;
                            sqlConnection.Open();
                            System.Data.DataTable dataTable = sqlConnection.GetSchema("Databases");

                            foreach (System.Data.DataRow row in dataTable.Rows)
                            {
                                using (var tablesConnection = new System.Data.SqlClient.SqlConnection())
                                {
                                    var dbName = row[0] as string;
                                    try
                                    {
                                        sqlConnection.ChangeDatabase(dbName);
                                    }
                                    catch (Exception)
                                    {
                                        continue;
                                    }

                                    var tables = sqlConnection.GetSchema("Tables");
                            }

真正的问题是,即使初始目录未明确指定,也会分配默认数据库。因此,应该为服务器上的每个数据库调用GetSchema(“Tables”)。 它可能是其他数据库,不一定是“主”。 我认为GetSchema(“Tables”)返回所有数据库的所有表。