先上代码:
public class DBO
{
        public DataSet ds;
        private OracleConnection conn;
        private OracleDataAdapter da;        public DBO()
        {
            try
            {
                ds = new DataSet();
                conn = new OracleConnection("ConnectionString");
                if (conn.State == ConnectionState.Closed)
                {
                    conn.Open();
                }
                da = new OracleDataAdapter("SELECT * FROM TableName", conn);
                da_directory.Fill(ds);
                ds.Tables[0].TableName = "TableName";
                conn.Close();
            }
            catch (Exception ex)
            {
                if (conn.State == ConnectionState.Open)
                {
                    conn.Close();
                }
            }
        }        public int UpdateDB()
        {
            try
            {
                if (conn.State == ConnectionState.Closed)
                {
                    conn.Open();
                }
                OracleCommandBuilder builder = new OracleCommandBuilder(da);
                da.InsertCommand = builder.GetInsertCommand();
                da.DeleteCommand = builder.GetDeleteCommand();
                da.UpdateCommand = builder.GetUpdateCommand();
                int result = da.Update(ds.Tables["TableName"]);
                conn.Close();
                return result;
            }
            catch (Exception ex)
            {
                if (conn.State == ConnectionState.Open)
                {
                    conn.Close();
                }
                throw ex;
            }
        }
}业务层调用后,修改了ds中的数据,断点跟踪发现在da.Update(ds.Tables["TableName"])执行之前,修改的结果还在,执行也不报错,就是数据库中的数据没有更新。

解决方案 »

  1.   

                    da.InsertCommand = builder.GetInsertCommand();
                    da.DeleteCommand = builder.GetDeleteCommand();
                    da.UpdateCommand = builder.GetUpdateCommand();                if (conn.State == ConnectionState.Closed)
                    {
                        conn.Open();
                    }conn.Close();
    这个几行是多余的,可以不写数据表是否有主键
      

  2.   

    有主键。
    我都是把数据取回来处理,最后一次更新来减少访问数据库的次数,所以必须更新整张表。
    如果da.InsertCommand = builder.GetInsertCommand()这种代码不必要,那还有什么方法能给da指定Insert、Update、Delete命令呢?
      

  3.   

    就是说  你的 result 为 0 了?把try catch 去掉  看下
    另外 Oracle  在Update 后  是不是应该  commit 下呢???
      

  4.   

    对,result为0
    try catch取消,无效。
    commit是DataAdapter的方法么?找不到啊
      

  5.   

    有人这样用过ds和da么?
    是不是这样用的,代码修改ds的数据,用da更新?
      

  6.   

    DataTable的主键好像没有。如 
    DataColumn[] keys = new DataColumn[1];
                keys[0] = dtDetail.Columns["pk_OrderDetail"];
                dtDetail.PrimaryKey = keys;
    试试看。
      

  7.   

    主键是从库里带出来的。
    是不是用代码直接修改ds.Tables[].Rows[][]这样做是错的?
      

  8.   

    找到了!
    业务层调用DBO的时候,每次修改完都多写了一个dbo.AcceptChanges(),这样没有更新数据库,但所有的行都变成了“UnChanged”……
    折腾了一下午就因为这个……晕倒了……
    谢谢大家,结帖!