使用 Information Schema 浏览 MS SQL Server 桌面引擎






3.33/5 (8投票s)
浏览 MS SQL Server Information Schema Catalog。
引言
.NET Framework SDK QuickStarts 教程演示了如何使用 SQL 和 ADO.NET 操作 SQL Server 数据库。要使用这些示例,您需要安装 MSDE (Microsoft SQL Server 2000 桌面引擎)。该引擎附带 "OSQL" 控制台查询工具。在演示版本中,您会找到 MSDE 的 GUI 查询工具。还有另一篇文章介绍了 GUI,例如 MSDE-GUI。我的文章展示了如何使用命令行查询和信息架构目录来浏览数据库或 SQL Server 的属性。一些用户界面是从 Visual Interdev 的数据库连接项目中借用的。演示程序显示了一个树视图,其中节点包含数据库及其表/字段、视图和存储过程。用户界面使用 DataGrid
显示查询结果,而数据库操作则使用 SqlConnection
、SqlCommand
和 SqlDataReader
完成。
硬件和软件环境
我在 Windows Me 上安装了 .NET Framework 1.1 和 MSDE。我使用了 SharpDevelop 提供的免费 IDE,我非常感谢他们做出了这款产品。这就是为什么您在 zip 文件中看不到熟悉的 VS.NET 图标的原因。给您一个小建议,在安装 MSDE 时,请务必记住通过以下命令设置您自己的管理员密码:
Setup.exe /qb+ INSTANCENAME=NetSDK
DISABLENETWORKPROTOCOLS=1 SAPWD=<YOUR SA PASSWORD>
如果您不设置密码,将无法访问您的服务器,并且需要重新安装 MSDE。
设计
设计目标是最小化对数据库的调用,并实现访问者模式。数据库存储了表、存储过程、视图、权限等列表。除了权限属性外,这些数据库属性在下面的类图中都是类。数据库类 (CMDatabase)
打开并维护连接,以及表、视图和存储过程的数组。所有数据库调用都在此类的内部完成,除了表会将其字段填充到自己的数组中。通过这种方式,浏览属性无需进一步访问数据库。访问者模式允许将相关的查询方法放在单个类中,如下所示。此图仅用于说明目的,不包含所有类、方法和成员。
类和关系
访问者模式
// MainForm
CView v = (CView) node.Tag;
CQueryBuilderVisitor q = new CQueryBuilderVisitor();
v.accept(q);
txtQuery.Text = q.GetQuery();
//CQueryBuilderVisitor
public class CQueryBuilderVisitor : CVisitor
{
public override void visit(CView v) {
m_query =v.GetDefinition();
}
public override void visit(CTable t) {
m_query = " SELECT * FROM [" + t.GetName() + "]";
}
// etc...
// CView
public void accept(CVisitor v) {
v.visit(this);
}
//CVisitor
public abstract class CVisitor
{
public abstract void visit(CField f);
public abstract void visit(CTable t);
public abstract void visit(CView v);
public abstract void visit(CStoredproc sp);
}
使用演示
GUI 图像详细展示了如何使用该工具。程序启动时,会在文本区域添加自解释的连接字符串,您可以在其中添加自己的服务器名称、用户名等。完成连接字符串后,单击“连接”以连接到服务器。程序将打开连接并浏览属性的架构。然后,它们会列在树视图中。您可以选择树中的一个节点来创建查询或打开视图或存储过程的定义。要执行您的查询,请单击“!”按钮。
实现
有许多方法可以探索 MS SQL。使用下面列出的信息架构属性和 SqlCommand
查询,您可以列出关于 SQL Server 中数据库的几乎所有您需要知道的信息。列表如下:
CHECK_CONSTRAINTS |
包含关于数据库中约束的信息 |
COLUMN_DOMAIN_USAGE |
标识哪些表中的哪些列使用了用户定义的数据类型 |
COLUMN_PRIVILEGES |
为授予或由当前用户授予的每个列级别权限有一行 |
CHECK_CONSTRAINTS |
包含关于数据库中约束的信息 |
COLUMNS |
列出数据库中的每个表或视图中的每一列,每行代表一列 |
CONSTRAINT_COLUMN_USAGE |
列出已定义约束的每一列,每行代表一列 |
CONSTRAINT_TABLE_USAGE |
列出已定义约束的每个表,每行代表一个表 |
DOMAIN_CONSTRAINTS |
列出已绑定规则的用户定义数据类型 |
DOMAINS |
列出用户定义的数据类型 |
KEY_COLUMN_USAGE |
列出被定义为键的每一列,每行代表一列 |
PARAMETERS |
列出存储过程或用户定义函数中的每个参数,每行代表一个参数 |
REFERENTIAL_CONSTRAINTS |
列出每个外键约束,每行代表一个约束 |
ROUTINES |
列出每个存储过程或用户定义函数,每行代表一个例程 |
ROUTINE_COLUMNS |
包含表值函数返回的每一列,每行代表一列 |
SCHEMATA |
包含每个数据库的行,每行代表一个数据库 |
TABLE_CONSTRAINTS |
列出当前数据库中定义的每个约束,每行代表一个约束 |
TABLE_PRIVILEGES |
为授予或由当前用户授予的每个表级别权限有一行 |
TABLES |
列出当前数据库中的每个表或视图,每行代表一个表或视图 |
VIEW_COLUMN_USAGE |
列出视图中的每一列,尽可能包括列的基表,每行代表一列 |
VIEW_TABLE_USAGE |
列出视图中使用的每个表,每行代表一个表 |
VIEWS |
列出每个视图,每行代表一个视图 |
例如:要查询 Northwind 数据库中的视图,可以使用以下命令:
SELECT TABLE_NAME,VIEW_DEFINITION FROM INFORMATION_SCHEMA.VIEWS
WHERE TABLE_CATALOG='Northwind' AND TABLE_NAME NOT IN
(SELECT NAME FROM MASTER.DBO.sysobjects)
免责声明
在 98/ME 上安装 .NET 和免费 IDE 的想法来自在此处写文章的某人,“如何在 98 上安装 .NET SDK”。功劳归于他。