以下代码改编自Microsoft's code here。因此,这显然是正确的。
using System;
using System.Data;
using System.Data.SqlClient;
class Program
{
static void Main()
{
string connectionString = GetConnectionString();
ReturnIdentity(connectionString);
}
private static void ReturnIdentity(string connectionString)
{
using (SqlConnection connection = new SqlConnection(connectionString))
{
// Create a SqlDataAdapter based on a SELECT query.
SqlDataAdapter adapter = new SqlDataAdapter("SELECT CategoryID, CategoryName FROM dbo.Categories", connection);
// Create a DataTable and fill it.
DataTable categories = new DataTable();
adapter.Fill(categories);
}
}
static private string GetConnectionString()
{
return "Your Connection String";
}
}
尽管这个显然正确的代码不包含我能找到的
DataSet
,the documentation for the Fill
method called with adapter.Fill(categories)
重复提到DataSet
s,好像它们在某种程度上是相关的/强制性的使用Fill(DataTable)
类的SqlDataAdapter
方法。
这给了我我的问题:在上面的代码中,
DataSet
出现在哪里?我想不出任何阅读 SqlDataAdapter.Fill(DataTable)
的文档都不会让人觉得你绝对需要一个。
您需要在备注部分阅读此内容:
以DataTable为参数的Fill重载,只得到第一个结果。使用以 DataSet 作为参数的 Fill 重载来获取多个结果。
所以我们看到只有在查询批处理可能有多个结果集时才需要数据集。
也许以下内容会有所帮助:
A DataSet 由表、关系和约束的集合组成。在 ADO.NET 中,DataTable 对象用于表示 DataSet 中的表。 DataTable 表示内存中关系数据的一个表;数据对于它所在的基于 .NET 的应用程序是本地的,但可以使用 DataAdapter 从数据源(例如 Microsoft SQL Server)填充有关详细信息,请参阅从 DataAdapter 填充数据集。
以DataTable为参数的Fill的重载只得到第一个结果。使用以 DataSet 作为参数的 Fill 重载来获取多个结果。
所以,看看上面的代码,重载使用 DataTable 作为参数,因此(根据文档),将使用 DataSet 中的第一个结果。
我认为对 DataSet 的引用与 SqlDataAdapter 有关 - 它“在幕后”使用 DataSets 并且 Fill 方法可以接受 DataTable 参数,然后从底层 DataSet 填充该参数。
SqlDataAdapter 类有多个 Fill 的重载版本,它们接受不同的参数,包括 DataSet 和 DataTable 实例。有关完整列表,请参阅文档。