//先定义ADO.NET对象
SqlConnection con = new SqlConnection(connectionString);
SqlCommand cmd = new SqlCommand(selectSQL, con);
SqlDataAdapter adapter = new SqlDataAdapter(cmd);DataSet dsPubs = new DataSet();    (*)con.Open();
adapter.Fill(dsPubs, "Students");       //填充 DataSet最后在下拉列表框中定义入如下事件:
protected void DropDownList1_SelectedIndexChanged(……)
{
     DataRow[] arrRow = dsPubs.Tables["Students"].Select("ID=" + DropDownList1.SelectedItem.Value);
     …………
}如果(*)式没有写的话,在下拉列表框中选中相应的选项则可以从数据库中得到信息,并在Label标签中显示,但是如果定义了DataSet数据集dsPubs,则此时提示未将对象引用设置到对象的实例我想问的是,为什么预先定义和让系统自动定义数据集会产生这样的差别?

解决方案 »

  1.   

    DataSet dsPubs 先要实例化
    未将对象引用设置到对象的实例
    单步看看那个值为null
      

  2.   

    没有DataSet dsPubs = new DataSet(); (*)的话应该是编译错误吧。
      

  3.   

    回 1楼:
    adapter.Fill(dsPubs, "Students"); //填充 DataSet
    这个Fill 方法不是已经填充了吗,为什么还会是null回 2楼:
    如果你自己不预定义,系统会帮忙创建一个数据集,然后DataTable放进去的,编译不会报错。
    可以试试。
      

  4.   

    DataAdapter 对象提供一个名为 Fill 的方法,使用该方法可以把从数据库中获取的数据填充到 DataSet 对象中。
    adapter.Fill(dsPubs, "Students"); //填充 DataSet
    adapter 为 Dataadapter 对象的一个实例,调用方法 Fill 把从数据库中获得的数据填充到 DataSet 对象的实例 dsPubs 中的一个名为Students的表中出现这两种情况,假使预先定义则出现对象引用为空,如果由系统定义则对象引用为正常。这让我有点疑惑到底是 Fill 方法出现的问题 还是 DataSet 出了什么问题,后台数据库已经多次测试没有问题,然后
    string str="ID=" + DropDownList1.SelectedItem.Value
    Label1.Text=str;
    测试也会跳出正常的值,到底是哪里出错了导致这两种方法出现不同的结果?
      

  5.   

    回 5楼:
    加了判断条件还是不行。
    if (DropDownList1.SelectedValue != null){
       DataRow[] arrRow = dsPubs.Tables["Students"].Select("ID=" + DropDownList1.SelectedItem.Value);
     }
      

  6.   

    其实我是放在try块里面的,然后再catch块里面捕捉异常,所以没有这个判断条件也没多大关系。
      

  7.   

    DataSet dsPubs = new DataSet(); 
    con.Open();
    adapter.Fill(dsPubs); //填充 DataSet
    最后在下拉列表框中定义入如下事件:
    protected void DropDownList1_SelectedIndexChanged(……)
    {
      DataRow[] arrRow = dsPubs.Tables[0].Select("ID=" +  DropDownList1.SelectedItem.Value);
    }
      

  8.   

    哎,都用Linq了。。老土的人飘过!
      

  9.   

    没有表0 其实还是原先那个问题
    确认
    DataSet dsPubs = new DataSet(); (*)
    con.Open();
    adapter.Fill(dsPubs, "Students"); //填充 DataSet
    在下拉框事件protected void DropDownList1_SelectedIndexChanged之前执行
      

  10.   

    回 12 楼
    con.Open();
    adapter.Fill(dsPubs, "Students"); //填充 DataSet
    这个是在页面加载就已经进行填充了,所以肯定在下拉框事件之前执行啊。回 11楼

      

  11.   

    DataSet dsPubs = new DataSet(); (*)
    adapter.Fill(dsPubs, "Students"); //填充 DataSet
    仔细看看有问题DataSet dsPubs = new DataSet(); (*) 
    dsPubs 为NUll
    adapter.Fill(dsPubs, "Students"); //填充 DataSet
    再向 dsPubs 的 Students表添加数据 有问题。dsPubs 里面什么时候有Students表啦
    DataSet dsPubs;
    adapter.Fill(dsPubs, "Students"); 
     
      

  12.   

    DataSet dsPubs = new DataSet();
    DataTable Students = new DataTable();
    如果我这样再实例化一个名为"Students"的数据表之后在使用Fill方法来填充,还是现实未将对象引用设置到对象的实例化,也就是说还是空
      

  13.   

    应该是你页面回发后  dsPubs 为 null or dsPubs.Tables["Students"] 为 null 造成的
      

  14.   

    数据的填充过程一般都是在if(!this.ispostback){……}过程中进行的,所以页面回发不会造成空值啊。如果是页面回发造成的该怎么解决呢?
      

  15.   


    if(!this.ispostback){……}是你第一次加载页面才进入这个判断
    刷新后为null
      

  16.   


    去掉这个判断后,还是null。
    一般这里都不会出什么问题的。
    数据绑定后如果数据本身不发生任何变化,那么只需要向客户端发送一次即可。
      

  17.   

    DataRow[] arrRow = dsPubs.Tables["Students"].Select("ID=" + DropDownList1.SelectedItem.Value);会不会有可能是这个Select方法有什么问题呢?因为我的数据表中的ID值是唯一的主键,也就是说只需要一个DataRow的实例就可以存储所选定的记录。在下面的显示过程中到没有什么问题,因为
                        StringBuilder sb = new StringBuilder();
                        sb.Append("<b>");
                        sb.Append(arrRow[0]["ID"].ToString());
    是这样子来存储它的,因为始终只有一条记录。我想问的,还有没有其他方法来取指定索引的值,一定要用select方法吗?
      

  18.   

    调试一下,肯定没传进去值或者取值null