每个由 .NET Framework 管理的提供程序中的 Connection 类实现 GetSchema 方法,该方法用于检索与当前连接的数据库有关的架构信息,从 GetSchema 方法返回的架构信息以 DataTable 的形式传入。GetSchema 方法属于重载方法,提供可选的参数来指定要返回的架构集合以及限制返回的信息量。
指定架构集合
GetSchema 方法的第一个可选参数是以字符串形式指定的集合名称。有两种类型的架构集合:所有提供程序通用的通用架构集合以及每个提供程序特定的特定架构集合。
可 以通过调用没有参数或包含架构集合名称“MetaDataCollections”的 GetSchema 方法来查询由 .NET Framework 管理的提供程序,以确定支持的架构集合列表。此时将返回 DataTable,包含支持的架构集合列表、每个架构集合支持的限制数以及所使用的标识符部分数。
有关通用架构集合的更多信息,请参见了解通用架构集合;有关提供程序特定的集合,请参见了解提供程序特定的架构集合。
检索架构集合示例
以下示例演示如何使用 SQL Server .NET Framework 数据提供程序的 SqlConnection 类的 GetSchema 方法来检索与 AdventureWorks 示例数据库中包含的所有表有关的架构信息:
[Visual Basic]
Imports System.Data.SqlClient
Module Module1
Sub Main()
Dim connectionString As String = GetConnectionString()
Using connection As New SqlConnection(connectionString)
'Connect to the database then retrieve the schema information.
connection.Open()
Dim table As DataTable = connection.GetSchema("Restrictions")
' Display the contents of the table.
DisplayData(table)
Console.WriteLine("Press any key to continue.")
Console.ReadKey()
End Using
End Sub
Private Function GetConnectionString() As String
' To avoid storing the connection string in your code,
' you can retrieve it from a configuration file.
Return "Data Source=(local);Database=AdventureWorks;" _
& "Integrated Security=SSPI;"
End Function
Private Sub DisplayData(ByVal table As DataTable)
For Each row As DataRow In table.Rows
For Each col As DataColumn In table.Columns
Console.WriteLine("{0} = {1}", col.ColumnName, row(col))
Next
Console.WriteLine("============================")
Next
End Sub
End Module
[C#]
using System;
using System.Data;
using System.Data.SqlClient;
class Program
{
static void Main(string[] args)
{
string connectionString = GetConnectionString();
sing (SqlConnection connection = new SqlConnection(connectionString))
{
// Connect to the database then retrieve the schema information.
connection.Open();
DataTable table = connection.GetSchema("Tables");
// Display the contents of the table.
DisplayData(table);
Console.WriteLine("Press any key to continue.");
Console.ReadKey();
}
}
private static string GetConnectionString()
{
// To avoid storing the connection string in your code,
// you can retrieve it from a configuration file.
return "Data Source=(local);Database=AdventureWorks;" +
"Integrated Security=SSPI;";
}
private static void DisplayData(System.Data.DataTable table)
{
foreach (System.Data.DataRow row in table.Rows)
{
foreach (System.Data.DataColumn col in table.Columns)
{
Console.WriteLine("{0} = {1}", col.ColumnName, row[col]);
}
Console.WriteLine("============================");
}
}
}
指定限制值
GetSchema 方法的第二个可选参数是用于限制返回的架构信息量的限制,该参数以字符串数组的形式传递给 GetSchema 方法。在数组中的位置确定可以传递的值,这等效于限制数。
例如,下表说明使用 SQL Server .NET Framework 数据提供程序时“Tables”架构集合支持的限制:
限制名称 | 限制默认值 | 限制数 |
---|---|---|
Catalog | TABLE_CATALOG | 1 |
Owner | TABLE_SCHEMA | 2 |
Table | TABLE_NAME | 3 |
TableType | TABLE_TYPE | 4 |
要 使用“Tables”架构集合的一个限制,只需创建一个包含四个元素的字符串数组,然后在与限制数匹配的元素中填充值。例如,要将 GetSchema 方法返回的表仅限于“dbo”角色所拥有的表,将数组的第二个元素设置为“dbo”,然后再将其传递给 GetSchema 方法。
![]() |
---|
SqlClient 和 OracleClient 的限制集合还有附加的 ParameterName 列。为了向后兼容,仍提供限制默认列,但是目前忽略该列。在指定限制值时,应使用参数化查询(而不是字符串替换)来最大程度地降低受到 SQL 注入式攻击的风险。 |
![]() |
---|
数组中的元素数必须小于或等于指定架构集合支持的限制数,否则,将引发 ArgumentException。可以小于最大限制数。缺少的限制假定为空(无限制)。 |
可 以通过调用包含限制架构集合名称“MetaDataCollections”的 GetSchema 方法来查询由 .NET Framework 管理的提供程序,以确定支持的限制列表。此时将返回 DataTable,包含集合名称、限制名称、默认限制值和限制数的列表。
限制架构集合示例
以 下示例演示如何使用 SQL Server .NET Framework 数据提供程序的 SqlConnection 类的 GetSchema 方法来检索与 AdventureWorks 示例数据库中包含的所有表有关的架构信息,并将返回的信息仅限于“dbo”角色所拥有的表:
[Visual Basic]
Imports System.Data.SqlClient
Module Module1
Sub Main()
Dim connectionString As String = GetConnectionString()
Dim restrictions(3) As String
Using connection As New SqlConnection(connectionString)
'Connect to the database, and then retrieve the
'schema information.
connection.Open()
restrictions(1) = "dbo"
Dim table As DataTable = connection.GetSchema("Tables", _
restrictions)
' Display the contents of the table.
DisplayData(table)
Console.WriteLine("Press any key to continue.")
Console.ReadKey()
End Using
End Sub
Private Function GetConnectionString() As String
' To avoid storing the connection string in your code,
' you can retrieve it from a configuration file.
Return "Data Source=(local);Database=AdventureWorks;" _
& "Integrated Security=SSPI;"
End Function
Private Sub DisplayData(ByVal table As DataTable)
For Each row As DataRow In table.Rows
For Each col As DataColumn In table.Columns
Console.WriteLine("{0} = {1}", col.ColumnName, row(col))
Next
Console.WriteLine("============================")
Next
End Sub
End Module
[C#]
using System;
using System.Data;
using System.Data.SqlClient;
class Program
{
static void Main()
{
string connectionString = GetConnectionString();
using (SqlConnection connection =
new SqlConnection(connectionString))
{
//Connect to the database, and then retrieve the
//schema information.
connection.Open();
string[] restrictions = new string[4];
restrictions[1] = "dbo";
DataTable table = connection.GetSchema("Tables", restrictions);
// Display the contents of the table.
DisplayData(table);
Console.WriteLine("Press any key to continue.");
Console.ReadKey();
}
}
private static string GetConnectionString()
{
// To avoid storing the connection string in your code,
// you can retrieve it from a configuration file.
return "Data Source=(local);Database=AdventureWorks;" +
"Integrated Security=SSPI;";
}
private static void DisplayData(System.Data.DataTable table)
{
foreach (System.Data.DataRow row in table.Rows)
{
foreach (System.Data.DataColumn col in table.Columns)
{
Console.WriteLine("{0} = {1}", col.ColumnName, row[col]);
}
Console.WriteLine("============================");
}
}
}