c#使用SqlDataReader

本文详细介绍了DataAdapter对象的常用属性和方法,包括如何使用这些属性进行数据的检索、插入、删除和更新操作,以及如何通过构造函数创建DataAdapter对象。此外,还提供了具体的代码示例来展示如何利用DataAdapter对象填充DataSet对象并将数据更新到数据库。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1 DataAdapter对象的常用属性

DataAdapter对象的工作步骤一般有两种,一种是通过Command对象执行SQL语句,将获得的结果集填充到DataSet对象中;另一种是将DataSet里更新数据的结果返回到数据库中。

DataAdapter对象的常用属性形式为 XXXCommand,用于描述和设置操作数据库。使用DataAdapter对象,可以读取、添加、更新和删除数据源中的记录。对于每种操作的执行方式,适配器支持以下4个属性,类型都是Command,分别用来管理数据操作的动作。

Ü SelectCommand属性:该属性用来从数据库中检索数据。

Ü InsertCommand属性:该属性用来向数据库中插入数据。

Ü DeleteCommand属性:该属性用来删除数据库里的数据。

Ü UpdateCommand属性:该属性用来更新数据库里的数据。

例如,以下代码能给DataAdapter对象的selectCommand属性赋值。

//连接字符串

SqlConnection conn;

//创建连接对象conn的语句

// 创建DataAdapter对象

SqlDataAdapter da = new SqlDataAdapter;

//DataAdapter对象的SelectCommand属性赋值

Da.SelectCommand = new SqlCommand("select * from user", conn);

//后继代码

同样,可以使用上述方式给其他的InsertCommandDeleteCommandUpdateCommand 属性赋值。

当在代码里使用DataAdapter对象的 SelectCommand属性获得数据表的连接数据时,如果表中数据有主键,就可以使用CommandBuilder对象来自动为这个 DataAdapter对象隐形地生成其他3InsertCommandDeleteCommandUpdateCommand 属性。这样,在修改数据后,就可以直接调用Update方法将修改后的数据更新到数据库中,而不必再使用InsertCommand DeleteCommandUpdateCommand3个属性来执行更新操作。

2 DataAdapter对象的常用方法

DataAdapter 对象主要用来把数据源的数据填充到DataSet中,以及把DataSet里的数据更新到数据库,同样有SqlDataAdapter OleDbAdapter两种对象。它的常用方法有构造函数、填充或刷新DataSet的方法、将DataSet中的数据更新到数据库里的方法和释放资源的方法。

1. 构造函数

不同类型的Provider使用不同的构造函数来完成DataAdapter对象的构造。对于SqlDataAdapter类,其构造函数说明如表所示。

SqlDataAdapter类构造函数说明

SqlDataAdapter()

不带参数

创建SqlDataAdapter对象

SqlDataAdapter(

SqlCommand selectCommand)

selectCommand:指定新创建对象的SelectCommand属性

创建SqlDataAdapter对象。用参数selectCommand设置其Select Com- mand属性

SqlDataAdapter(string

selectCommandText,SqlConnection selectConnection)

selectCommandText:指定新创建对象的SelectCommand属性值

selectConnection:指定连接对象

创建SqlDataAdapter对象。用参数selectCommandText设置其Select Command属性值,并设置其连接对象是selectConnection

SqlDataAdapter(string

selectCommandText,String selectConnectionString)

selectCommandText:指定新创建对象的SelectCommand属性值

selectConnectionString:指定新创建对象的连接字符串

创建SqlDataAdapter对象。将参数selectCommandText设置为Select Command属性值,其连接字符串是selectConnectionString

OleDbDataAdapter的构造函数类似SqlDataAdapter的构造函数,如下表所述。

OleDbDataAdapter类构造函数说明

OleDbDataAdapter()

不带参数

创建OleDbDataAdapter对象

OleDbDataAdapter(

OleDbCommand selectCommand)

selectCommand:指定新创建对象的SelectCommand属性

创建OleDbDataAdapter对象。用参数selectCommand设置其SelectCommand属性

OleDbDataAdapter(string

selectCommandText, OleDbConnection selectConnection)

selectCommandText:指定新创建对象的SelectCommand属性值

selectConnection:指定连接对象

创建SqlDataAdapter对象。用参数selectCommandText设置其SelectCommand属性值,并设置其连接对象是selectConnection

OleDbDataAdapter(string

selectCommandText,String selectConnectionString)

selectCommandText:指定新创建对象的SelectCommand属性值

selectConnectionString:指定新创建对象的连接字符串

创建OleDbDataAdapter对象。将参数selectCommandText设置为SelectCommand 属性值,其连接字符串是selectConnectionString

2. Fill类方法

当调用Fill方法时,它将向数据存储区传输一条 SQL SELECT 语句。该方法主要用来填充或刷新DataSet,返回值是影响DataSet的行数。该方法的常用定义如表所示。

DataAdapter类的Fill方法说明

int Fill (DataSet dataset)

dataset:需要更新的DataSet

根据匹配的数据源,添加或更新参数所指定的DataSet,返回值是影响的行数

int Fill (DataSet
dataset,string srcTable)

dataset:需要更新的DataSet

srcTable:填充DataSetdataTable

根据dataTable名填充DataSet

3. int Update(DataSet dataSet)方法

当程序调用 Update 方法时,DataAdapter将检查参数DataSet每一行的RowState属性,根据RowState属性来检查DataSet里的每行是否改变和改变的类型,并依次执行所需的INSERTUPDATEDELETE 语句,将改变提交到数据库中。这个方法返回影响DataSet的行数。更准确地说,Update 方法会将更改解析回数据源,但自上次填充 DataSet 以来,其他客户端可能已修改了数据源中的数据。若要使用当前数据刷新 DataSet,应使用 DataAdapter Fill 方法。新行将添加到该表中,更新的信息将并入现有行。Fill 方法通过检查 DataSet 中行的主键值及 SelectCommand 返回的行来确定是要添加一个新行还是更新现有行。如果 Fill 方法发现 DataSet 中某行的主键值与 SelectCommand 返回结果中某行的主键值相匹配,则它将用 SelectCommand 返回的行中的信息更新现有行,并将现有行的 RowState 设置为 Unchanged。如果 SelectCommand 返回的行所具有的主键值与 DataSet 中行的任何主键值都不匹配,则 Fill 方法将添加 RowState Unchanged 的新行。

3 DataAdapter对象代码示例

下面的代码将说明如何利用DataAdapter对象填充DataSet对象。

private static string strConnect = "data source=localhost; uid=sa;pwd=aspnet;database=LOGINDB"

string sqlStr =" Select * from USER";

//利用构造函数,创建DataAdapter

SqlDataAdapter da = new SqlDataAdapter(sqlStr,strConnect);

//创建DataSet

DataSet ds = new DataSet();

//填充,第一个参数是要填充的dataset对象,第二个参数是填充datasetdatatable

Da.Fill(ds, "USER");

上述代码使用DataApater对象填充DataSet对象的步骤如下。

(1) 根据连接字符串和SQL语句,创建一个SqlDataAdapter对象。这里,虽然没有出现ConnectionCommand对象的控制语句,但是 SqlDataAdapter对象会在创建的时候,自动构造对应的SqlConnectionSqlCommand对象,同时根据连接字符串自动初始化连接。要注意的是,此时SqlConnectionSqlCommand对象都处于关闭状态。

(2) 创建DataSet对象,该对象需要用DataAdapter填充。

(3) 调用DataAdapterFill方法,通过DataTable填充DataSet对象。由于跟随DataAdapter对象创建的Command里的SQL语句是访问数据库里的USER表,所以在调用Fill方法的时候,在打开对应的SqlConnectionSqlCommand对象后,会用 USER表的数据填充创建一个名为USERDataTable对象,再用该DataTable填充到DataSet中。

下面的代码演示了如何使用DataAdapter对象将DataSet中的数据更新到数据库。

private static string strConnect = "data source=localhost; uid=sa;pwd=aspnet;database=LOGINDB"

string sqlStr = "Select * from USER";

//利用构造函数,创建DataAdapter

SqlDataAdapter da = new SqlDataAdapter(sqlStr,strConnect);

//创建DataSet

DataSet ds = new DataSet();

//填充,第一个参数是要填充的dataset对象,第二个参数是填充datasetdatatable

Da.Fill(ds, "USER");

//以下代码将更新DataSet里的数据

//DataSet里的名为"USER"DataTable里添加一个用于描述行记录的DataRow对象

DataRow dr = ds.Tables["USER"].NewRow();

//通过DataRow对象添加一条记录

dr["USERID"] = "ID2";

dr["USERNAME"] = "TOM";

ds.Table["USER"].Rows.Add(dr);

//更新到数据库里

SqlCommandBuilder scb = new SqlCommandBuilder(da);

da.update(ds, "USER");

在上述代码里,首先使用DataAdapter填充DataSet对象,然后通过DataRow对象,向 DataSet添加一条记录,最后使用DataSetupdate方法将添加的记录提交到数据库中。执行完update语句,数据库USER中就多了一条USERIDID2USERNAMETOM的记录。

此外,上述代码出现的SqlCommandBuilder对象用来对数据表进行操作。用了这个对象,就不必再繁琐地使用DataAdapterUpdataCommand属性来执行更新操作。

<think>好的,用户想了解如何在C#使用SqlDataReader以及相关的例子。首先,我需要回忆一下SqlDataReader的基本概念和用途。SqlDataReader是用于从数据库高效读取数据的类,属于ADO.NET的一部分,通常和SqlCommand配合使用。它提供只进、只读的数据流,适合处理大量数据。 接下来,用户可能需要基本的示例代码。我应该先写一个简单的查询流程,包括连接数据库、执行命令、读取数据。要注意使用using语句来正确管理资源,比如SqlConnection、SqlCommand和SqlDataReader本身,避免资源泄露。代码中需要包含异常处理的建议,但可能不需要在示例中写全,可以提到使用try-catch块。 然后,用户可能关心常见问题,比如如何读取特定类型的列,处理空值。需要提到GetString、GetInt32等方法,以及IsDBNull的检查。比如,如果数据库中的某个字段可能为NULL,必须先检查IsDBNull再读取,否则会抛出异常。 另外,多个结果集的处理可能也是一个问题。SqlDataReader的NextResult方法可以切换到下一个结果集,比如执行存储过程返回多个结果时,需要遍历每个结果集。 还要注意性能方面的最佳实践,比如及时关闭DataReader,不要在读取期间长时间占用连接。可能提到使用ExecuteReader的参数,比如CommandBehavior.CloseConnection来自动关闭连接。 引用部分需要结合提供的参考资料。引用[2]提到数据提供程序是连接应用和数据源的桥梁,所以可以在介绍SqlDataReader时引用。引用[4]关于数据库连接管理,可以在强调资源释放和using语句时引用。引用[3]关于代码格式,可能不需要直接引用,但示例代码需要保持清晰结构。 用户可能的问题还包括异常处理、参数化查询防止SQL注入,以及如何处理大数据量。需要分点说明,确保每个问题都有解决方案或示例。 最后,生成的相关问题要覆盖常见的使用场景和问题,比如读取不同类型数据、处理空值、性能优化、连接管理,以及异常处理等。确保问题对用户进一步学习有帮助。</think>### C# SqlDataReader 使用指南 SqlDataReader 是用于高效读取 SQL Server 数据库数据的**只进流式读取器**,具有以下核心特性: 1. 仅支持顺序访问,不可回退 2. 读取时保持数据库连接 3. 适合大数据量场景(内存效率高) #### 基础用法(含完整示例) ```csharp using (SqlConnection connection = new SqlConnection("Your_Connection_String")) { connection.Open(); using (SqlCommand command = new SqlCommand("SELECT Id, Name FROM Users WHERE Age > @age", connection)) { command.Parameters.AddWithValue("@age", 18); using (SqlDataReader reader = command.ExecuteReader()) { while (reader.Read()) { int userId = reader.GetInt32(0); string userName = reader.GetString(1); Console.WriteLine($"User ID: {userId}, Name: {userName}"); } } } } ``` *关键点说明:* - `using` 语句确保资源自动释放[^4] - 参数化查询防止 SQL 注入 - 列索引可通过`reader.GetOrdinal("ColumnName")`获取 #### 常见问题解决方案 1. **空值处理** ```csharp if (!reader.IsDBNull(reader.GetOrdinal("BirthDate"))) { DateTime birthDate = reader.GetDateTime(reader.GetOrdinal("BirthDate")); } ``` 2. **类型安全读取** ```csharp decimal salary = reader.GetDecimal(reader.GetOrdinal("Salary")); // 替代危险写法:decimal salary = (decimal)reader["Salary"]; ``` 3. **多结果集处理** ```csharp do { while (reader.Read()) { // 处理第一个结果集 } } while (reader.NextResult()); // 切换到下一个结果集 ``` #### 性能优化建议 - 优先使用`GetXXX()`方法而非索引器`reader["ColumnName"]` - 设置`CommandBehavior.CloseConnection`自动关闭连接 ```csharp command.ExecuteReader(CommandBehavior.CloseConnection); ``` - 批量数据操作时保持连接开放(避免反复开关连接)[^2] #### 典型应用场景 1. 数据导出时的流式读取 2. 报表生成中的大数据处理 3. 实时数据监控系统
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值