string cnStr = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\DB1.MDB";
            OleDbConnection cn = new OleDbConnection(cnStr);
            cn.Open();
            OleDbCommand Cmd = new OleDbCommand("Select * From 表1", cn);
            OleDbDataAdapter myAdapter = new OleDbDataAdapter();
            myAdapter.SelectCommand = Cmd;
            OleDbCommandBuilder cb = new OleDbCommandBuilder(myAdapter);
            DataSet ds = new DataSet();
            myAdapter.Fill(ds, "表1");            listView1.Clear();
            listView1.View = View.Details;
            listView1.GridLines = true;
            DataColumn cl1 = new DataColumn();
            DataTable dt = new DataTable();
            dt.PrimaryKey = new DataColumn[] { dt.Columns["品名"] };
            foreach (DataColumn cl in ds.Tables["表1"].Columns)
            {
                listView1.Columns.Add(cl.ColumnName, 80, HorizontalAlignment.Left);
            }            //DataSet ds = new DataSet();
            DataRow dr1 = ds.Tables["表1"].NewRow();
            dr1[0] = "1";
            dr1[1] = "2";
            dr1[2] = "3";
            dr1[3] = "4";
            ds.Tables["表1"].Rows.Add(dr1);            int i = 0;
            string[] r = new string[4];
            foreach (DataRow dr in ds.Tables["表1"].Rows)
            {
                r[0] = dr[0].ToString();
                r[1] = dr[1].ToString();
                r[2] = dr[2].ToString();
                r[3] = dr[3].ToString();
                listView1.Items.Add(r[0]);
                listView1.Items[i].SubItems.Add(r[1]);
                listView1.Items[i].SubItems.Add(r[2]);
                listView1.Items[i].SubItems.Add(r[3]);
                i += 1;
            }
            myAdapter.Update(ds, "表1");
            cn.Close();我的数据库是有主键的.

解决方案 »

  1.   

    是不是少了一行cb.GetUpdateCommand()
      

  2.   

     ds.GetChanges(DataRowState.Modified);
                    this.sqlDataAdapter1.Update(ds, tablename); 用这个
    如果是绑定的话这个可以
      

  3.   

    加上FillSchema试试,例子如下:// Create an instance of a DataSet, and retrieve data from the Authors table.
    DataSet dsPubs = new DataSet("Pubs");
    daAuthors.FillSchema(dsPubs,SchemaType.Source, "Authors");
    daAuthors.Fill(dsPubs,"Authors");
      

  4.   

    回wj_kathy:应该不是绑定,绑定不是要用DATAGIRD嘛,我没用那个.回liwei428123:这只是一个普通的WIN应用程序
      

  5.   

    这是我以前写的,SQL Server的,你改一下,看看可以不可以
    private void DataSetUpdate(string Datatablename, string sqlstr)
            {
                try
                {
                    SqlDataAdapter adapter = new SqlDataAdapter(sqlstr, new SqlConnection(SqlHelper.ConnectionString));                SqlCommandBuilder cmdBuilder = new SqlCommandBuilder(adapter);                adapter.DeleteCommand = new SqlCommand("", new SqlConnection(SqlHelper.ConnectionString));
                    adapter.InsertCommand = new SqlCommand("", new SqlConnection(SqlHelper.ConnectionString));
                    adapter.UpdateCommand = new SqlCommand("", new SqlConnection(SqlHelper.ConnectionString));
                    adapter.SelectCommand = new SqlCommand(sqlstr, new SqlConnection(SqlHelper.ConnectionString));                adapter.DeleteCommand = cmdBuilder.GetDeleteCommand();
                    adapter.InsertCommand = cmdBuilder.GetInsertCommand();
                    adapter.UpdateCommand = cmdBuilder.GetUpdateCommand();
                    adapter.Update(ds, Datatablename);
                }
                catch (Exception ex)
                {
                    throw ex;
                }
            }
      

  6.   

    你的myAdapter没有UpdateCommand,怎么更新?一群人连这个小问题都看不出来..真是的...
      

  7.   

    老大! OleDbCommandBuilder   cb   =   new   OleDbCommandBuilder(myAdapter); 
    ,这个会根据你的查询语句,自动生成更新逻辑!不需要单独写updatecommand的!
      

  8.   

    看看你的数据库是否看的准确
    Data   Source= ¦DataDirectory ¦\DB1.MDB "; 
    //看的和代码操作的是否是同一目录下的数据库
    程序貌似没看出问题来
      

  9.   

    楼上的老大,你的cb是赋值了,但似乎没有用过cb哦,按道理编译器也会警告的啊.这个问题都看不出?
      

  10.   

    myAdapter.Update(ds,   "表1 "); 
    默认调用,updatecommand方法
    这方法这根新dataset中更新的数据,即datatype=update的。
    1,你要么跟新数据
    2,要么你改变dataset中数据的状态
    3,不知道你要实现什么功能?(批量导入更新最好用,sqlbulkcopy,)
      

  11.   

    显示在LISTVIEW也是添加了一行"1","2","3","4"的
    就是用OFFICE打开的时候看不到新的数据.
      

  12.   

    调用update()更新时,需要只对单个表进行操作,同时需要有主键方可。
      

  13.   

    http://blog.csdn.net/guyehanxinlei/archive/2007/06/25/1665876.aspx
      

  14.   

    对于存在主键的表可以使用SqlCommandBuilder,会根据selectcommand自动创建更新,删除等sql语句;如果表中不存在主键,需手动创建更新,删除,插入语句。
    呵呵,数据库不知道怎么做
      

  15.   

                string cnStr = @"Provider=SQLOLEDB;Data Source=159.99.249.78;Persist Security Info=True;User ID=sa;password = sa;Initial Catalog=Northwind"; 
                OleDbConnection   cn   =   new   OleDbConnection(cnStr); 
                cn.Open(); 
                OleDbCommand   Cmd   =   new   OleDbCommand( "Select   *   From   orders ",   cn); 
                OleDbDataAdapter   myAdapter   =   new   OleDbDataAdapter(); 
                myAdapter.SelectCommand   =   Cmd; 
                OleDbCommandBuilder   cb   =   new   OleDbCommandBuilder(myAdapter); 
                DataSet   ds   =   new   DataSet(); 
                myAdapter.Fill(ds,   "orders");
                //ds.AcceptChanges();            foreach(DataRow drI in ds.Tables["orders"].Rows )
                {
                    if (drI["ShippedDate"].ToString() == "")
                        continue;
                    drI["ShippedDate"] = Convert.ToDateTime(drI["ShippedDate"]).AddMinutes(3);
                }            int i = myAdapter.Update(ds, "orders"); 
                cn.Close(); 以上这段代码运行成功.结果正确.
    LZ请比较一下.
    另外,注意ACCESS文件需要是可写的.