架构限制

适用于: .NET Framework .NET .NET Standard

下载 ADO.NET

GetSchema 方法的第二个可选参数是用于限制返回的架构信息量的限制,该参数以字符串数组的形式传递给 GetSchema 方法 。 在数组中的位置确定可以传递的值,这等效于限制数。

例如,下表说明使用 Microsoft SqlClient Data Provider for SQL Server 时“Tables”架构集合支持的限制。 SQL Server 架构集合的其他限制在本主题的结尾处列出。

限制名称 参数名称 限制默认值 限制数
目录 @Catalog TABLE_CATALOG 1
所有者 @Owner TABLE_SCHEMA 2
@Name TABLE_NAME 3
TableType @TableType TABLE_TYPE 4

指定限制值

要使用“Tables”架构集合的一个限制,只需创建一个包含四个元素的字符串数组,然后在与限制数匹配的元素中填充值。 例如,要将 GetSchema 方法返回的表限制为仅返回“Sales”架构中的表,可将数组的第二个元素设置为“Sales”,然后再将其传递给 GetSchema 方法 。

注意

  • SqlClient 的限制集合具有额外的 ParameterName 列。 为了向后兼容,仍提供限制默认列,但是目前忽略该列。 应使用参数化查询而不是字符串替换来最大程度地减少指定限制值时 SQL 注入攻击的风险。
  • 数组中的元素数必须小于或等于指定架构集合支持的限制数,否则,将引发 ArgumentException。 可以小于最大限制数。 缺少的限制假定为空(无限制)。

可以通过调用包含限制架构集合名称(即“Restrictions”)的 GetSchema 方法来查询 Microsoft SqlClient Data Provider for SQL Server,以确定支持的限制列表。 此时将返回 DataTable,包含集合名称、限制名称、默认限制值和限制数的列表。

示例

以下示例演示如何使用 Microsoft SqlClient Data Provider for SQL Server SqlConnection 类的 GetSchema 方法来检索与 AdventureWorks 示例数据库中包含的所有表有关的架构信息,并将返回的信息仅限于“Sales”中的表:

using System;
using System.Data;
using Microsoft.Data.SqlClient;

class Program
{
    static void Main(string[] args)
    {
        string connectionString = "Data Source = localhost; Integrated Security = true; Initial Catalog = AdventureWorks";
        
        using (SqlConnection connection = new SqlConnection(connectionString))
        {
            connection.Open();

            // Specify the restrictions.  
            string[] restrictions = new string[4];
            restrictions[1] = "Sales";
            System.Data.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 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("============================");
        }
    }
}

SQL Server 架构限制

下表列出了 SQL Server 架构集合的限制。

用户

限制名称 参数名称 限制默认值 限制数
User_Name @Name name 1

数据库

限制名称 参数名称 限制默认值 限制数
名称 @Name 名称 1

限制名称 参数名称 限制默认值 限制数
目录 @Catalog TABLE_CATALOG 1
所有者 @Owner TABLE_SCHEMA 2
@Name TABLE_NAME 3
TableType @TableType TABLE_TYPE 4

限制名称 参数名称 限制默认值 限制数
目录 @Catalog TABLE_CATALOG 1
所有者 @Owner TABLE_SCHEMA 2
@Table TABLE_NAME 3
@Column COLUMN_NAME 4

StructuredTypeMembers

限制名称 参数名称 限制默认值 限制数
目录 @Catalog TABLE_CATALOG 1
所有者 @Owner TABLE_SCHEMA 2
@Table TABLE_NAME 3
@Column COLUMN_NAME 4

视图

限制名称 参数名称 限制默认值 限制数
目录 @Catalog TABLE_CATALOG 1
所有者 @Owner TABLE_SCHEMA 2
@Table TABLE_NAME 3

ViewColumns

限制名称 参数名称 限制默认值 限制数
目录 @Catalog VIEW_CATALOG 1
所有者 @Owner VIEW_SCHEMA 2
@Table VIEW_NAME 3
@Column COLUMN_NAME 4

ProcedureParameters

限制名称 参数名称 限制默认值 限制数
目录 @Catalog SPECIFIC_CATALOG 1
所有者 @Owner SPECIFIC_SCHEMA 2
名称 @Name SPECIFIC_NAME 3
参数 @Parameter PARAMETER_NAME 4

过程

限制名称 参数名称 限制默认值 限制数
目录 @Catalog SPECIFIC_CATALOG 1
所有者 @Owner SPECIFIC_SCHEMA 2
名称 @Name SPECIFIC_NAME 3
类型 @Type ROUTINE_TYPE 4

IndexColumns

限制名称 参数名称 限制默认值 限制数
目录 @Catalog db_name() 1
所有者 @Owner user_name() 2
@Table o.name 3
ConstraintName @ConstraintName x.name 4
@Column c.name 5

索引

限制名称 参数名称 限制默认值 限制数
目录 @Catalog db_name() 1
所有者 @Owner user_name() 2
@Table o.name 3

UserDefinedTypes

限制名称 参数名称 限制默认值 限制数
assembly_name @AssemblyName assemblies.name 1
udt_name @UDTName types.assembly_class 2

ForeignKeys

限制名称 参数名称 限制默认值 限制数
目录 @Catalog CONSTRAINT_CATALOG 1
所有者 @Owner CONSTRAINT_SCHEMA 2
@Table TABLE_NAME 3
名称 @Name CONSTRAINT_NAME 4

另请参阅