ADO.NET基础2

本文介绍了 ADO.NET 中 SqlCommand 的 ExecuteScalar 方法及 SqlDataReader 的使用技巧,包括如何执行 SQL 查询、处理参数化查询、利用连接池提升性能等内容。

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

ExecuteScalar方法

SqlCommandExecuteScalar方法用于执行查询,并返回查询所返回的结果集中第一行的第一列因为不能确定返回值的类型,所以返回值是object类型//ExecuteScalar()方法内部也是调用ExecuteReader()实现的。
cmd.CommandText= "select count(*) from student";  int i =Convert.ToInt32(cmd.ExecuteScalar());
cmd.CommandText= "select getdate() "; DateTime dt =Convert.ToDateTime(cmd.ExecuteScalar());
得到自动增长字段的主键值,在values关键词前加上output inserted.Id,其中Id为主键字段名。执行结果就试插入的主键值,用ExecuteScalar执行最方便。(output语句使用的是inserteddeleted两个临时表)
cmd.CommandText=“insert  into  class(cName,cDescription)output inserted.classId  values (‘高三一班’,‘描述’)”;
int i= Convert.ToInt32(cmd.ExecuteScalar());

执行查询SqlDataReader

执行有多行结果集的用ExecuteReader
HasRow属性返回是否有行

SqlDataReader reader =cmd.ExecuteReader();...

while(reader.Read())

{      Console.WriteLine(reader.GetString(1));

}

readerGetStringGetInt32等方法只接受整数参数,也就是序号,用GetOrdinal方法根据列名动态得到序号
更简单的方法reader[‘uUserName’]
为什么用usingClose:关闭以后还能打开。Dispose:直接销毁,不能再次使用。using在出了作用域以后调用DisposeSqlConnection SqlDataReader等的Dispose内部都会做这样的判断:判断有没有close,如果没有Close就先CloseDispose
DataReader必须独享一个Connection(除非设置了允许MARS,多活动结果集,在连接字符串中)

当使用DataReader的时候必须保证ConnectionOpen状态
reader只读(不能通过reader修改数据。)、只进
reader每次读取一条就释放一条所以只能向前不能后退
由于功能有限,所以读取速度很快,适合从数据库中读取大量数据
使用reader根据列索引读取列数据而不是列名
使用强类型的GetString()GetInt32GetFloat()GetDouble()….
数据库中的类型与C#的不太一样,数据库中的float,得用c#GetDouble()来获取。
IsDbNull()
如果返回多个结果集则用NextResult()方法。通过do-while循环测试。

ADO.NET连接池
ado.net默认启用了连接池
l如何清空连接池?Connection的静态方法ClearAllPools()ClearPool()
string constr = "Data Source=.;Initial Catalog=Itcastcn;Integrated Security=True;<span style="color:#ff0000;">Pooling=true</span>";//pooling为true连接池开启,为false连接池关闭
            Stopwatch watch = new Stopwatch();
            watch.Start();
            for (int i = 0; i < 1000; i++)
            {
                using (SqlConnection con = new SqlConnection(constr))
                {
                    con.Open();
                    con.Close();
                }
            }
            watch.Stop();
            Console.WriteLine(watch.Elapsed);
            Console.ReadKey();
上面代码可以看出开启连接池速度变快

Ado.net连接池使用总结:
1.第一次打开连接会创建一个连接对象。
2.当这个连接关闭时(调用Close()方法时)会将当前那个连接对象放入池中。
3.下一个连接对象,如果连接字符串与池中现有连接对象的连接字符串完全一致,则会使用池中的现有连接,而不会重新创建一个。
4.只有对象调用Close(),的时候才会放入池中,如果一个连接对象一直在使用,则下次再创建一个连接对象发现池中没有,也会再创建一个新连接对象。
在池中的连接对象,如果过一段时间没有被访问则自动销毁。

查询参数

SQL语句使用@UserName表示“此处用参数代替”,向SqlCommandParameters中添加参数
cmd.CommandText= "select * from [user] where uUserName=@UserName anduPwd=@Password";
cmd.Parameters.Add(newSqlParameter(“@ UserName ","admin"));
cmd.Parameters.Add(newSqlParameter(“@ Password ",password));
参数SQLServer内部不是简单的字符串替换,SQLServer直接用添加的值进行数据比较,因此不会有注入漏洞攻击。(带参数的sql语句内部是调用了存储过程)
SQL Server仅支持已命名参数@arg1,OledbOdbc仅支持通用参数标记(?),不同数据提供程序对参数的写法可能不同。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值