用数据填充数据集
用于执行 Transact-SQL 查询和用于填充数据集的典型 Visual Studio 机制是 TableAdapter。
可以使用 TableAdapter 或命令对象对数据源执行 SQL 语句或存储过程(例如 SqlCommand)。 若要将数据加载到使用 Visual Studio 中的设计工具创建的数据集中,请使用 TableAdapter。 若要将数据加载到以编程方式创建的数据集,请使用数据适配器。 如果应用程序不使用数据集,可以使用命令对象直接对数据库执行 SQL 语句或存储过程。
以下主题提供有关在 Visual Studio 中用数据填充数据集的详细信息:
主题 |
说明 |
---|---|
详细介绍如何使用 TableAdapters 和 DataAdapters 将数据加载到数据集。 |
|
详细介绍如何使用 TableAdapter 查询和 Command 对象创建和执行返回行的 SQL 语句。 |
|
详细介绍如何使用 TableAdapter 查询和 Command 对象创建和执行返回单个值的 SQL 语句。 |
|
详细介绍如何使用 TableAdapter 查询和 Command 对象创建和执行不返回任何值的 SQL 语句。 |
|
详细介绍如何使用 TableAdapter 查询和 Command 对象执行返回行的存储过程。 |
|
详细介绍如何使用 TableAdapter 查询和 Command 对象执行返回单个值的存储过程。 |
|
详细介绍如何使用 TableAdapter 查询和 Command 对象执行不返回任何值的存储过程。 |
|
提供有关为查询和存储过程中的参数分配值,以及读取从执行的命令返回的参数值的详细信息。 |
|
提供创建数据集并使用数据库中的数据填充该数据集的详细信息。 |
|
详细介绍一个 Windows 应用程序的创建过程,该应用程序将 XML 数据加载到数据集中,然后在 DataGridView 控件中显示该数据集。 |
填充数据集
如果用 Visual Studio 设计时工具(如数据集设计器或数据源配置向导)创建数据集,则使用 TableAdapter 填充该数据集。 TableAdapter 执行 SQL 语句或存储过程。
如果不是使用设计时工具创建数据集,则必须使用数据适配器填充和更新数据。 (TableAdapter 不是 .NET Framework 4 中的实际类,因此它们不适用于不是使用设计时工具创建的数据集。) 有关使用 TableAdapter 或数据适配器将数据加载到数据集的更多信息,请参见如何:使用数据填充数据集。
TableAdapter 查询
可以执行 TableAdapter 查询以将数据填充到数据集中(更确切地说,是将数据加载到构成数据集的 DataTable 中)。 可以使用**“数据集设计器”**中的 TableAdapter 查询配置向导 创建 TableAdapter 查询。 TableAdapter 查询显示为 TableAdapter 上的指定方法,并通过调用 TableAdapter 方法执行。 有关创建和执行 TableAdapter 查询的更多信息,请参见以下页:
Command 对象
使用命令对象可以直接对数据库执行 SQL 语句和存储过程,而不需要 DataSet、TableAdapter 或 DataAdapter。 (术语“命令对象”是指您的应用程序正在使用的 .NET Framework 数据提供程序的特定命令。 例如,如果应用程序使用的是用于 SQL Server 的 .NET Framework 数据提供程序,则该命令对象为 SqlCommand。)
通过将数据命令的 CommandType 属性设置为 CommandType 枚举中的值之一,将命令配置为使用 SQL 语句或存储过程查询数据。 将 CommandType 设置为 Text 以便执行 SQL 语句,或将它设置为 StoredProcedure 以便执行存储过程。 然后,将 CommandText 属性设置为 SQL 语句或存储过程的名称。 然后,通过调用数据命令的执行方法(ExecuteReader、ExecuteScalar、ExecuteNonQuery)之一执行该命令。
每个 .NET Framework 数据提供程序 (ADO.NET) 均提供一个为特定数据库进行了优化的命令对象。
使用数据命令,可在应用程序中进行以下操作:
执行向您返回可以直接读取结果的“选择”(Select) 命令,而不是将结果加载到数据集内。 若要读取结果,请使用数据读取器(OleDbDataReader、SqlDataReader、OdbcDataReader 或 OracleDataReader 对象),其工作方式与可将控件绑定到的只读、只进游标类似。 这对于降低内存占用和非常快地加载只读数据的策略十分有用。
执行数据库定义 (DDL) 命令以创建、编辑和移除表、存储过程及其他数据库结构。 (当然您必须有执行这些操作的权限。)
执行命令以获取数据库目录信息。
执行动态 SQL 命令以更新、插入或删除记录,而不是更新数据集表然后将更改复制到数据库。
执行返回标量值(即单个值,如聚合函数 SUM、COUNT、AVG 等的结果)的命令。
执行从 SQL Server 数据库(版本 7.0 或更高版本)返回 XML 格式的数据的命令。 典型的使用是执行一个查询并返回 XML 格式的数据,向其应用 XSLT 转换以将数据转换为 HTML,然后将结果发送给浏览器。
命令的属性包含对数据库执行命令所需的全部信息。 这包括:
一个连接 命令引用一个连接,使用它与数据库通信。
命令的名称或文本 命令包含 SQL 语句的实际文本或要执行的存储过程的名称。
参数 命令可能要求您随命令传递参数值(输入参数)。 命令还可能以返回值或输出参数值的形式返回值。 每个命令都有一个参数集合,您可分别设置或读取这些参数以传递或接收值。 有关更多信息,请参见如何:设置和获取命令对象的参数。
您使用适于预期返回的结果的方法执行命令。 例如,您预期返回几行,则调用命令的 ExecuteReader 方法,这将记录返回到数据读取器。 如果您执行 UPDATE、INSERT 或 DELETE 命令,则调用命令的 ExecuteNonQuery 方法,这返回指示所影响的行数的值。 如果执行聚合函数(如返回客户的订单计数),则调用 ExecuteScalar 方法。
多个结果集
命令对象的典型应用是返回单个数据表(一组行)。 但是,命令可以执行返回多个结果集的过程。 这可以不同方法实现。 一种方法是命令引用返回多个结果集的存储过程。 另一种方法是,命令可以包含两个(或多个)语句或存储过程名。 在该情况下,这些语句或存储过程按顺序运行,并且一次调用返回多个结果集。
如果为一个命令指定多个语句或过程,它们的类型必须相同。 例如,可以运行连续的 SQL 语句或连续的存储过程。 但是,不能在同一个命令中混合存储过程调用和 SQL 语句。 有关更多信息,请参见使用 DataReader 检索数据 (ADO.NET)。
提示
对于 Oracle,Oracle .NET Framework 数据提供程序不支持成批的 SQL 语句。 但是,它允许您使用多个 REF CURSOR 输出参数来填充一个数据集,每个参数都位于其各自的数据表中。 您必须定义这些参数,将它们标记为输出参数,并指出它们是 REF CURSOR 数据类型。 注意,因为当执行 SQL 语句时,Oracle 不提供确定表名和列名所必需的信息,所以,当从 REF CURSOR 参数将 OracleDataAdapter 对象填充到存储过程时,您将无法使用 Update 方法。
安全性
在使用将 CommandType 属性设置为 Text 的数据命令时,将从客户端发送的信息传递到数据库前请仔细检查该信息。 恶意用户可能会尝试发送(插入)修改过的或其他 SQL 语句,以获得未经授权的访问或破坏数据库。 在将用户输入内容传输到数据库之前,应始终确认这些信息是有效的。 如果可能的话,请始终使用参数化查询或存储过程,这是最佳做法。