今天在用SqlDataReader 读取记录时,出现了如下提示:Invalid attempt to read when no data is present.
出现错误点:Response.Write(dr.GetValue(1).ToString() + "<br/>");
原因是在执行这条语句前未用:dr.Read()
参考资料:
存储过程在数据库开发中非常有用,而在开发ASP.NET网页时,也经常需要使用到存储过程。今天自己初学使用存储过程,有一点自己的心得。
设计一个最简单的查询存储过程,设数据库中有表Customer,表中有字段CustomerEmail和CustomerName,输入一个CustomerEmail,查找并打印CustomerEmail和Customer。
1)查询分析器中建立存储过程
create procedure GetProcedure
(@CustomerEmail varchar(50))
as
select * from Customer where CustomerEmail=@CustomerEmail
2) private void btnCommit_Click(object sender, System.EventArgs e)
{
string CustomerEmail=this.txtCustomerID.Text;
Customer c=new Customer();
SqlConnection con=DB.createCon();
SqlCommand cmd=new SqlCommand();
SqlParameter para=new SqlParameter("@CustomerEmail",SqlDbType.VarChar,50);
para.Value=CustomerEmail;
SqlDataReader sdr;
cmd.Connection=con;
cmd.CommandType=CommandType.StoredProcedure;
cmd.CommandText="GetProcedure";
cmd.Parameters.Add(para);
con.Open();
// sdr=cmd.ExecuteScalar();
sdr=cmd.ExecuteReader();
sdr.Read();
con.Close();
c.CustomerEmail=sdr.GetString(0);
c.CustomerName=sdr.GetString(1);
Response.Write(c.CustomerEmail);
Response.Write("<br>");
Response.Write(c.CustomerName);
}
注意几点:
1)引入命名空间 using System.Data,否则 SqlDbType.VarChar无用。
2)执行完cmd.ExecuteReader()后还需要执行sdr.Read(),否则会提示在"c.CustomerEmail=sdr.GetString(0);"
部分有错误Invalid attempt to read when no data is present。用Read方法会定位到第一个结果集的第一条记录。
3)不能使用sdr=cmd.ExecuteScalar();ExecuteScalar方法主要返回结果集中的首行首列,由于它只能返回一个值,通常可以利用它来获取聚合值,例如:Int32 rows=(Int32)cmd.ExecuteScalar();