ADONET提供了Connection来连接数据库同时也提供了Command对象来查询数据库同Connection对象一样Command也有两种OleDbCommand和SqlCommand其区别同Connection对象
要操纵数据库必须先使用Connection来连接到数据库再创建一个Command来查询有几种创建方式例
SqlCommand cmd
string strCon=server=localhostdatabase=NorthwindTrusted_Connection=Yesstring strqry=select * from CategoriesSqlConnection con=new SqlConnection(strCon)conOpen()cmd=conCreateCommand() //这里使用用Connection对象的CreateCommand方法来创建一个Command对象
cmdCommandText=strqry// SqlDataReader reader=cmdExecuteReader()
cmd=new SqlCommand() //直接使用new 关键字来创建cmdCommandText=strqrycmdConnection=con //设置与数据库的连接
cmd=new SqlCommand(strqrycon)//直接在new的时候带两个参数来创建
执行方式
(主要有这么几种cmdExecuteReader()cmdExecuteNonQuery()cmdExecuteScalar()cmdExecuteXmlReader())
1ExecuteReader()返回一个SqlDataReader对象或OleDbDataReader对象这个看你的程序的需要去做可以通过这个对象来检查查询结果它提供了游水式的执行方式即从结果中读取一行之后移动到另一行则前一行就无法再用有一点要注意的是执行之后要等到手动去调用Read()方法之后DataReader对象才会移动到结果集的第一行同时此方法也返回一个Bool值表明下一行是否可用返回True则可用返回False则到达结果集末尾
使用DataReader可以提高执行效率有两种方式可以提高代码的性能一种是基于序号的查找一个是使用适当的Get方法来查找因为查询出来的结果一般都不会改变除非再次改动查询语句因此可以通过定位列的位置来查找记录用这种方法有一个问题就是可能知道一列的名称而不知道其所在的位置这个问题的解决方案是通过调用DataReader 对象的GetOrdinal()方法此方法接收一个列名并返回此列名所在的列号例
int id=readerGetOrdinal(CategoryName)while(readerRead())
{ ResponseWrite(reader[id])} readerClose()
至于第二种方式很直观例
while(readerRead())
{ ResponseWrite(readerGetInt()ToString()+ +readerGetString()ToString()+ <br>)}
DataReader的GetInt()和GetString()通过接收一个列号来返回一个列的值这两种是最常用的其中还有很多其它的类型
(注DataReader对象在调用Close()方法即关闭与数据库的连接如果在没有关闭之前又重新打开第二个连接则会产生一条异常信息)
ExecuteNonQuery() 这个方法并不返回一个DataReader对象而是返回一个int类型的值即在执行之后在数据库中所影响的行数
例
int affectrows=cmdExecuteNonQuery()ResponseWrite(affectrows + 条记录受影响)
ExecuteScalar() 这个方法不接受任何参数仅仅返回查询结果集中的第一行第一列而忽略了其它的行和列而且返回的是一个object类型在使用之前必须先将它强制转换为所需类型如果返回的仅仅是一个单独的数据元则可以使用此方法来提高代码的性能例
string strCon=server=localhostdatabase=NorthwindTrusted_Connection=Yesstring strqry=select count(*) from CategoriesSqlConnection con=new SqlConnection(strCon)conOpen()SqlCommand cmd=conCreateCommand()int i=ConvertToInt(cmdExecuteScalar())//必须强制转换
ExecuteXmlReader() 此方法用于XML操作返回一个XmlReader对象由于系统默认没有引用 SystemXml名空间因此在使用前必须前引入例
string strCon=server=localhostdatabase=NorthwindTrusted_Connection=YesSqlConnection con=new SqlConnection(strCon)conOpen()SqlCommand cmd = new SqlCommand(select * from Categories FOR XML AUTO XMLDATA con)XmlReader xr=cmdExecuteXmlReader()ResponseWrite(xrAttributeCount)//这里获取当前节点上的属性个数
xrClose()
执行完毕之后照样要显式地调用Close()方法否则会抛出异常
使用参数化的查询
先看一段SQL语句select CategoryIDDescription from Categories where CategoryID=? 其中的问号就是一个参数但在使用的时候必须是带有@前缀的命名参数因为NET数据提供程序不支持这个通用的参数标记?使用参数化的查询可以大大地简化编程而且执行效率也比直接查询字符串要高也更方便很多情况下都需要更改查询字符串这种方式就提供了方便只需更改参数的值即可例
string strCon=server=localhostdatabase=NorthwindTrusted_Connection=YesSqlConnection con=new SqlConnection(strCon)conOpen()string strqry=select * from Categories where CategoryID=@CategoryID//带参数的查询SqlCommand cmd=new SqlCommand(strqrycon)cmdParametersAdd(@CategoryIDSqlDbTypeInt)//给参数赋于同数据库中相同的类型cmdParameters[@CategoryID]Value=//给参数赋值可灵活改变SqlDataReader r=cmdExecuteReader()while(rRead())
{ ResponseWrite(rGetString()+<br>)//取出指定参数列的值} conClose()//切记关闭
使用存储过程进行查询