namespace 教程上的数据连接访问例子
{
    public partial class Form2 : Form
    {
        public Form2()
        {
            InitializeComponent();
        }       private void Form2_Load(object sender, EventArgs e)
        {
            SqlConnection thisconnection = new SqlConnection(@"Data  Source=PC2010041617aem;InitialCatalog=phonebook;Integrated Security=True;Pooling=False");
            thisconnection.Open();//连接数据库,并打开            SqlDataAdapter thisadapter = new SqlDataAdapter("select * from maintele",thisconnection);            SqlCommandBuilder thisbuilder = new SqlCommandBuilder(thisadapter);            DataSet thisdataset = new DataSet();            thisadapter.Fill(thisdataset,"maintele");
            label1.Text = Convert.ToString(thisdataset.Tables["maintele"].Rows[3]["tele"]);            thisdataset.Tables["maintele"].Rows[3]["tele"] = "18978952645";
           thisadapter.Update(thisdataset, "maintele");
         /*上面这句报错“对于不返回任何键列信息的 SelectCommand,不支持 UpdateCommand 的动态 SQL 生成。”
           这是什么原因*/
            label2.Text = Convert.ToString(thisdataset.Tables["maintele"].Rows[3]["tele"]);
            thisconnection.Close();}
    }
}

解决方案 »

  1.   

    设置主键,包含主键列
    使用SqlCommandBuilder自动生成DataAdapter
    为了支持自动生成,指定的SelectCommand必须包含主键或唯一性列。 如果没有无法生成InsertCommand,UpdateCommand,和DeleteCommand,并会抛出InvalidOperation异常。   
      

  2.   

    http://support.microsoft.com/kb/308507/zh-cn
    的 代码示例 1:自动生成的命令说明
      

  3.   

    sqlDataAdapter必须设置好更新逻辑,才可以Updated:
    1、手工设置Insert、Update、Delete命令
    2、拖一个SqlDataAdapter到窗体上,用向导生成Update逻辑
    3、用SqlCommandBuilder来自动生成:
    SqlCommandBuilder sqlCmBuilder=new SqlCommandBuilder(sqlDa);
    使用这个方法要注意,用SqlCommandBuilder自动生成更新逻辑后,如果修改SqlDataAdapter的SelectCommand,会有问题。