1 public YH(string yh_nc) 2 { 3 SqlConnection conn = HelperDB.GetConn(); 4 conn.Open(); 5 6 string sql = "select * from YH where YH_NC='"+ yh_nc+"'"; 7 8 SqlCommand cmmd = HelperDB.GetCommand(); 9 cmmd.CommandText = sql; 10 cmmd.Connection = conn; 11 SqlDataReader reader = cmmd.ExecuteReader(); 12 13 if (reader.Read()) 14 {
reader["YH_NC"];//编译错误 15 _YH_ID = Convert.ToInt32( reader["YH_ID"]); 16 _YH_MM = reader["YH_MM"].ToString(); 17 _YH_NC = yh_nc; 18 _YH_XB = reader["YH_XB"].ToString(); 19 } 20 conn.Close(); 21 reader.Close(); 22 }
上面是YH(用户)这个类的一个构造函数,我的疑问是reader.Read()的返回值是bool类型的,那么reader[ ]是一个什么过程呢?为什么reader["YH_ID"];获得的是object类型呢?reader不是返回的是bool类型吗?怎么又出来的object类型呢?请大侠指教!另外为什么reader["YH_NC"]就是错的呢?
SqlDataReader reader = cmmd.ExecuteReader();
这是将读取到的数据放到reader,reader是SqlDataReader类型,
reader.Read()是前进到下一条记录,如果下一条数据没有了则将本条数据读取并且返回flase,如果有就一直到读取完为止。
reader["name"]从reader对象中读取这一行列名为name的数据,也可以是下标,
reader["YH_ID"]返回object是你数据库里面读取出来的值总不可能全是char类型吧,只能object能接受所有数据类型
reader["YH_NC"]错误是因为这个有返回值,而你又没有设置另一个参数来接收它。
reader["YH_NC"]错误是因为这个有返回值,而你又没有设置另一个参数来接收它。
reader本身是SqlDataReader类型的变量,不是方法,怎么会是返回值呢?
@寒江蓑立: 你看清楚,不是reader有返回值,而是reader的Read()方法有返回值,他是读取下一条数据返回bool值,
reader["YH_NC"]错误是因为这个有返回值,而你又没有设置另一个参数来接收它:
reader["YH_NC"]返回的是object类型,没有参数接受肯定会出错比如下面有一个方法返回值是String类型:你在Main函数里面调用这个方法,如果这样调用就会出错:
GetValue();
必须要这样调用:
string s=GetValue();
就是说你调用有返回值的方法,必须用一个与这个方法返回类型相同的对象去接收它。
public string GetValue()
{
string str="abcd";
return str;
}
@临窗观景: 你大概没有明白我的疑惑:这里的Reader()是方法有返回值我明白的,问题在reader这个变量
“不是reader有返回值,而是reader的Read()方法有返回值”
就如你所说reader的Read方法有返回值,这个方法的调用,我明白的,所以用了if(reader.Read())这样的结构。但是这个是Read方法的事情,而reader只是个变量,SqlDataReader类型的变量,既然是变量就不涉及方法调用要有返回值这一说了。那么reader["YH_NC"]这样的用法又是一个什么过程呢?
@寒江蓑立: ExecuteReader()返回的是SqlDataReader类型的一个集合reader,reader是一个集合。“SqlDataReader类型的变量,既然是变量就不涉及方法调用要有返回值这一说了”,reader是SqlDataReader的对象,它的结果是ExecuteReader()返回值,是一个集合,并是单一的变量。不是这样的变量:int i;
Main()
{
// d也是一个变量,但是它是一个集合,接收的值是Get方法返回的一个结果集
IDictionary<string, object> d = per.Get();
string s=d["name"].ToString();//在这里有返回值你不用参数去接收你学得会不会出错
}
static class per{
public static IDictionary<string, object> Get()
{
IDictionary<string, object> dic= new Dictionary<string, object>();
dic["name"]="User";
return dic;
}
}
@临窗观景: 谢谢你的耐心解答,貌似明白了一些,还要继续解惑呀。我可以SqlDataReader reader;声明这个变量,他为什么和int i不一样呢?reader是个集合,是存放了读到的所有数据的集合吗?
@寒江蓑立: 集合和int肯定不一样,集合存放的是键值对,reader存放的是当前读取的所有行的数据,保存的形式是以 [行][列]方式保存在这个集合里面的,所以读取的时候通过循环每次读取一行,在循环里面读取当前行的指定列的数据。
你不能指望给索引器指定不动类型的返回值吧。所以这是语法规则。