一.创建SqlCommand对象的方法
1.cmd=new SqlCommand(); //直接创建
cmd.Connection=cn;
cmd.CommandText=strSQL;
2.cmd=new SqlCommand(strSQL,cn); //调用构造函数创建
3.cmd=cn.CreateCommand(); //使用SqlConnectiion对象的CreateCommand方法
cmd.CommandText=strSQL;
二.执行查询 (基于SqlDataReader的操作方式)
cmd.ExecuteReader() //返回一个SqlDataReader
读取方法:
A.读取几列值
SqlDataReader rdr=cmd.ExecuteReader();
while (rdr.Read())
Console.WriteLin(“{0} {1} {2:d},rdr[“OrderID”],rdr[“CustomerID”],rdr[“OrderDate”]”); //当存在可用列时,只需要调用SqlDataReader的索引器,并传递列的名称。SqlDataReader使用一般Object数据类型返回列的内容。
rdr.Close();
B.读取单一值
SqlDataReader rdr=cmd.ExecuteReader();
rdr.Read();
decimal decOrderTotal=(decimal)rdr[0]; //rdr[0] 表示检查第一行第一列的数据
以上语句可以用一句语句代替:
decimal decOrderTotal=(decimal)cmd.ExecuteScalar();
2.执行不返回结果集的查询
cmd.ExecuteNonQuery()
可根据ExecuteNonQuery()方法的返回值来判断执行的结果。
3.其它
使用Using块
using (SqlCommand cmd=new SqlCommand(strSQL,cn))
{
try{
using (SqlDatareader rdr=cmd.ExecuteReader())
{
while(rdr.read())
{ …}
}
}
}
基于序号
int intcustomerIDOrdinal=rdr.GetOrdinal(“CustomerID”);
rdr[intcustomerIDOrdinal];
强类型getter
int intcustomerIDOrdinal=rdr.GetOrdinal(“CustomerID”);
rdr.GetString(intcustomerIDOrdinal)
应当总是使用适当的强类型getter,它们与结果集中列所返回的数据相对应,如果不能确定调用哪种类型getter,可以调用GetFieldType方法,传递需要的列的序号为参数。
处理Null值
在处理字符串内容之前,需确定该字符串已被初始化。
如果一个列的数据库值为Null,并且调用SqlDataReader的一个强类型getter(返回一个.NET数据类型如String,DataTime,Int32)则会产生一个SqlNullValueException.
string str;
if(str==null)
空值出错提醒
else
intLength=str.Length;
如果正在从一个可能包含Null值的列中获取数据,请在尝试访问前检查其值。
使用isDBNull方法(只接受一个表示列序号的整数)
while (rdr.Read())
{
order=new Order()
order.OrderID=rdr.GetInt32(0);
…
if(rdr.IsDBNull(3))
order.ShippedDate=null;
else
order.ShippedDate=rdr.GetDateTime(3);
}