查资料说DataAdatpter更新数据的时候必须设置InsertCommand,UpdateCommand,DeleteCommand,但是我今天测试程序的时候,发现不用设置上面三个命令对象,DataAdapter也能够更新数据,因为我查看DataAdapter的这三个命令对象都是 null.
今天想查看InsertCommand的原因是DataAdapter已经执行过CommandBuider,以为他能够自动创建插入命令对象:
//设置SelectCommand            
string sql = "Select * from " + tableName + " where 1<>1";
            sda = new SQLiteDataAdapter();
            cmd = new SQLiteCommand(sql, cn);
            sda.SelectCommand = cmd;            SQLiteCommandBuilder cb = new SQLiteCommandBuilder(sda);
            cmd.Transaction = tran;            DataSet ds = new DataSet();
            sda.Fill(ds, tableName);
。。
DataRow dr=ds.Tables[0].NewRow();
dr[0]=1000;
dr[1]="aaa";
ds.Tables[0].Rows.Add(dr);
int count=sda.Update(ds,tableName );//在这里检查,InsertCommand==null;
//检查,count==1没有 InsertCommand,为啥也能够更新数据???

解决方案 »

  1.   

    你是怎么检查的?你用了CommandBuilder就会自动生成InsertCommand,UpdateCommand……
      

  2.   

    int count=sda.Update(ds,tableName );//在这里检查,InsertCommand==null; 
    //检查:sda.InsertCommand=null;
    我都不相信啊,但的确如此。
      

  3.   


     同意你使用了CommandBuilder生成command 之后,DataAdatpter.InsertCommand等不会存在你在调用DataAdatpter.update时,方法内部会处理的实在不相信就把
    SQLiteCommandBuilder cb = new SQLiteCommandBuilder(sda); 
    这句删除,看还能插入数据不
      

  4.   

    SQLCommandBuilder作用 自动生成Command
      

  5.   

    SqlDataAdapter里面有InsertCommand,UpdateCommand,DeleteCommand就可以使用SqlCommandBuilder   自动生成,而不需要自己去写
      

  6.   

    SqlDataAdapter 不会自动生成实现 DataSet 的更改与关联的 SQL Server 实例之间的协调所需的 Transact-SQL 语句。但是,如果设置了 SqlDataAdapter 的 SelectCommand 属性,则可以创建一个 SqlCommandBuilder 对象来自动生成用于单表更新的 Transact-SQL 语句。然后,SqlCommandBuilder 将生成其他任何未设置的 Transact-SQL 语句。每当设置了 DataAdapter 属性,SqlCommandBuilder 就将其本身注册为 RowUpdating 事件的侦听器。一次只能将一个 SqlDataAdapter 与一个 SqlCommandBuilder 对象(或相反)互相关联。为了生成 INSERT、UPDATE 或 DELETE 语句,SqlCommandBuilder 会自动使用 SelectCommand 属性来检索所需的元数据集。如果在检索到元数据后(例如在第一次更新后)更改 SelectCommand,则应调用 RefreshSchema 方法来更新元数据。
      

  7.   

    经过测试,必须要有CommandBuilder,才可以执行DataAdapter.Update(),但哪位大虾能够解释下为啥执行过CommandBuilder后获取不到DataAdapter.InsertCommand 呢?
      

  8.   

    你用了SQLCommandBuilder他.会帮你生成insert,update,delete等command的SQLiteCommandBuilder cb = new SQLiteCommandBuilder(sda); 
      

  9.   


    CommandBuilder会根据你的sql语句去生成delete,insert,update等command.
      

  10.   

    而必须注意的一点是.在使用SqlCommandBuilder生成update,delete,insert等command时
    SelectCommand 必须至少返回一个主键列或唯一的列,否则是生成不了上述三个命令的.
      

  11.   

    问下各位大侠!小弟用存储过程实现OleDbDataAdapter.Fill()就不能使用DataApter.update(),但用SQL就可以,这是为什么?
      

  12.   

    我在更新的时候是先删除一列,然后再添加一列的 dt.rows.removeat(i);dt.rows.add(dr);adapter.update();异常,数据不唯一了,因为我有联合主键的