C#中SqlDataReader和SqlDataAdapter的区别

本文对比了SQLDataReader和SqlDataAdapter在.NET中的使用方法及注意事项。介绍了如何通过这两种方式读取数据库中的数据,并展示了具体的代码实现。同时,还强调了它们在数据处理方面的不同特性。

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

它们都是用于读取数据,在数据库中创建一张表,并插入一些数据,看看怎么获得这2个对象并使用

	CREATE TABLE TEST1
    (
    	Column1 VARCHAR(20),
    	Column2 VARCHAR(20),
    	Column3 VARCHAR(20)
    )
    INSERT INTO TEST1(Column1,Column2,Column3) VALUES('1','2','3')
    INSERT INTO TEST1(Column1,Column2,Column3) VALUES('11','22','33')
    INSERT INTO TEST1(Column1,Column2,Column3) VALUES('111','222','333')
	static void Main(string[] args)
    {
        SqlConnection sqlConnection = new SqlConnection("Server=.;user=sa;pwd=find/-perm4000;database=DBTEST");
        SqlCommand sqlCommand = new SqlCommand("SELECT * FROM TEST1", sqlConnection);
        sqlConnection.Open();
        SqlDataReader sqlDataReader=sqlCommand.ExecuteReader();
        int count = sqlDataReader.FieldCount;
        //获取字段名
        for(int i=0;i<count;i++)
        {
            Console.Write(sqlDataReader.GetName(i)+"\t");
        }
        Console.WriteLine();
        //获取字段值
        while (sqlDataReader.Read())
        {
            for(int i=0;i<count;i++)
            { 
                Console.Write(sqlDataReader.GetString(i)+"\t");
            }
            Console.WriteLine();
        }
        //读取完成需要手动Close,若不关闭可能会引发异常
        sqlDataReader.Close();
        sqlConnection.Close();
        Console.Read();
    }

在这里插入图片描述

    static void Main(string[] args)
    {
        SqlConnection sqlConnection = new SqlConnection("Server=.;user=sa;pwd=find/-perm4000;database=DBTEST");
        SqlCommand sqlCommand = new SqlCommand("SELECT * FROM TEST1", sqlConnection);
        sqlConnection.Open();
        SqlDataAdapter sqlDataAdapter = new SqlDataAdapter(sqlCommand);
        DataSet dataSet = new DataSet();
        sqlDataAdapter.Fill(dataSet);
        DataTable dataTable = dataSet.Tables[0];
        //获取列数
        int columnCount = dataTable.Columns.Count;
        //获取行数
        int rowCount = dataTable.Rows.Count;
        //打印列名
        for(int i=0;i<columnCount;i++)
        {
            Console.Write(dataTable.Columns[i].Caption+"\t");
        }
        Console.WriteLine();
        //打印内容
        for(int i=0;i<rowCount;i++)
        {
            for(int j=0;j<columnCount;j++)
            {
                Console.Write(dataTable.Rows[i][j] + "\t");
            }
            Console.WriteLine();
        }
        Console.Read();
        }

在这里插入图片描述
可以看出,结果是一样的,但用法上SqlDataAdapter看上去好像更复杂点,再说下使用上SqlDataReader和SqlDataAdapter需要注意的地方。
(1)SqlDataReader会一直占用SqlConnection,每次只会读取一行数据,只能向前读取,且没有提供修改其内容的API;SqlDataAdapter一次将结果集放入内存,以DataTable或DataSet接收,可精准定位到行列并可修改(改的是内存里的数据,不会反映到数据库)
(2)同一个SqlDataReader对象在调用Close之前只能接收一个SqlCommand;DataSet可执行多个SqlCommand

    static void Main(string[] args)
    {
        SqlConnection sqlConnection = new SqlConnection("Server=.;user=sa;pwd=find/-perm4000;database=DBTEST");
        SqlCommand sqlCommand = new SqlCommand("SELECT * FROM TEST1", sqlConnection);
        sqlConnection.Open();
        SqlDataReader sqlDataReader = sqlCommand.ExecuteReader();
        SqlCommand sqlCommand2 = new SqlCommand("SELECT * FROM TEST1", sqlConnection);
        sqlDataReader = sqlCommand.ExecuteReader();
    }

在这里插入图片描述

(3)从以上2个特点说明中可以看出SqlDataAdapter功能比SqlDataReader强大的多,所以SqlDataAdapter在实际业务中更加广泛的应用,但功能强大也意味着资源消耗更多,所以看实际情况作出最合适的选择(不过就目前的硬件发展水平,一般业务场景基本不可能达到硬件瓶颈,所以软件编程怎么方便怎么来就行了)

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值