使用DBMS:Sql Server2012
关于DataTable与DataAdapter对数据库进行操作,MSDN上给出了很明确的解释:
当 DataAdapter 遇到对 DataRow 所做的更改时,它将使用 InsertCommand、UpdateCommand 或 DeleteCommand 来处理该更改。 这样,您就可以通过在设计时指定命令语法并在可能时通过使用存储过程来尽量提高 ADO.NET 应用程序的性能。 在调用 Update 之前,必须显式设置这些命令。 如果调用了 Update 但不存在用于特定更新的相应命令(例如,不存在用于已删除行的 DeleteCommand),则会引发异常。
有以下两种方法:
1. 建立SqlAdapter后通过Fill填充进相关DataTable,然后在DataTable上进行数据操作,最后通过SqlCommandBuilder“自动”建立所需要的SqlCommand对象。这种方法比较便捷。
SqlConnection conn = new SqlConnection(connString); String selectString = "select * from student_table"; SqlDataAdapter sdAdapter = new SqlDataAdapter(selectString,conn); //建立DataAdapter与DataSet、DataTable之间的关系 DataSet ds = new DataSet(); DataTable dt1 = new DataTable(); sdAdapter.Fill(ds,"t_table"); dt1 = ds.Tables["t_table"]; //向DataTable中添加新的DataRow,类似于进行Insert操作 DataRow row = dt1.NewRow(); row["name"] = name; row["school"] = school; dt1.Rows.Add(row); //关键的一步 new SqlCommandBuilder(sdAdapter); try{ //将DataTable中的变化返回给数据库 sdAdapter.Update(ds,"t_table"); } catch (InvalidOperationException){ MessageBox.Show("error!"); }2.第二种即自己显式地定义各个方法,这种方法需要对 SqlParameter中各个参数有所了解。
SqlCommand icmd = new SqlCommand("insert into student_table values (@NAME,@SCHOOL)", conn); SqlParameter pname = new SqlParameter("@NAME", SqlDbType.NChar, 10, "name"); SqlParameter pschool = new SqlParameter("@SCHOOL", SqlDbType.NChar, 10, "school"); icmd.Parameters.Add(pname); icmd.Parameters.Add(pschool); sdAdapter.InsertCommand = icmd; SqlCommand dcmd = new SqlCommand("delete student_table where name = @NAME and school = @SCHOOL", conn); dcmd.Parameters.Add("@NAME", SqlDbType.Char, 12, "name"); dcmd.Parameters.Add("@SCHOOL", SqlDbType.Char, 12, "school"); sdAdapter.DeleteCommand = dcmd; SqlCommand ucmd = new SqlCommand("update set school = @SCHOOL where name = @NAME", conn); ucmd.Parameters.Add("@NAME", SqlDbType.Char, 12, "name"); ucmd.Parameters.Add("@SCHOOL", SqlDbType.Char, 12, "school"); sdAdapter.UpdateCommand = ucmd;还有任何问题欢迎和我交流。