源码是这样的~
SqlCommandBuilder myBuilder=null;
myBuilder=new SqlCommandBuilder(myAdapter);
myAdapter.UpdateCommand=myBuilder.GetUpdateCommand();
myAdapter.InsertCommand=myBuilder.GetInsertCommand();
myAdapter.DeleteCommand=myBuilder.GetDeleteCommand();myAdapter.Update(myDataSet,"Employees");前面对DataTable进行了~一写增加删除操作~最后进行数据内容同步的时候~出现下面的错误提示:
异常详细信息: System.InvalidOperationException: 对于不返回任何键列信息的 SelectCommand 不支持 UpdateCommand 的动态 SQL 生成。请问:这是什么原因引起的~???怎么解决???

解决方案 »

  1.   

    在百度搜索的
    -----------------------用SqlCommandBuilder更新DataSet,遇到“对于不返回任何键列信息的 SelectCommand 不支持 UpdateCommand 的动态 SQL 生成”问题,关键代码如下(C#):........
    string emailSql="select email,validFlag from emailMe";
    DataSet emailAdd=new DataSet();
    SqlDataAdapter emailAdapter=new SqlDataAdapter(emailSql,myConn);
    SqlCommandBuilder cb=new SqlCommandBuilder(emailAdapter);
    emailAdapter.Fill(emailAdd,"address");
    myConn.Close();
    ......//修改myDs数据
    emailAdapter.Update(emailAdd,"address");emailMe的结构是这样的:
    email nvarchar 100
    validFlag int运行这段代码,竟然出现了“对于不返回任何键列信息的 SelectCommand 不支持 UpdateCommand 的动态 SQL 生成”错误。想了一下,是因为emailMe表中没有定义主键字段,所以SqlCommandBuilder无法为SqlDataAdapter自动生成需要的UpdateCommand。修改表的定义,将email字段定义为主键问题当然可以解决,但是因为库里表太多了,逐一修改几乎不可能,有没有其他办法呢?
    在网上搜了一下,发现有位网名“蓝色理想”的朋友给出了一个解决方案(http://www.blueidea.com/tech/program/2004/1761.asp),赶紧试一下:
    ........
    string emailSql="select email,validFlag from emailMe";
    DataSet emailAdd=new DataSet();
    SqlDataAdapter emailAdapter=new SqlDataAdapter(emailSql,myConn);
    SqlCommandBuilder cb=new SqlCommandBuilder(emailAdapter);
    emailAdapter.Fill(emailAdd,"address");
    myConn.Close();
    DataTable myDt=emailAdd.Tables["address"];
    myDt.PrimaryKey=new DataColumn[]{myDt.Columns["email"]};
    ......//修改myDs数据
    emailAdapter.Update(emailAdd,"address");结果还是同样的问题!不知道是为什么(还在继续研究中)。无奈翻阅MSDN,发现了定义UpdateCommand的方法,结果,问题就是这样解决的:........
    string emailSql="select email,validFlag from emailMe";
    DataSet emailAdd=new DataSet();
    SqlDataAdapter emailAdapter=new SqlDataAdapter(emailSql,myConn);
    SqlCommandBuilder cb=new SqlCommandBuilder(emailAdapter);
    SqlCommand upCmd=new SqlCommand("update ["+strTableName+"] set validFlag=@validFlag where emai 
      

  2.   

    我已经找到解决办法了~原来~在select里面~把主键的字段加进去之后就可以了~结贴