首页 新闻 会员 周边 捐助

关于SqlDataReader reader读到的值与Read方法返回值

0
悬赏园豆:15 [已解决问题] 解决于 2014-05-08 00:11
 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"]就是错的呢?

寒江蓑立的主页 寒江蓑立 | 初学一级 | 园豆:155
提问于:2014-04-12 23:49
< >
分享
最佳答案
0

SqlDataReader reader = cmmd.ExecuteReader();

这是将读取到的数据放到reader,reader是SqlDataReader类型,

reader.Read()是前进到下一条记录,如果下一条数据没有了则将本条数据读取并且返回flase,如果有就一直到读取完为止。

reader["name"]从reader对象中读取这一行列名为name的数据,也可以是下标,

reader["YH_ID"]返回object是你数据库里面读取出来的值总不可能全是char类型吧,只能object能接受所有数据类型

reader["YH_NC"]错误是因为这个有返回值,而你又没有设置另一个参数来接收它。

收获园豆:15
落一叶而知秋 | 菜鸟二级 |园豆:219 | 2014-04-13 00:23

reader["YH_NC"]错误是因为这个有返回值,而你又没有设置另一个参数来接收它。

reader本身是SqlDataReader类型的变量,不是方法,怎么会是返回值呢?

寒江蓑立 | 园豆:155 (初学一级) | 2014-04-13 10:16

@寒江蓑立: 你看清楚,不是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;

}

落一叶而知秋 | 园豆:219 (菜鸟二级) | 2014-04-13 13:20

@临窗观景: 你大概没有明白我的疑惑:这里的Reader()是方法有返回值我明白的,问题在reader这个变量

“不是reader有返回值,而是reader的Read()方法有返回值”

    就如你所说reader的Read方法有返回值,这个方法的调用,我明白的,所以用了if(reader.Read())这样的结构。但是这个是Read方法的事情,而reader只是个变量,SqlDataReader类型的变量,既然是变量就不涉及方法调用要有返回值这一说了。那么reader["YH_NC"]这样的用法又是一个什么过程呢?

寒江蓑立 | 园豆:155 (初学一级) | 2014-04-13 15:58

@寒江蓑立: 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;

}

}

落一叶而知秋 | 园豆:219 (菜鸟二级) | 2014-04-13 18:48

@临窗观景: 谢谢你的耐心解答,貌似明白了一些,还要继续解惑呀。我可以SqlDataReader reader;声明这个变量,他为什么和int i不一样呢?reader是个集合,是存放了读到的所有数据的集合吗?

寒江蓑立 | 园豆:155 (初学一级) | 2014-04-20 20:29

@寒江蓑立: 集合和int肯定不一样,集合存放的是键值对,reader存放的是当前读取的所有行的数据,保存的形式是以 [行][列]方式保存在这个集合里面的,所以读取的时候通过循环每次读取一行,在循环里面读取当前行的指定列的数据。

落一叶而知秋 | 园豆:219 (菜鸟二级) | 2014-05-02 15:39
其他回答(1)
0

你不能指望给索引器指定不动类型的返回值吧。所以这是语法规则。

幻天芒 | 园豆:37207 (高人七级) | 2014-04-14 00:25
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册