日期:2014-05-20  浏览次数:21027 次

C# 关于数据库dateset的问题
我的数据库用的是access,名称叫做Notes,里面有一个tip表.第一列是no自动编号,第二列是state (0或1)
但是listview的第一列是state 第二列是no(因为只有listview只有第一列才能显示图片)
程序执行的时候点添加的时候数据库里面的数据添加了,但是程序却弹出错误:
 未处理的“System.IndexOutOfRangeException”类型的异常出现在 System.Data.dll 中。
其他信息: 在位置 0 处没有任何行。

各位高手你们说到底我错在哪里了阿?

C# code
private void Button1_Click(object sender, EventArgs e)  //鼠标点击事件添加
        {
            Product p = new Product();
            p.State = 0;
            p.Createtime = DateTime.Now;
            int no = insert(p);
            p = getById(no);      //这里面的get.ById(no)里面有错        
            AddProduct(p);            
        }

public static getById(int no)
        {
            string sql = "select * from tip where no=?";
            OleDbParameter[] parameters = new OleDbParameter[1];
            parameters[0] = new OleDbParameter("@no", OleDbType.Integer);
            parameters[0].Value = no;
            DataSet ds = AccessDBUtil.ExecuteQuery(sql, parameters);
            return Row2Product(ds.Tables["ds"].Rows[0]);      //执行时这里显示错误,在位置0处没有發現任何行
        }

//执行查询语句,返回dataset
        public static DataSet ExecuteQuery(string sql, OleDbParameter[] parameters)
        {
            String connectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Notes.mdb";
            OleDbConnection connection = new OleDbConnection(connectionString)
            DataSet ds = new DataSet();
            connection.Open();
            OleDbDataAdapter da = new OleDbDataAdapter(sql, connection);
            da.SelectCommand.Parameters.AddRange(parameters);
            da.Fill(ds, "ds");
            return ds;
        }
 //------------------------------------下面的应该不是很重要-----------------------------------------------

    //product类
    public class Product
    {
        private int no;
        private int state;
        public Product()
        {
        }
        public int No
        {
            get { return no; }
            set { no = value; }
        }

        public int State
        {
            get { return state; }
            set { state = value; }
        }
   }

   //添加到listview
   private void AddProduct(Product p)
        {
            ListViewItem lvi;
            if(p.State==0)       //如果等于0就用第一副图片,等于1就用第二副图片
                lvi = this.listView1.Items.Add("",0);
            else
                lvi = this.listView1.Items.Add("",1);
            lvi.SubItems.Add(p.No.ToString());
         }



------解决方案--------------------
探讨
引用:
select * from tip where no=?
这个语句可能没有查询到数据.
你先确定是否查询出来了记录.
改成这个试试看return Row2Product(ds.Tables[0].Rows[0]);

这个错误的提示是说索引越界,也就是说Rows[0]不存在.
应该是没查到数据.



楼上的,我试过你说这条语句,也是错误.
但是我觉得我的sql语句应该没问题把~怎么会查不到呢?

------解决方案--------------------
1)查看insert,看no是多少?
2查看数据库,看no
如果二者不一致,或者数据不在数据库中,说明insert过程错误,检查insert

3)查看GetbyId,在执行查询前,看参数值是多少,传进去了没有?
4)先得到DataTable,然后查看行数,如果得到Table有误,应该是查询语句的问题,如果不是,看行数是多少,如果是0
而数据库中又有,就如楼上说参数传递形式的问题了。不过我用过的,用”?“是可以的。你可以改成连接
字符串的形式看看。
------解决方案--------------------
字段名称过于简单? 你改复杂点试试 比如 t_no
------解决方案--------------------
你可以直接在调试模式下点出dataset来看的。watch中添加对应dataset变量,然后可以在右边看到放大镜一样的图标点击就可弹出对应的dataset图形浏览界面