读书人

C# 关于数据库dateset的有关问题

发布时间: 2011-12-19 23:23:36 作者: rapoo

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图形浏览界面

读书人网 >C#

热点推荐