//SqlCommandBuilder 为 SqlDataAdapter 提供 update、insert、delete 命令(自己利用select命令自动从数据库元数据推断) //select命令必须包含主键(SqlCommandBuilder 自己去推断其他的三个命令) //推断完成后,不需要对SqlDataAdapter的三个命令进行赋值(当然赋值也行,但是在赋值之前,显示空异常) private void button8_Click(object sender, EventArgs e) { SqlConnection sqlCon = new SqlConnection(connectionString_da2017); //SqlDataAdapter 自动建立数据库和DataSet的关系 SqlDataAdapter sqlDa = new SqlDataAdapter("select * from test ", sqlCon); SqlCommandBuilder sqlcb = new SqlCommandBuilder(sqlDa); DataSet sqlds = new DataSet(); sqlDa.Fill(sqlds); // 数据库数据 DataTable databaseData = sqlds.Tables[0]; DataRow dr = databaseData.NewRow(); dr[0] = "0"; //自增的id 此句话无效 dr[1] = "1235"; dr[2] = "ABCg"; databaseData.Rows.Add(dr); //SqlCommandBuilder 为 SqlDataAdapter 提供 update、insert、delete 命令(自己利用select命令自动从数据库元数据推断) //select 命令必须包含键列信息 //如果直接访问sqlDa.InsertCommand.CommandText 则显示空异常 //MessageBox.Show(sqlDa.InsertCommand.CommandText); //但是如果 手动给他赋值,又多次一举(效果是相同的) //sqlDa.InsertCommand = sqlcb.GetInsertCommand(); sqlDa.Update(databaseData); //MessageBox.Show(sqlcb.GetDeleteCommand().CommandText); //MessageBox.Show(sqlcb.GetInsertCommand().CommandText); // MessageBox.Show(sqlcb.GetUpdateCommand().CommandText); //DELETE FROM [test] WHERE (([id] = @p1) AND ((@p2 = 1 AND [val1] IS NULL) OR ([val1] = @p3)) AND ((@p4 = 1 AND [val2] IS NULL) OR ([val2] = @p5))) //INSERT INTO [test] ([val1], [val2]) VALUES (@p1, @p2) //UPDATE [test] SET [val1] = @p1, [val2] = @p2 WHERE (([id] = @p3) AND ((@p4 = 1 AND [val1] IS NULL) OR ([val1] = @p5)) AND ((@p6 = 1 AND [val2] IS NULL) OR ([val2] = @p7))) }