数据读取器与数据集的高级应用
立即解锁
发布时间: 2025-08-20 01:14:36 阅读量: 1 订阅数: 3 


C# 5.0与SQL Server 2012数据库开发实战
### 数据读取器与数据集的高级应用
在数据库操作中,数据读取器和数据集是两个重要的概念。数据读取器可以以连接、向前、只读的方式访问数据库数据,而数据集则是一个独立于数据源的对象,可以在连接或断开数据源的情况下使用。下面我们将详细介绍数据读取器的使用,以及如何通过数据集和数据适配器来处理数据库数据。
#### 数据读取器的使用
数据读取器提供了一种高效的方式来访问数据库数据。我们可以使用特定的访问器方法来获取不同数据类型的值,例如使用 `GetString`、`GetByte` 和 `GetInt16` 方法分别访问 SQL Server 中的 `nvarchar`、`tinyint` 和 `smallint` 数据类型。这种技术不仅速度快,而且完全类型安全,如果从原生数据类型到 .NET 类型的隐式转换失败,会抛出无效转换异常。
以下是一个示例代码,展示了如何使用数据读取器获取数据:
```csharp
// ExpMonth
txtTypeAccess.AppendText(rdr.GetByte(2).ToString());
txtTypeAccess.AppendText("\t\t");
// ExpYear
txtTypeAccess.AppendText(rdr.GetInt16(3).ToString());
txtTypeAccess.AppendText("\n");
```
除了获取数据值,数据读取器还提供了许多有用的方法和属性来获取结果集的元数据信息,如下表所示:
| 方法或属性名称 | 描述 |
| --- | --- |
| Depth | 获取当前行的嵌套深度 |
| FieldCount | 包含当前行的列数 |
| GetDataTypeName | 接受一个索引并返回包含列数据类型名称的字符串 |
| GetFieldType | 接受一个索引并返回对象的 .NET Framework 类型 |
| GetName | 接受一个索引并返回指定列的名称 |
| GetOrdinal | 接受一个列名并返回列索引 |
| GetSchemaTable | 返回列元数据 |
| HasRows | 指示数据读取器是否有任何行 |
| RecordsAffected | 获取更改、插入或删除的行数 |
#### 获取结果集信息
下面我们通过一个实际的例子来演示如何使用这些方法和属性获取结果集的信息。
1. **添加新窗体**:选择项目,右键单击并选择“添加” -> “Windows 窗体”,将 `Form1.cs` 重命名为 `ResultSetInfo.cs`。
2. **设置窗体属性**:选择 `ResultSetInfo` 窗体,将 `Size` 属性的宽度设置为 462,高度设置为 460。
3. **添加控件并设置属性**:
- 拖动一个 `Label` 控件到窗体上,设置 `Name` 为 `lblDataType`,`AutoSize` 为 `false`,`Location` 的 `X` 为 3,`Y` 为 31,`Size` 的 `X` 为 57,`Y` 为 13,`Text` 为 “Data Type”。
- 按照类似的方式添加其他 `Label` 和 `TextBox` 控件,并设置相应的属性。
4. **修改代码**:双击 `TypedAccessor.cs` 窗体的空白表面,打开代码编辑器窗口,修改 `TypedAccessor_Load` 事件如下:
```csharp
Using System.Data.SqlClient;
private void ResultSetInfo_Load(object sender, EventArgs e)
{
// 连接字符串
string connString = @"server=.\sql2012;database=AdventureWorks;Integrated Security=SSPI";
// 查询语句
string sql = @" select FirstName,LastName from Person.Contact order by LastName";
// 创建连接
SqlConnection conn = new SqlConnection(connString);
try
{
conn.Open();
SqlCommand cmd = new SqlCommand(sql, conn);
SqlDataReader rdr = cmd.ExecuteReader();
// 获取列名
lbltype1.Text = rdr.GetName(0);
lblType2.Text = rdr.GetName(1);
// 获取列数据类型
lbltype1.Text += "\n" + rdr.GetDataTypeName(0).ToString();
lblType2.Text += "\n" + rdr.GetDataTypeName(1).ToString();
// 获取列数
lblType3.Text = "Number of columns in a row::" + rdr.FieldCount.ToString();
// 获取每列的信息
lblType4.Text = rdr.GetName(0).ToString() + " is at index::" + rdr.GetOrdinal("FirstName").ToString() + " and its type is::" + rdr.GetFieldType(0).ToString();
lblType5.Text = rdr.GetName(1).ToString() + " is at index:: " + rdr.GetOrdinal("LastName").ToString() + " and its type is::" + rdr.GetFieldType(1).ToString();
while (rdr.Read())
{
// 获取所有行的列值
txtResultSet.AppendText("\t");
txtResultSet.AppendText(rdr[0].ToString());
txtResultSet.AppendText("\t\t\t");
txtResultSet.AppendText(rdr[1].ToString());
txtResultSet.AppendText("\n");
}
// 关闭读取器
rdr.Close();
}
catch (SqlException ex)
{
MessageBox.Show(ex.Message + ex.StackTrace, "Exception Details");
}
finally
{
// 关闭连接
conn.Close();
}
}
```
5. **设置启动窗体**:修改 `Program.cs` 中的语句,将启动窗体设置为 `ResultSetInfo`。
6. **构建并运行项目**:按下 `Ctrl + F5` 运行项目,你将看到结果集的元数据信息。
#### 获取表的架构信息
在关系数据库中,架构通常指的是数据结构的设计,特别是数据库表的设计。我们可以使用数据读取器的 `GetSchemaTable` 方法来轻松检索架构信息。该方法返回一个 `System.Data.DataTable` 对象,它
0
0
复制全文
相关推荐










