ExecuteScalar方法
SqlCommand的ExecuteScalar方法用于执行查询,并返回查询所返回的结果集中第一行的第一列,因为不能确定返回值的类型,所以返回值是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语句使用的是inserted、deleted两个临时表)
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));
}
reader的GetString、GetInt32等方法只接受整数参数,也就是序号,用GetOrdinal方法根据列名动态得到序号
更简单的方法reader[‘uUserName’]
为什么用using。Close:关闭以后还能打开。Dispose:直接销毁,不能再次使用。using在出了作用域以后调用Dispose,SqlConnection、
SqlDataReader等的Dispose内部都会做这样的判断:判断有没有close,如果没有Close就先Close再Dispose。
DataReader必须独享一个Connection。(除非设置了允许MARS,多活动结果集,在连接字符串中)
当使用DataReader的时候必须保证Connection为Open状态。
reader只读(不能通过reader修改数据。)、只进
reader每次读取一条就释放一条所以只能向前不能后退
由于功能有限,所以读取速度很快,适合从数据库中读取大量数据
使用reader根据列索引读取列数据而不是列名
使用强类型的GetString()、GetInt32、GetFloat()、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表示“此处用参数代替”,向SqlCommand的Parameters中添加参数
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,而Oledb、Odbc仅支持通用参数标记(?),不同数据提供程序对参数的写法可能不同。